Android 双击自定义时间

Android 双击自定义时间,android,Android,我需要实现一个自定义的双击时间。示例:设置为500ms、300ms和700ms。我没有找到如何配置它!问题在于将其视为一类手势,请参见: public boolean onTouchEvent(View v, MotionEvent e) throws InterruptedException { Button button_now = activity.getButtonByPosition(e.getRawX(), e.getRawY()); Date d = new

我需要实现一个自定义的双击时间。示例:设置为500ms、300ms和700ms。我没有找到如何配置它!问题在于将其视为一类手势,请参见:

public boolean onTouchEvent(View v, MotionEvent e) throws InterruptedException {


    Button  button_now = activity.getButtonByPosition(e.getRawX(), e.getRawY());
    Date d = new Date(); 
    long now = d.getTime();                 


    if(e.getAction() == MotionEvent.ACTION_UP){
            if(button_now != null){                 

                if(button_last != null){                        

                    if(button_now.getId() == button_last.getId())){


                        if(now < lastTouchedTime + DOUBLE_TAP_DELAY){
                            Log.d(tag,"Double tap");
                        }                           
                        else {
                            Log.d(tag,"Single Tap A");
                        }                           
                    }else{
                        Log.d(tag,"Single Tap B");

                    }
                }else{
                    Log.d(tag,"Single Tap C");                      
                }
            }               
            lastTouchedTime = now;
            button_last = button_now;                           
    }       
    return true;
}
public boolean onTouchEvent(视图v,运动事件e)抛出InterruptedException{
Button Button_now=activity.getButtonByPosition(e.getRawX(),e.getRawY());
日期d=新日期();
long now=d.getTime();
如果(e.getAction()==MotionEvent.ACTION\u UP){
如果(按钮_now!=null){
如果(按钮最后!=null){
if(button_now.getId()==button_last.getId()){
如果(现在

问题是:当您双击运行时,之前也有“单点A”。有人能帮我吗?

每次点击完成后,您必须检查是否在任何点击之前完成。要在每次点击时执行此操作,请启动一个计时器,该计时器的持续时间是用户可以进行双点击的时间间隔(300500700ms)。因此,对于每次点击,检查计时器是否正在运行;如果是,则调用双击方法,否则启动计时器。计时器结束时,调用单次点击事件。你们可以用这种结构管理定时器,我正在报告一个我的例子,它区别于长点击和单点击

private boolean DRAGGING;
private boolean ISRELEASED;
private boolean LONGPRESSED;
private Handler mHandler = new Handler();
static private final int LONG_PRESS_THRESHOLD = 500; //ms

public boolean onTouch(View v, MotionEvent event) {

    int eventaction = event.getAction();
    switch (eventaction) {
    case MotionEvent.ACTION_MOVE: // touch drag
        // Log.v(TAG,"dragging");
        mHandler.removeCallbacks(checkLongPress);

        DRAGGING = true;

        start_drag_x = (int) event.getRawX();
        start_drag_y = (int) event.getRawY();

        break;

    case MotionEvent.ACTION_DOWN: {
        ISRELEASED = false;
        mHandler.postDelayed(checkLongPress, LONG_PRESS_THRESHOLD);

        DRAGGING = false;

        start_drag_x = (int) event.getRawX();
        start_drag_y = (int) event.getRawY();

        break;
    }

    case MotionEvent.ACTION_UP:
        ISRELEASED = true;
        mHandler.removeCallbacks(checkLongPress);
        if ((!LONGPRESSED) && (!DRAGGING))
            onTouchedCard();
        LONGPRESSED = false;

        if (DRAGGING) {
            // reposition of card view
            //onDraggedCard();
            DRAGGING = false;
        }
        break;
    }
    return true;
}
public void onTouchedCard() {
//Do stuff for single tap
}
public void onLongTouchedCard(){
//Do stuff for long tap
}
private Runnable checkLongPress = new Runnable() {
public void run() {
    if (!ISRELEASED) {
        onLongTouchedCard(); //Do stuff for long tap
        LONGPRESSED = true;
    } else
        onTouchedCard();
}
};

这是一个设计问题

双击是两个单独的选项卡,彼此之间有一个定义的短延迟。 因此,在双击之前,始终会发生单次点击

你应该扪心自问,你是否真的想在单点和双点上进行不同的活动。 如果是这样的话,当您在点击后等待双点击延迟时,您只能抛出一个点击事件。 DOUBLE_TAP_DELAY是两个抽头之间应作为双抽头处理的最大延迟。 这种设计的问题是,用户会点击,而对于双点击延迟,什么也不会发生。如果双击延迟为700毫秒,人们会觉得你的应用程序非常慢

如果您不关心这一点,您可以像Sanandrea所描述的那样实现它。 创建一个处理程序和一个可运行的。 在runnable中,执行单个选项卡代码。 如果用户点击,您称之为

myHandler.removeCallbacks(singleTapRunnable);
if(now < lastTouchedTime + DOUBLE_TAP_DELAY)
    callDoubleTap();
else 
    myHandler.postDelayed(singleTapRunnable, DOUBLE_TAP_DELAY);
lastTouchedTime = now;
myHandler.removeCallbacks(singleTapRunnable);
如果(现在
还有一个机会,如果你不想让你的用户在应用程序响应你的单次点击之前等待双点击延迟

您可以在第一次轻触后直接执行单轻触代码,但如果您识别到双轻触,请反转此代码。 但这并非在所有情况下都是可能的,如果视图转换包含在您的单个选项卡代码中,则可能看起来很奇怪