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

我正在使用库( 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触摸,因此泛function。 我敢肯定,有一个更好的方法钩入投掷事件(所以我可以改变图像),但我不知道如何 – 新增:(

我正在寻找的是一种钩子类似于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()); } }); 

注:我自己没有testing/编码,所以它可能无法正常工作。

我检查了ImageViewTouch的源代码 – 它在内部使用SimpleOnGestureListener来提供各种基于手势的function(包括单击和双击钩子)。 它提供对于投掷事件的callback。 所以,你将不得不自己编码。 首先定义一个新的接口,比如说OnImageViewTouchFlingEventListener内部/外部的OnImageViewTouchFlingEventListener 。 例如,在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如何对onFling(.....)事件做出反应。 首先,检查你是否同意当前的function。 举个例子,你提到你想要使用这个工具来改变图像。 如果你看第266行,如果当前比例是1,那么投掷事件将不会执行任何操作 – 它只是返回false。

ImageView如何处理(以及在什么情况下)是您需要决定的。 比方说,你决定只有当比例是one时才会改变图像,否则就会泛起来。 然后对266行进行以下修改应该工作:

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

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

更改您的活动代码:

成员mFlingEventListener需要被初始化:

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

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

特征

  • 开箱缩放,使用多点触摸和双击。
  • 滚动,平滑的滚动投掷。
  • 在滚动父级(如ViewPager)中使用时使用完美。
  • 允许在显示的matrix发生变化时通知应用程序。 当你需要更新你的用户界面的时候很有用
    当前缩放/滚动位置。
  • 允许应用程序在用户点击照片时得到通知。