我需要随着时间的推移实现自定义双击。示例:设置为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;之前。有谁可以帮助我?
答案 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,还有另一个机会。
您可以在第一次点击后直接执行单击代码,但如果您重新点击双击,则可以反转此代码。 但这在所有情况下都是不可能的,如果您的单个标签代码中包含视图转换,则可能看起来很奇怪。