2011-09-23 23 views
6

我正在構建一個使用捏縮放和拖動的應用程序。問題是,現在我可以將圖片拖出界限。我想知道如何使用拖拽,並確保圖像同時在屏幕上。如何在使用縮放和拖動手勢時將圖像保留在屏幕限制內?

這裏是我的代碼:

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 
} 

回答

2

爲什麼不抓取屏幕的尺寸和檢查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); 
     } 
    ... 
+1

所以會在'打破;'聲明解決呢?我有一個問題在這裏:http://stackoverflow.com/questions/21520075/how-to-keep-x-and-y-within-layouts-view。 – Si8

+1

嘿,我可以知道這裏開始的是什麼嗎? –

+0

它不起作用。 newX只是顯示拖動動作的起點和終點的區別。當圖像仍在邊界內時,它很容易變得消極。 – mok

1
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; 

      default: 
       break; 
     } 

     return true; 
    } 
相關問題