8

我想检测双击但不先触发单击。我试过双击监听器,但你总是在检测到双精度之前得到一个 onSingleTapUp,我猜这是合理的。但在我的应用程序中,我真的不希望在途中双击时单击回调。

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

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

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

问题是,在 1 秒内再次录音无济于事。在睡眠完成并且 onPostExecute 运行之前,不会调用 onSingleTapUp。所以 Log.d("KitView", "TASK RUNNING"); 永远不会发生,这是我当然会检测到双击与单击的地方。

我不确定为什么 aynctask 会阻止事件,有什么想法吗?谢谢

4

4 回答 4

19

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

如果你想区分它们,你可以使用onSingleTapConfirmed()当手势检测器确定点击单次时触发的。见参考:

发生单击时通知。

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

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

于 2013-02-06T08:16:38.383 回答
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;
    }
}
}

您可以覆盖侦听器的其他方法以获取单击、弹跳等。

于 2013-02-06T08:11:41.190 回答
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,很好很容易

于 2013-02-06T08:24:02.133 回答
0

你可以参考自爆:覆盖 onTouchEvent() 方法

在第一次下来,我们将记录时间。当第二次宕机到来时,我们将最后一次宕机时间与它进行比较,如果它们在 150ms 或更少之间,我们将发布一条消息,表明它是双击。

于 2013-02-06T08:42:29.590 回答