// 记录缩放前的一些信息 private void saveScaleContext(float x1, float y1, float x2, float y2) { mScaleBase = MathUtils.getMatrixScale(mOuterMatrix)[0] / MathUtils.getDistance(x1, y1, x2, y2); // 获取缩放缩放点中点在第一层变换后的图片上的坐标 float[] center = MathUtils.inverseMatrixPoint(MathUtils.getCenterPoint(x1, y1, x2, y2), mOuterMatrix); mScaleCenter.set(center[0], center[1]); }
@Override public void onAnimationUpdate(ValueAnimator animation) { boolean result = scrollBy(mVector[0], mVector[1]); mVector[0] *= FLING_DAMPING_FACTOR; mVector[1] *= FLING_DAMPING_FACTOR; if (!result || MathUtils.getDistance(0, 0, mVector[0], mVector[1]) < 1) { animation.cancel(); } }
@Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); if (mPinchMode == PINCH_MODE_NO_PINCH) { return true; } // 无论如何都处理各种外部手势 mGestureDetector.onTouchEvent(event); int action = event.getAction() & MotionEvent.ACTION_MASK; // 最后一个点抬起或者取消,结束所有模式 if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) { if (mPinchMode == PINCH_MODE_SCALE) { scaleEnd(); } mPinchMode = PINCH_MODE_FREE; } else if (action == MotionEvent.ACTION_POINTER_UP) { if (mPinchMode == PINCH_MODE_SCALE) { // 抬起的点如果大于2,那么缩放模式还有效,但是有可能初始点变了,重新测量初始点 if (event.getPointerCount() > 2) { // 如果还没结束缩放模式,但是第一个点抬起了,那么让第二个点和第三个点作为缩放控制点 if (event.getAction() >> 8 == 0) { saveScaleContext(event.getX(1), event.getY(1), event.getX(2), event.getY(2)); // 如果还没结束缩放模式,但是第二个点抬起了,那么让第一个点和第三个点作为缩放控制点 } else if (event.getAction() >> 8 == 1) { saveScaleContext(event.getX(0), event.getY(0), event.getX(2), event.getY(2)); } } } // 第一个点按下,开启滚动模式,记录开始滚动的点 } else if (action == MotionEvent.ACTION_DOWN) { // 在矩阵动画过程中不允许启动滚动模式 if (!(mScaleAnimator != null && mScaleAnimator.isRunning())) { // 停止惯性滚动 if (mFlingAnimator != null) { mFlingAnimator.cancel(); mFlingAnimator = null; } mPinchMode = PINCH_MODE_SCROLL; mLastMovePoint.set(event.getX(), event.getY()); } // 非第一个点按下,关闭滚动模式,开启缩放模式,记录缩放模式的一些初始数据 } else if (action == MotionEvent.ACTION_POINTER_DOWN) { // 停止惯性滚动 if (mFlingAnimator != null) { mFlingAnimator.cancel(); mFlingAnimator = null; } // 停止矩阵动画 if (mScaleAnimator != null) { mScaleAnimator.cancel(); mScaleAnimator = null; } mPinchMode = PINCH_MODE_SCALE; saveScaleContext(event.getX(0), event.getY(0), event.getX(1), event.getY(1)); } else if (action == MotionEvent.ACTION_MOVE) { if (!(mScaleAnimator != null && mScaleAnimator.isRunning())) { // 在滚动模式下移动 if (mPinchMode == PINCH_MODE_SCROLL) { // 每次移动产生一个差值累积到图片位置上 scrollBy(event.getX() - mLastMovePoint.x, event.getY() - mLastMovePoint.y); // 记录新的移动点 mLastMovePoint.set(event.getX(), event.getY()); // 在缩放模式下移动 } else if (mPinchMode == PINCH_MODE_SCALE && event.getPointerCount() > 1) { // 两个缩放点间的距离 float distance = MathUtils.getDistance(event.getX(0), event.getY(0), event.getX(1), event.getY(1)); // 保存缩放点中点 float[] lineCenter = MathUtils.getCenterPoint(event.getX(0), event.getY(0), event.getX(1), event.getY(1)); mLastMovePoint.set(lineCenter[0], lineCenter[1]); // 处理缩放 scale(mScaleCenter, mScaleBase, distance, mLastMovePoint); } } } return true; }