双击自定义时间

时间:2011-12-12 15:32:03

标签: android

我需要随着时间的推移实现自定义双击。示例:设置为500毫秒,300毫秒和700毫秒。我没有找到如何配置它!问题是在一个手势类中对待它,请参阅:

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;
}

问题是:当你点击双击时,还有&#34;单击A&#34;之前。有谁可以帮助我?

3 个答案:

答案 0 :(得分:2)

我正在报告我的一个例子,它区别于长按和单击

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();
}
};

答案 1 :(得分:0)

每次点击完成后,您必须先检查是否已完成任何点按。要为每次点击执行此操作,请启动计时器,该计时器的持续时间是用户可以进行双击(300,500,700毫秒)的时间间隔。因此,每次点击检查计时器是否正在运行;如果是这样,请调用双击方法,否则启动计时器。当计时器结束时,调用单击事件。您可以使用结构http://developer.android.com/reference/android/os/Handler.html

管理计时器

答案 2 :(得分:0)

这是一个设计问题。

双击是两个单独的标签,彼此之间的延迟时间很短。 因此,在双击之前,总是会发生一次点击。

你应该问问自己,你是否真的想要单次和双击的不同事件。 如果是这样,您只能在点击后等待DOUBLE_TAP_DELAY时抛出单击事件。 DOUBLE_TAP_DELAY是应该作为双击处理的两个分接头之间的最大延迟。 这种设计的问题是,用户将点击并为DOUBLE_TAP_DELAY发生任何事情。如果DOUBLE_TAP_DELAY是700毫秒,那么人们将会非常慢地体验您的应用程序。

如果你不关心这个,你可以像Sanandrea所描述的那样实现它。 创建一个Handler和一个Runnable。 在runnable中,您可以执行单个选项卡代码。 如果用户点击,则调用此

myHandler.removeCallbacks(singleTapRunnable);
if(now < lastTouchedTime + DOUBLE_TAP_DELAY)
    callDoubleTap();
else 
    myHandler.postDelayed(singleTapRunnable, DOUBLE_TAP_DELAY);
lastTouchedTime = now;

如果您不希望用户在应用响应您的单击之前等待DOUBLE_TAP_DELAY,还有另一个机会。

您可以在第一次点击后直接执行单击代码,但如果您重新点击双击,则可以反转此代码。 但这在所有情况下都是不可能的,如果您的单个标签代码中包含视图转换,则可能看起来很奇怪。