首先获得父控件
private ViewParent mViewParent;
/** * 获得父控件 * * @return */ private ViewGroup getScrollableParent() { View target = this; while (true) { View parent; try { parent = (View) target.getParent(); } catch (Exception e) { return null; } if (parent == null) return null; if (parent instanceof ViewGroup) { return (ViewGroup) parent; } target = parent; } }通过onDoubleTab函数 得到图片当前的状态(是否是放大的状态)
private boolean imgState = false;//图片状态 false: 没有放大 true: 已经放大@Override public boolean onDoubleTap(MotionEvent e) { imgState = !imgState;//图片的状态 boolean consumed = false; if (doubleTapListener != null) { consumed = doubleTapListener.onDoubleTap(e); } if (state == State.NONE) { float targetZoom = (normalizedScale == minScale) ? maxScale : minScale; DoubleTapZoom doubleTap = new DoubleTapZoom(targetZoom, e.getX(), e.getY(), false); compatPostOnAnimation(doubleTap); consumed = true; } return consumed; }当图片处于放大状态时,屏蔽父控件的TouchEvent事件
// if (mViewParent == null) { // mViewParent = getScrollableParent(); // } // if (mViewParent != null && imgState) {//屏蔽父控件的事件响应 // mViewParent.requestDisallowInterceptTouchEvent(true); // }
private class PrivateOnTouchListener implements OnTouchListener { // // Remember last point position for dragging // private PointF last = new PointF(); @Override public boolean onTouch(View v, MotionEvent event) { mScaleDetector.onTouchEvent(event); mGestureDetector.onTouchEvent(event); PointF curr = new PointF(event.getX(), event.getY()); if (state == State.NONE || state == State.DRAG || state == State.FLING) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: if (mViewParent == null) { mViewParent = getScrollableParent(); } if (mViewParent != null && imgState) {//屏蔽父控件的事件响应 mViewParent.requestDisallowInterceptTouchEvent(true); } last.set(curr); if (fling != null) fling.cancelFling(); setState(State.DRAG); break; case MotionEvent.ACTION_MOVE: if (state == State.DRAG) { float deltaX = curr.x - last.x; float deltaY = curr.y - last.y; float fixTransX = getFixDragTrans(deltaX, viewWidth, getImageWidth()); float fixTransY = getFixDragTrans(deltaY, viewHeight, getImageHeight()); matrix.postTranslate(fixTransX, fixTransY); fixTrans(); last.set(curr.x, curr.y); } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_POINTER_UP: setState(State.NONE); break; } } setImageMatrix(matrix); // // User-defined OnTouchListener // if (userTouchListener != null) { userTouchListener.onTouch(v, event); } // // OnTouchImageViewListener is set: TouchImageView dragged by user. // if (touchImageViewListener != null) { touchImageViewListener.onMove(); } // // indicate event was handled // return true; } }到这里,就已经解决了两者之间的冲突问题