无法弄清楚如何使用ImageViewTouch挂钩

时间:2014-07-24 23:25:05

标签: android android-fragments

我正在使用图书馆(https://github.com/sephiroth74/ImageViewZoom),但我在试图找出投掷方面遇到了问题。我已经阅读了其他答案,但他们没有显示用于获取投掷事件的实际代码。

我已经像这样迷上了这样的事件:

 mImage.setOnTouchListener(new OnTouchListener()
 {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
      return gestureDetector.onTouchEvent(event);
 }
 });
 gestureDetector = new GestureDetector(this, new MyGestureDetector(getApplicationContext(), this));

MyGestureDetector扩展了SimpleOnGestureListener。然后我重写onFling方法。

这种方法的问题在于它禁用了1次触摸,因此禁用了平移功能。我确信有一种更好的方式来挂钩事件(所以我可以改变图像),但我不确定如何-newb :(

我正在寻找的方法是将其挂钩,类似于ImageViewZoom提供的其他钩子。像这样:

         mImage = (ImageViewTouch) view.findViewById(R.id.image);
    mImage.setOnClickListener(this);

    // set the default image display type
    mImage.setDisplayType( ImageViewTouchBase.DisplayType.FIT_TO_SCREEN );

    mImage.setSingleTapListener( new ImageViewTouch.OnImageViewTouchSingleTapListener()
    {
        @Override
        public void onSingleTapConfirmed()
        {
            Log.d(TAG, "onSingleTapConfirmed");
            setToolbarsVisible(!isToolbarsVisible());
        }
    });

2 个答案:

答案 0 :(得分:9)

注意:我自己没有对此进行测试/编码,因此可能无法开箱即用。

我检查了ImageViewTouch的源代码 - 它在内部使用SimpleOnGestureListener来提供各种基于手势的功能(包括单击和双击挂钩)。它没有为fling事件提供回调。所以,你必须自己编写代码。首先定义一个新界面,例如OnImageViewTouchFlingEventListener内外的ImageViewTouch.java。例如,在ImageViewTouch.java的第320行之后定义它:

public interface OnImageViewTouchFlingEventListener {

    // Can be defined as `void onFlingEvent(boolean left)` ==> if left==true, user
    // flinged `left-to-right`, else `right-to-left`. Similarly, you can
    // modify the parameters to add checks for up-to-down and down-to-up.
    void onFingEvent();
}

接下来,在第31行之后将成员添加到ImageViewTouch.java

private OnImageViewTouchFlingEventListener mFlingEventListener;

在第64行之后添加一个公共方法来初始化mFlingEventListener

public void setFlingEventListener( OnImageViewTouchFlingEventListener listener ) {
    mFlingEventListener = listener;
}

ImageViewTouch.java的第261行:方法onFling(.....)定义了ImageView对fling事件的反应。首先,检查您是否同意当前的功能。例如,您提到您希望fling事件更改图像。如果您查看第266行,如果当前比例为1,则fling事件将不执行任何操作 - 它只返回false。

ImageView如何处理(以及在什么情况下)是您需要决定的事情。比如说,您决定只有在比例为one时才会改变图像 - 否则,它将会平移。然后对第266行的以下修改应该有效:

if (getScale() == 1f) {
    if (mFlingEventListener != null) {
        mFlingEventListener.onFlingEvent();
        return true;
    }
}

在您的代码中,当您在ImageViewTouch上设置OnTouchListener时,它会超越ImageViewTouch内部触摸/手势处理所提供的所有触控功能 - 因此无需单击/双击回调。这就是为什么你不能在ImageViewTouch.java之外实现fling事件回调 - 好吧,你可以 - 但是,你需要实现其他所有其他手势

您的活动代码更改:

需要初始化成员mFlingEventListener

mImage.setFlingEventListener(new ImageViewTouch.OnImageViewTouchFlingEventListener() {
    @Override
    public void onFlingEvent() {
        Log.d(TAG, "onFlingEvent fired");
        // handle change of image
    }
});    

答案 1 :(得分:0)

这可能不是您正在寻找的答案,但我会尝试一下。如果您没有义务使用您当前使用的库,我想推荐这个library,这是我迄今为止发现的最好的可缩放图像视图解决方案。它具有以下功能:

  

功能

     
      
  • 开箱即用,使用多点触控和双击。
  •   
  • 滚动,滚动平滑。
  •   
  • 在滚动父级(例如ViewPager)中使用时,可以正常工作。
  •   
  • 允许在显示的Matrix更改时通知应用程序。当您需要根据
    更新UI时非常有用   当前缩放/滚动位置。
  •   
  • 允许用户点击照片时通知应用程序。
  •