2015-09-27 53 views
-1

我有一個作物的活動背後繪製矩形的ImageView的阻止,我設置了觸摸方式進行縮放和拖動ImageView的,但問題是,我可以將它關閉屏幕和放大和縮小屏幕,我想爲拖動和縮放設置限制,因此它適合我的矩形,這是一個方形的寬度和高度是相同的。TouchImageView設置拖動和縮放範圍的限制,從去關閉屏幕

我已經嘗試了許多不同類型的代碼,但它仍然沒有起作用,我還需要處理更寬的圖像,而不僅僅是方形或垂直圖像。

(請幫我解決這個沒有任何圖書館,我不允許使用任何)

這裏是我的代碼:

@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; 
    } 

回答

0
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; 
    }