我正在使用图书馆(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());
}
});
答案 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时非常有用 当前缩放/滚动位置。- 允许用户点击照片时通知应用程序。