2011-09-23 5 views
6

Sto costruendo un'app che utilizza lo zoom pizzico e trascina. Il problema è che per ora posso trascinare l'immagine fuori dai limiti. Volevo sapere come posso usare il trascinamento e assicurarmi che l'immagine rimanga sullo schermo allo stesso tempo.Come mantenere un'immagine all'interno dei limiti dello schermo mentre si utilizzano i movimenti di zoom e trascinamento pizzico?

Ecco il mio codice:

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 
} 

risposta

2

perché non afferrare le dimensioni dello schermo e controllare le coordinate MotionEvent sono all'interno di questi prima di aggiornare il tuo matrice?

Qualcosa di simile ..

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

così sarebbe il 'break;' dichiarazione risolverlo? Ho una domanda qui: http://stackoverflow.com/questions/21520075/how-to-keep-x-and-y-within-layouts-view. – Si8

+1

Ehi, posso sapere che cosa inizia qui? –

+0

non funziona. newX mostra solo la differenza tra il punto di partenza e il punto finale dell'azione di trascinamento. diventa facilmente negativo mentre l'immagine è ancora all'interno del bordo. – 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; 
    } 
Problemi correlati