Android检测双击而不先单击 [英] Android detecting double tap without single tap first

查看:30
本文介绍了Android检测双击而不先单击的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想检测双击但不先触发单击.我试过双击侦听器,但在检测到双倍之前,您总是会得到一个 onSingleTapUp,我猜这是合理的.但在我的应用程序中,我真的不希望在途中出现双击时的单击回调.

i would like to detect a double tap BUT without triggering a single tap first. i've tried double click listeners but you always get a onSingleTapUp before the double is detected, which is reasonable i guess. but in my app, i really don't want the single click callback when there is a double click on the way.

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

i realize no app can predict the future (or i would be really rich) but i was thinking, just launch a timer on the single click and if there is no double click within some time out, then do the single click. but that doesn't seem to work because once i start the timer and the timer is running, the second tap never generates an event. here's my code using an aync task, i also tried it with a timer.

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

在这个例子中,我在第一次点击时就可以正常使用SingleTapUp.我在 doInBackground 中进行测试的超时时间为 1 秒,因此我有很多时间进行第二次点击.请注意 Log.d("KitView", "onSingleTapUp DONE");我第一次点击时立即运行,所以 onSingleTapUp 不会挂起.

in this example, i get onSingleTapUp just fine on the first tap. my timeout is 1 sec for testing in the doInBackground so i have lots of time to do the second tap. note that Log.d("KitView", "onSingleTapUp DONE"); runs immediately i do the first tap, so onSingleTapUp is not hanging.

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

the problem is, taping again within the 1sec does nothing. there is no call to onSingleTapUp until after the sleep has finished and onPostExecute has run. so Log.d("KitView", "TASK RUNNING"); never happens which is where i would detect double click vs. single click of course.

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

i'm not sure why aynctask is blocking events, any ideas? thanks

推荐答案

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

I'm confused on what you're trying to achieve. The double tap method onDoubleTap() isn't called when the single tap occurs. On the other hand, for every double tap there are two associated single tap onSingleTapUp() method calls.

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

If you want to distinguish them, you can use onSingleTapConfirmed() which is triggered when the gesture detector is sure the tap is single. See reference:

单击发生时通知.

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

Unlike OnGestureListener.onSingleTapUp(MotionEvent), this will only be called after the detector is confident that the user's first tap is not followed by a second tap leading to a double-tap gesture

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

You can then use this method call in combination with a boolean flag to essentially detect any type of single/double tap.

这篇关于Android检测双击而不先单击的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆