Android Can';我不知道如何使用ImageViewTouch钩住fling

Android Can';我不知道如何使用ImageViewTouch钩住fling,android,android-fragments,Android,Android Fragments,我正在使用库(),但我在尝试找出fling时遇到了问题。我已经阅读了其他答案,但它们没有显示用于获取fling事件的实际代码 我已经迷上了这样的狂欢活动: mImage.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return gestureDetector.onTouchEvent(even

我正在使用库(),但我在尝试找出fling时遇到了问题。我已经阅读了其他答案,但它们没有显示用于获取fling事件的实际代码

我已经迷上了这样的狂欢活动:

 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扩展了SimpleGestureListener。然后重写onFling方法

这种方法的问题在于,它禁用了1触,因此禁用了平移功能。我相信有更好的方法来连接fling事件(因此我可以更改图像),但我不确定如何-新手:(

我要寻找的是一种与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());
        }
    });

注意:我自己还没有测试/编码这个,所以它可能无法开箱即用

我检查了
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对fling的作用方式(以及在什么情况下)是您需要决定的。例如,您决定fling仅在比例为1时更改图像-否则,它将平移。然后,对第266行的以下修改应起作用:

if (getScale() == 1f) {
    if (mFlingEventListener != null) {
        mFlingEventListener.onFlingEvent();
        return true;
    }
}
在您的代码中,当您在ImageViewTouch上设置一个
OnTouchListener
时,它超越了ImageViewTouch内部触摸/手势处理提供的所有触摸功能-因此没有单/双点击回调。这就是为什么您不能在ImageViewTouch.java之外实现fling事件回调的原因-当然,您可以-但是,您需要im请用其他的手势也打褶

对活动代码的更改:

需要初始化成员
mFlingEventListener

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

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

特征
  • 使用多点触摸和双击进行开箱即用的缩放
  • 滚动,与平滑滚动投掷
  • 在滚动父对象(如ViewPager)中使用时,效果非常理想
  • 允许在显示的矩阵发生更改时通知应用程序。适用于需要基于更新用户界面的情况
    当前缩放/滚动位置
  • 允许在用户点击照片时通知应用程序

回答得很好。我正朝着这个方向前进,但我希望我错过了一些东西,可以在不修改ImageViewTouch代码的情况下实现我想要的功能。我认为这些更改应该放回原始库中。再次…回答得很好!!!感谢你这么彻底。你能看看我的另一个问题吗ty?@JustLearning再次感谢您的客气话。我查阅了关于您的另一个问题的相关源代码。似乎不可能将操作栏从片段更改为覆盖。看看我发布的替代解决方案是否对您有所帮助。