2011-12-12 68 views
0

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

的问题是:当你双击运行,也就是“单次点击A”之前。任何人都可以帮我吗?

回答

2

我要回报我的,从长按distinuishes和单一的水龙头

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

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

+0

亲爱的,你能给我一个更清晰的例子吗? – Mateus

0

的例子这是一个设计问题,您可以管理与结构定时器。

双击是两个单个选项卡,相互之间有一个短暂定义的延迟。 因此,在双击之前总是会出现单击。

你应该问自己,你是否真的想要单击和双击不同的事件。 如果是这样,当您在点击后等待DOUBLE_TAP_DELAY时,您只能抛出单击事件。 DOUBLE_TAP_DELAY是应该作为双击处理的两个水龙头之间的最大延迟。 这个设计的问题是,用户将点击并为DOUBLE_TAP_DELAY没有任何反应。如果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; 

也有另一种机会,如果你不想让你的用户等待DOUBLE_TAP_DELAY之前的应用程序响应您的一个水龙头。

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