Android“View”组件上的DoubleTap检测

时间:2012-01-28 02:48:43

标签: android android-canvas gestures

我需要在这里实现的目标如下 1)在PNG图像上叠加一个transperent“点”;用户点击的位置。 2)当用户长时间保持触摸时,叠加一个transperent“大圆圈”。 3)在Doble上点击“清除屏幕”

我主要使用“onTouchEvent”进行点击事件检测...和“geastureDetector”进行双击检测......但没有得到所需的结果。

这是我正在尝试的两个实现

第一种方法工作正常...但是生成的点击事件有一些偏差...我的意思是说捕获的点击事件总是偏移约Y像素方向50像素....我无法弄清楚为什么会发生这种情况..

class Tileview extends Activity implements GestureDetector.OnGestureListener,GestureDetector.OnDoubleTapListener {

onCreate(){
  //add the View Thing here.
}

@Override
public void onLongPress(MotionEvent e) {
   // "longPress Detected"
}

@Override
public boolean onDoubleTap(MotionEvent e) {
  // "longPress Detected"
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    final int action = event.getActionMasked();
    switch(action){
    case MotionEvent.ACTION_DOWN:           
        mClickX = event.getX();
        mClickY = event.getY();     

    }
    myTileView.invalidate();
    return mGestureDetector.onTouchEvent(event);
}



private class MyTileView extends View{

protected void onDraw(Canvas canvas){
   // Canvas & Paint stuff - for translucent cicle 
   c.drawCircle(mClickX, mClickY, 75.0f, p);
   }
}

另一种方法是能够将图像恰好叠加在适当的位置;但是当我在“View”而不是Activity中添加DoubleTap实现时,doubleTap / geastureListeners永远不会触发.... 只有改变我在那种情况下才能获得onTouchEvent() - 并在“视图”类中进行相应的实现....

class TileActivity extends Activity {

   OnCreate()
          { 
          // Bla Bla Bla       
          }

    private class TileView extends View implements OnDoubleTapListener, OnGestureListener{
            @override
            onTouchEvent(){
                    // get co-ordinates here from MotionEvent
            }

    @Override
    public boolean onDoubleTap(MotionEvent e) {

                  // THIS WON'T EVEN GET FIRED
                  // In this case the doubleTap detection is not working

        clearEntireScreen = true;
        return false;
    }
    }
}

2 个答案:

答案 0 :(得分:0)

问题是当手势检测器未检测到双击或长按时,onTouchEvent未返回true?我会在mGestureDetector.onTouchEvent的开头调用onTouchEvent,如果返回false,则只继续执行ACTION_DOWN处理。在这种情况下,onTouchEvent应该确保返回true:

@Override
public boolean onTouchEvent
  (
    MotionEvent event
  )
  {
    boolean Handled = mGestureDetector.onTouchEvent(event);
    if (!Handled)
      {
        final int action = event.getActionMasked();
        switch(action)
          {
        case MotionEvent.ACTION_DOWN:           
            mClickX = event.getX();
            mClickY = event.getY();
            Handled = true;
        break;
          } /*switch*/
        myTileView.invalidate();
      } /*if*/
    return
        Handled;
  } /*onTouchEvent*/

答案 1 :(得分:0)

现在已经解决了...... !! 似乎解决问题的最佳方法是创建gestureDetector类并实现“SimpleOnGestureListener”..

我不得不稍微调整一下实现......但是骨架代码与本文中的解释更相似...... Fling gesture detection on grid layout

我必须覆盖LongPress / onDoubleTap / onSigleTapUp / onSingletapconfirmed方法才能达到预期效果......

感谢您的帮助...... !!