2015-07-13 27 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; 
      } 
     } 
    } 
相关问题