Android首先检测双击而不单击

ste*_*veh 7 events android double-click android-asynctask

我想检测双击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
Run Code Online (Sandbox Code Playgroud)

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

问题是,在1秒内再次录音什么都不做.在睡眠完成并运行onPostExecute之前,没有调用onSingleTapUp.所以Log.d("KitView","TASK RUNNING"); 永远不会发生在哪里我会发现双击与单击当然.

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

and*_*ndr 17

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

如果要区分它们,可以使用onSingleTapConfirmed()在手势检测器确定点击单个时触发的.见参考文献:

单击发生时通知.

不同的是OnGestureListener.onSingleTapUp(MotionEvent),只有在探测器确信用户的第一次点击后没有第二次点击导致双击手势时才会调用

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


GrI*_*sHu 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;
    }
}
}
Run Code Online (Sandbox Code Playgroud)

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