2013-07-17 37 views
1

我想通過手指手勢移動視圖。我搜索了但添加了這段代碼,但仍然不起作用。在android中觸摸手勢以移動視圖

請幫我檢查問題出在哪裏。

public boolean onTouchEvent(MotionEvent event) { 
    curX = event.getX(); 
    curY = event.getY(); 
    if(event.getPointerCount() == 2) { 
     previousFingerDistance = currentFingerDistance; 
     currentFingerDistance = fingerDist(event); 

     if(previousFingerDistance == currentFingerDistance) { 
      prevX = curX; 
      prevY = curY; 
      invalidate(); 
     } 
    } 
    return true; 
} 

回答

2

試試看看這個代碼。我使用它來將ImageView移動到屏幕上,但我認爲它適用於其他類型的視圖。

imView.setOnTouchListener(new OnTouchListener() { 
       private static final String TAG = "Touch"; 
       // These matrices will be used to move and zoom image 

       Matrix savedMatrix = new Matrix(); 
       PointF start = new PointF(); 
       public PointF mid = new PointF(); 

       // We can be in one of these 3 states 
       public static final int NONE = 0; 
       public static final int DRAG = 1; 
       public static final int ZOOM = 2; 
       public int mode = NONE; 

       float oldDist; 

       public boolean onTouch(View v, MotionEvent event) { 

        ImageView view = (ImageView) v; 
        view.setScaleType(ImageView.ScaleType.MATRIX); 
        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_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.postScale(scale, scale, mid.x, mid.y); 
          } 
         } 
         break; 

        case MotionEvent.ACTION_UP: 
        case MotionEvent.ACTION_POINTER_UP: 

         mode = NONE; 
         Log.d(TAG, "mode=NONE"); 
         break; 
        } 

        // Perform the transformation 
        Log.d("point",start.x +" "+start.y); 
        view.setImageMatrix(matrix); 

        return true; // indicate event was handled 
       } 

       private float spacing(MotionEvent event) { 
        float x = event.getX(0) - event.getX(1); 
        float y = event.getY(0) - event.getY(1); 
        return FloatMath.sqrt(x * x + y * y); 
       } 

       private void midPoint(PointF point, MotionEvent event) { 

        float x = event.getX(0) + event.getX(1); 
        float y = event.getY(0) + event.getY(1); 
        point.set(x/2, y/2); 
       } 

      }); 

更普遍的觀點

public boolean onTouch(View view, MotionEvent motionEvent) { 
    switch (motionEvent.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      float dx = motionEvent.getX(); 
      float dy = motionEvent.getY(); 
      break; 

     case MotionEvent.ACTION_MOVE: 
      float x = motionEvent.getX(); 
      fload y = motionEvent.getY(); 
      RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) view.getLayoutParams(); 
      float left = lp.leftMargin + (x - dx); 
      float top = lp.topMargin + (y - dy); 
      lp.leftMargin = (int)left; 
      lp.topMargin = (int)top; 
      view.setLayoutParams(lp); 
      break; 
    } 
    return true; 
} 
+0

我試圖與GLSurfaceView但沒有方法setImageMatrix(矩陣)在 – user2583144

+0

嘗試第二種方法 – Yarh

+0

感謝的人!第二種方法幫助了我。 –