Пример #1
0
 // 记录缩放前的一些信息
 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]);
 }
Пример #2
0
 @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;
 }