2015-07-13 25 views
0

所以我想把我的觀點與許多不同的方式工作,應該有:如何在Android中同時進行雙擊和平移工作?

  • 多點觸控的放大
  • Touchlistener進行平
  • 雙擊恢復變焦
  • 或者如果它已經恢復它會縮放雙擊的地方。

目前,一切工作正常,但是當我雙擊並保持第二點擊下來,繼續移動它的代碼工作這種方式首先restores/zooms然後panning starts

因此,由於縮放比例,它有時會首先更改畫布的大小,然後開始平移。雙擊後,我應該如何啓用平移?或者像是檢查雙擊的最後一次點擊是否繼續移動,並跳過縮放/恢復的東西?我的代碼看起來像這個atm。我試圖在doubleclick後返回false,但它並沒有真正的效果......會不會有類似的設置ignoreMultiTouchtrue,但雙擊或平移?

@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    if(mgestureDetector.onTouchEvent(ev)){ 
     mOnTouchEventWorkingArray[0] = ev.getX(); 
     mOnTouchEventWorkingArray[1] = ev.getY(); 

     mOnTouchEventWorkingArray = scaledPointsToScreenPoints(mOnTouchEventWorkingArray); 

     ev.setLocation(mOnTouchEventWorkingArray[0], mOnTouchEventWorkingArray[1]); 
     mScaleDetector.onTouchEvent(ev); 

     final int action = ev.getAction(); 
     switch (action & MotionEvent.ACTION_MASK) { 
      case MotionEvent.ACTION_DOWN: { 
       final float x = ev.getX(); 
       final float y = ev.getY(); 

       mLastTouchX = x; 
       mLastTouchY = y; 

       // Save the ID of this pointer 
       mActivePointerId = ev.getPointerId(0); 
       break; 
      } 

      case MotionEvent.ACTION_MOVE: { 
       // Find the index of the active pointer and fetch its position 
       final int pointerIndex = ev.findPointerIndex(mActivePointerId); 
       final float x = ev.getX(pointerIndex); 
       final float y = ev.getY(pointerIndex); 

       final float dx = x - mLastTouchX; 
       final float dy = y - mLastTouchY; 


       mPosX += dx; 
       mPosY += dy; 
       mTranslateMatrix.preTranslate(dx, dy); 
       mTranslateMatrix.invert(mTranslateMatrixInverse); 

       mLastTouchX = x; 
       mLastTouchY = y; 
       normal = false; 

       invalidate(); 
       break; 
      } 

      case MotionEvent.ACTION_UP: { 
       mActivePointerId = INVALID_POINTER_ID; 
       break; 
      } 

      case MotionEvent.ACTION_CANCEL: { 
       mActivePointerId = INVALID_POINTER_ID; 
       break; 
      } 

      case MotionEvent.ACTION_POINTER_UP: { 
       // Extract the index of the pointer that left the touch sensor 
       final int pointerIndex = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; 
       final int pointerId = ev.getPointerId(pointerIndex); 
       if (pointerId == mActivePointerId) { 
        // This was our active pointer going up. Choose a new 
        // active pointer and adjust accordingly. 
        final int newPointerIndex = pointerIndex == 0 ? 1 : 0; 
        mLastTouchX = ev.getX(newPointerIndex); 
        mLastTouchY = ev.getY(newPointerIndex); 
        mActivePointerId = ev.getPointerId(newPointerIndex); 
       } 
       break; 

      } 
     } 
    } 
    return true; 

} 

private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { 

    @Override 
    public boolean onScale(ScaleGestureDetector detector) { 
     mScaleFactor *= detector.getScaleFactor(); 
     if (detector.isInProgress()) { 
      mFocusX = detector.getFocusX(); 
      mFocusY = detector.getFocusY(); 
     } 
     mScaleFactor = Math.max(0.75f, Math.min(mScaleFactor, 3.0f)); 
     mScaleMatrix.setScale(mScaleFactor, mScaleFactor, 
       mFocusX, mFocusY); 
     mScaleMatrix.invert(mScaleMatrixInverse); 
     invalidate(); 
     requestLayout(); 

     return true; 
    } 
} 

private class GestureListener extends GestureDetector.SimpleOnGestureListener { 

    @Override 
    public boolean onDown(MotionEvent e) { 
     return true; 
    } 

    // event when double tap occurs 
    @Override 
    public boolean onDoubleTap(MotionEvent e) { 
     if (!normal) { 
      restore(); 
     } else { 
      zoomToSpot(e); 
     } 
     return false; 
    } 


    @Override 
    public boolean onDoubleTapEvent(MotionEvent e) { 
     return true; 
    } 
} 

回答

0

所以我做了我的代碼以這些小東西的工作,首先,我添加了doubleclicked布爾

public boolean onDoubleTap(MotionEvent e) { 
     if (!normal) { 
      restore(); 
     } else { 
      zoomToSpot(e); 
     } 
     doubleclicked = true; 
     return true; 
    } 

然後我做了兩個不同的onTouchEvents並設置如果d​​oubleclicked是假的首隻工作。當屏幕上沒有手指時,第二個將設置爲雙擊虛假。

public boolean onTouchEvent(MotionEvent ev) { 

    final int action = ev.getAction(); 

    if (!doubleclicked) { 
     switch (action & MotionEvent.ACTION_MASK) { 
      case MotionEvent.ACTION_DOWN: { 
       //something... 
     } 
    } else { 
     switch (action & MotionEvent.ACTION_MASK) { 
      case MotionEvent.ACTION_UP: { 
       doubleclicked = false; 
       break; 
      } 
     } 
    } 
相關問題