Android如何同时使用GestureDetector与Zoomy实现双击检测和图片缩放功能
冲突原因
该问题由Android系统的触摸事件分发机制导致:
- View的
setOnTouchListener方法是覆盖逻辑,后设置的监听器会直接覆盖之前已设置的监听器,导致先配置的功能接收不到任何触摸事件 - 即便你能让两个监听器都拿到事件,若其中一个处理器消费了事件(返回
true),另一个处理器也无法接收到后续的事件流,导致功能异常
解决方案
将两个功能的事件处理逻辑合并到同一个自定义触摸监听器中,统一分发触摸事件,不要让两个逻辑分别独立绑定监听器,具体实现如下:
- 首先正常初始化双击检测器,无需先给ImageView设置触摸监听器
- 初始化Zoomy,之后给ImageView设置自定义的统一触摸监听器,在监听器中依次将事件分发给双击检测器和Zoomy处理
- 最终返回两个处理器返回值的逻辑或,保证事件正常消费
实现代码
// 初始化Zoomy,正常注册即可 Zoomy.Builder builder = new Zoomy.Builder(mActivity).target(holder.image); builder.register(); // 给ImageView设置统一的触摸监听器 holder.image.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // 先将事件传递给双击检测器处理 boolean isDoubleTapConsumed = holder.myDoubleTapDetector.onTouchEvent(event); // 再将事件传递给Zoomy处理 boolean isZoomyConsumed = Zoomy.onTouchEvent(holder.image, event); // 只要有一个处理器需要消费事件就返回true,否则返回false return isDoubleTapConsumed || isZoomyConsumed; } });
注意事项
- 不要拦截任何事件序列,从
ACTION_DOWN到ACTION_UP的所有事件都要完整传递给两个处理器,否则会出现手势识别异常 - 若你使用的Zoomy版本没有公开
Zoomy.onTouchEvent方法,也可以先获取Zoomy绑定的监听器实例,在自定义监听器中手动调用它的onTouch方法即可
内容的提问来源于stack exchange,提问作者lukasniessen
相关产品推荐
相关产品推荐

