android - 如何在使用缩放和拖动手势时将图像保持在屏幕范围内?

标签 android drag-and-drop zooming pinch

我正在构建一个使用双指缩放和拖动的应用程序。问题是现在我可以将图片拖出边界。我想知道如何使用拖动并确保图像同时停留在屏幕上。

这是我的代码:

public boolean onTouch(View v, MotionEvent event) {
      ImageView view = (ImageView)v;
      //handle touch events here.
      switch (event.getAction() & MotionEvent.ACTION_MASK) {
       case MotionEvent.ACTION_DOWN:
          savedMatrix.set(matrix);
          start.set(event.getX(), event.getY());
          Log.d(TAG, "mode=DRAG" );
          mode = DRAG;
          break;
       case MotionEvent.ACTION_POINTER_DOWN:
           oldDist = spacing(event);
           Log.d(TAG, "oldDist=" + oldDist);
           if (oldDist > 10f) {
              savedMatrix.set(matrix);
              midPoint(mid, event);
              mode = ZOOM;
              Log.d(TAG, "mode=ZOOM" );
           }
           break;
       case MotionEvent.ACTION_UP:
       case MotionEvent.ACTION_POINTER_UP:
          mode = NONE;
          Log.d(TAG, "mode=NONE" );
          break;
       case MotionEvent.ACTION_MOVE:
          if (mode == DRAG) {
             matrix.set(savedMatrix);
             matrix.postTranslate(event.getX() - start.x,
             event.getY() - start.y);
          }
          else if (mode == ZOOM) {
              Float newDist = spacing(event);
              Log.d(TAG, "newDist=" + newDist);
              if (newDist > 10f) {
                 matrix.set(savedMatrix);
                 Float scale = newDist / oldDist;

                 Matrix temp = new Matrix();
                 temp.set(matrix);
                 temp.postScale(scale, scale, mid.x, mid.y);
                 float[] f = new float[9];
                 temp.getValues(f);
                 Float xScale = f[0];
                 if(xScale >= 1 && xScale <= 10){
                     matrix.postScale(scale, scale, mid.x, mid.y);
                     savedMatrixZoom.set(matrix);
                 }else{
                     matrix.set(savedMatrixZoom);

              }

              }
          break;
          }       
     } //perform the transformation.

     view.setImageMatrix(matrix);
     return true; // indicate event was handled  
}

最佳答案

为什么不抓取屏幕尺寸并在更新矩阵之前检查 MotionEvent 坐标是否在这些范围内?

有点像..

DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int screenHight = displaymetrics.heightPixels;
int screenWidth = displaymetrics.widthPixels;

   ...
   case MotionEvent.ACTION_MOVE:

      if (mode == DRAG) {

         int newX = event.getX() - start.x;
         int newY = event.getY() - start.y;
         if ( (newX <= 0 || newX >= screenWidth) ||
              (newY <= 0 || newY >= screenHeight) )
             break;

         matrix.set(savedMatrix);
         matrix.postTranslate(newX, newY);
      }
   ...

关于android - 如何在使用缩放和拖动手势时将图像保持在屏幕范围内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7532128/

相关文章:

android - 拖放 RecyclerView 的第一项会移动几个随机位置

html - 在 Safari、Chrome 和 Opera 中缩小时,标题中的右侧内容移动到标题中的左侧内容下方

c# - 如何在 WPF C# 4.0 中构建放大镜?

Android 布局测量值只有偶数?

android - 契约(Contract) Android 开发人员离开,需要在没有原始 keystore 的情况下更新应用程序 - 这可能吗?

android - 在 NavController 中避免 Android 导航 IllegalArgumentException

java - 如何使用 Java Swing 库实现缩放面板

javascript - Android 播放一次音频

drag-and-drop - Angular Material 7 拖放 x 和 y 坐标

angular - 在@angular/cdk 中找不到拖放