Android首先检测双击而不单击

时间:2013-02-06 08:05:13

标签: android events android-asynctask double-click

我想检测双击BUT而不先触发单击。我已经尝试过双击监听器,但是在检测到双倍之前你总是得到一个onSingleTapUp,这是合理的我猜。但在我的应用程序中,当我在路上双击时,我真的不想要单击回调。

我意识到没有应用程序可以预测未来(或者我会非常富有),但我在想,只需在单击时启动计时器,如果在一段时间内没有双击,则单击一下。但这似乎不起作用,因为一旦我启动计时器并且计时器正在运行,第二次点击永远不会生成事件。这是我使用异步任务的代码,我也尝试使用计时器。

mGD = new GestureDetector(getContext(), new SimpleOnGestureListener() {

            @Override
            public boolean onSingleTapUp(MotionEvent ev) {
                //Log.d("KitView", "onSingleTapUp "+ev.toString());

                class DblTapTask extends AsyncTask<Void, Void, Void> {

                    @Override
                    protected void onPreExecute() {
                        Log.d("KitView", "onPreExecute");
                    }

                    protected Void doInBackground(Void... args) {
                        Log.d("KitView", "doInBackground");
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        return null;
                    }

                    protected void onPostExecute(Void result) {
                        Log.d("KitView", "onPostExecute");
                                            doSigleTapAction();
                        mDblTapTask=null;
                    }
                };

                if(mDblTapTask==null) {
                    Log.d("KitView", "START TASK");
                    mDblTapTask = new DblTapTask();
                    mDblTapTask.execute();
                } else {
                    Log.d("KitView", "TASK RUNNING");
                                    doDoubleTapAction();
                }


                Log.d("KitView", "onSingleTapUp DONE");
                return true;
            }   // end onSingleTapUp

        });     // end new GestureDetector

在这个例子中,我在第一次点击时就得到了单点补丁。我在doInBackground中进行测试的超时为1秒,所以我有很多时间进行第二次点击。注意Log.d(“KitView”,“onSingleTapUp DONE”);立即运行我第一次点击,所以onSingleTapUp没有挂起。

问题是,在1秒内再次录音什么也没做。在睡眠完成并运行onPostExecute之前,没有调用onSingleTapUp。所以Log.d(“KitView”,“TASK RUNNING”);永远不会发生这种情况,我会发现双击而不是单击当然。

我不确定为什么aynctask阻止事件,任何想法?感谢

4 个答案:

答案 0 :(得分:16)

我对你想要达到的目标感到困惑。单击发生时不会调用双击方法onDoubleTap()。另一方面,对于每次双击,有两个相关的单击onSingleTapUp()方法调用。

如果您想区分它们,可以使用onSingleTapConfirmed(),当手势检测器确定点按 单个时,会触发OnGestureListener.onSingleTapUp(MotionEvent)。见参考文献:

  

单击发生时通知。

     

boolean不同,只有在探测器确信用户的第一次点按后没有第二次点击导致双击手势时才会调用此项

然后,您可以将此方法调用与{{1}}标志结合使用,以基本上检测任何类型的单击/双击。

答案 1 :(得分:5)

试试如下:

您可以使用GestureDetector。请参阅以下代码:

public class MyView extends View {

GestureDetector gestureDetector;

public MyView(Context context, AttributeSet attrs) {
    super(context, attrs);
            // creating new gesture detector
    gestureDetector = new GestureDetector(context, new GestureListener());
}

// skipping measure calculation and drawing

    // delegate the event to the gesture detector
@Override
public boolean onTouchEvent(MotionEvent e) {
    return gestureDetector.onTouchEvent(e);
}


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) {
        Log.d("Double Tap", "Tapped Occured.");
        return true;
    }
}
}

您可以覆盖侦听器的其他方法以获得单击,flinges等。

答案 2 :(得分:2)

我想我已经明白了

@Override
            public  boolean     onSingleTapConfirmed(MotionEvent e) {
                Log.d("KitView", "onSingleTapConfirmed");
                return true;
            }
            @Override
            public boolean onDoubleTap(MotionEvent e) {
                Log.d("KitView", "onDoubleTap");
                return true;
            }
当我进行双击时,

onSingleTapConfirmed不会被调用,非常简单

答案 3 :(得分:0)

你可以参考吹: 覆盖onTouchEvent()methed

在第一次下来,我们将记录时间。 当第二个下来时,我们将最后的停机时间与它进行比较,如果它们在150毫秒或更短之间,我们将发一个msg表示它是双击。