机器人检测双抽头而不单抽头第一(Android detecting double tap witho

2019-07-19 09:00发布

我想检测的双击但没有第一触发单个抽头。 我试过双击听众,但在检测前双,这是合理的我想你总会得到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的第一次敲击就好了。 我超时是在doInBackground测试,所以我有很多时间做第二次敲击1秒。 注意,Log.d( “KitView”, “onSingleTapUp DONE”); 立即运行我做的第一次轻触,所以onSingleTapUp不挂。

问题是,在1秒内再次录音什么都不做。 还有就是onSingleTapUp没有呼叫,直到之后的睡眠已经完成,并已onPostExecute运行。 所以Log.d( “KitView”, “任务中运行”); 从未发生过这是我将检测双击主场迎战当然单一的点击。

我不知道为什么aynctask阻塞事件,任何想法? 谢谢

Answer 1:

我对你想达到什么样的困惑。 双抽头方法onDoubleTap()当单抽头发生不被调用。 在另一方面,对于每一个双击有两个相关的单一的水龙头onSingleTapUp()方法调用。

如果要区分它们,你可以使用onSingleTapConfirmed()时姿态探测器是肯定的水龙头单被触发。 见参考文献:

当单抽头发生通知。

不像OnGestureListener.onSingleTapUp(MotionEvent)这将只能被称为后的检测器确信该用户的第一抽头后面没有第二抽头导致双敲击手势

然后,您可以结合使用这个方法调用了boolean标志基本上检测到任何类型的单/双击的。



Answer 2:

尝试如下:

您可以使用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等。



Answer 3:

我想我已经想通了

@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当我这样做双击不叫,好和易于



Answer 4:

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

在第一个下来,我们将记录时间。 当第二下进来,我们比较了价格下跌的时间与它,如果他们是150毫秒之间或更低,我们将发布一个味精,这是一个双击。



文章来源: Android detecting double tap without single tap first