簡體   English   中英

TouchImageView 設置拖動和縮放邊界限制,防止離開屏幕

[英]TouchImageView set drag and zoom bounds limits , prevent from going off screen

我在可繪制矩形后面有一個裁剪活動和一個圖像視圖,我設置了一個觸摸方法來縮放和拖動圖像視圖,但問題是我可以將它拖出屏幕並放大和縮小屏幕,我想為拖動和縮放使其適合我的矩形,即正方形的寬度和高度相同。

我嘗試了許多不同類型的代碼,但仍然無法正常工作,我還需要處理更寬的圖像,而不僅僅是方形或垂直圖像。

(請幫助我在沒有任何庫的情況下解決此問題,我不允許使用任何庫)

這是我的代碼:

@Override
public boolean onTouch(View v, MotionEvent event) {

     ImageView view = (ImageView) v;

      // Dump touch event to log
      dumpEvent(event);

      // 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_POINTER_UP:
         mode = NONE;
         Log.d(TAG, "mode=NONE");
         break;
          case MotionEvent.ACTION_UP:

          case MotionEvent.ACTION_MOVE:
         if (mode == DRAG) {

            matrix.set(savedMatrix);

            matrix.postTranslate(event.getX()  - start.x /(1.0f) ,
                 event.getY() - start.y / (1.0f) );


         }
         else if (mode == ZOOM) {
            float[] f = new float[9];

            float newDist = spacing(event);
            Log.d(TAG, "newDist=" + newDist);

            if (newDist > 10f) {
               matrix.set(savedMatrix);
               float scale = newDist / oldDist;
               matrix.postScale(scale, scale, mid.x, mid.y);
            }

             matrix.getValues(f);
             scaleX = f[Matrix.MSCALE_X];
             scaleY = f[Matrix.MSCALE_Y];


             if(scaleX <= 0.9f) {
                matrix.postScale((0.9f) / scaleX, (0.9f) /scaleY, mid.x, mid.y);
            }
            else if(scaleX >= 2.5f) {
                   matrix.postScale((2.5f)/scaleX, (2.5f)/scaleY, mid.x, mid.y);             
       } 


      }

         break;


      }

      view.setImageMatrix(matrix);
      return true; 
   }
public boolean onTouch(View v, MotionEvent event) {
        int action = event.getAction();

        DisplayMetrics displaymetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
        int sH = displaymetrics.heightPixels;
        int sW = displaymetrics.widthPixels;
        float dx, dy, newX, newY;

        switch (action) {
            case MotionEvent.ACTION_DOWN:
                dx = event.getRawX() - v.getX();
                dy = event.getRawY() - v.getY();
                break;

            case MotionEvent.ACTION_MOVE:
                newX = event.getRawX() - dx;
                newY = event.getRawY() - dy;

                if ((newX <= 0 || newX >= sW-v.getWidth()) || (newY <= 0 || newY >= sH-v.getHeight()))
                    break;

                v.setX(newX);
                v.setY(newY);
                break;

            case MotionEvent.ACTION_UP:
                break;

            case MotionEvent.ACTION_CANCEL:
                break;

            default:
                break;
        }

        return true;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM