【问题标题】:Double tap with custom time双击自定义时间
【发布时间】:2017-07-11 20:07:35
【问题描述】:

我需要随时间实现自定义双击。示例:设置为 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;
}

问题是:双击运行时,前面还有“Single Tap A”。谁能帮帮我?

【问题讨论】:

    标签: android


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        这是一个设计问题。

        双击是两个单个选项卡,它们之间具有很短的定义延迟。 因此,在双击之前总是会发生单击。

        您应该问问自己,您是否真的想要为单击和双击提供不同的事件。 如果是这样,您只能在点击后等待 DOUBLE_TAP_DELAY 时抛出一个点击事件。 DOUBLE_TAP_DELAY 是两次点击之间的最大延迟,应作为双击处理。 这种设计的问题是,用户会点击,而对于 DOUBLE_TAP_DELAY 没有任何反应。如果 DOUBLE_TAP_DELAY 为 700 毫秒,人们会觉得你的应用程序很慢。

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2014-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-22
          • 2017-05-11
          • 2012-01-10
          • 1970-01-01
          相关资源
          最近更新 更多