项目使用ViewPager+ImageView实现照片预览和切换,在开发过程遇到手势冲突问题。
解决方案:
修改ViewPager事件,返回False使得子View能收到所有事件
public class ZoomViewPager extends ViewPager {
public ZoomViewPager(Context context) {
super(context);
}
public ZoomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return false;
// return super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
return false;
// return super.onTouchEvent(ev);
}
}
子View拦截事件分发
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
//手势分发
mGestureDetector.onTouchEvent(event);
//返回True,拦截事件
return true;
}
子View滑动事件判断
在手势GestureDetector.SimpleOnGestureListener()中,
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if ((e1.getX() - e2.getX()) >= scale) {
//自定义下一页回调
mZoomaleListener.onNext();
}
if ((e2.getX() - e1.getX()) >= scale) {
//自定义上一页回调
mZoomaleListener.onLast();
}
return super.onFling(e1, e2, velocityX, velocityY);
}
最后在ViewPager中Adapter,子View实现回调接口
displayHolder.displayImage.setOnZoomableListener(new ZoomableDraweeView.OnZoomableListener() {
@Override
public void onNext() {
LogUtil.i("onNext");
if ((position + 1) <= getCount()) {
//加载下一页
viewPager.setCurrentItem(position + 1);
}
}
@Override
public void onLast() {
LogUtil.i("onLast");
if ((position - 1) >= 0) {
//加载上一页
viewPager.setCurrentItem(position - 1);
}
}
});