Java 当按下菜单按钮时,如何创建单击事件和双击事件?
我想能够检测到一个单一的点击或双击时,菜单按钮被按下。如果检测到一次单击,甚至会发生一次,如果检测到双击,则会发生另一次事件。以下是我尝试过的(使用toast代替事件):Java 当按下菜单按钮时,如何创建单击事件和双击事件?,java,android,click,double,double-click,Java,Android,Click,Double,Double Click,我想能够检测到一个单一的点击或双击时,菜单按钮被按下。如果检测到一次单击,甚至会发生一次,如果检测到双击,则会发生另一次事件。以下是我尝试过的(使用toast代替事件): private static final long DOUBLE\u PRESS\u INTERVAL=250;//以毫为单位 私人长时间; @凌驾 公共布尔值OnPrepareOptions菜单(菜单){ //以纳秒为单位获取当前时间。 长按时间=System.currentTimeMillis(); //如果双击。。。 i
private static final long DOUBLE\u PRESS\u INTERVAL=250;//以毫为单位
私人长时间;
@凌驾
公共布尔值OnPrepareOptions菜单(菜单){
//以纳秒为单位获取当前时间。
长按时间=System.currentTimeMillis();
//如果双击。。。
if(pressTime-lastPressTime简单的逻辑错误。您在录制新的lastPressTime之前返回。如果他们都返回相同的内容,您应该只有一个回叫:
boolean mHasDoubleClicked = false;
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// Get current time in nano seconds.
long pressTime = System.currentTimeMillis();
// If double click...
if (pressTime - lastPressTime <= DOUBLE_PRESS_INTERVAL) {
Toast.makeText(getApplicationContext(), "Double Click Event", Toast.LENGTH_SHORT).show();
mHasDoubleClicked = true;
}
else { // If not double click....
mHasDoubleClicked = false;
Handler myHandler = new Handler() {
public void handleMessage(Message m) {
if (!mHasDoubleClicked) {
Toast.makeText(getApplicationContext(), "Single Click Event", Toast.LENGTH_SHORT).show();
}
}
};
Message m = new Message();
myHandler.sendMessageDelayed(m,DOUBLE_PRESS_INTERVAL);
}
// record the last time the menu button was pressed.
lastPressTime = pressTime;
return true;
}
boolean mHasDoubleClicked=false;
@凌驾
公共布尔值OnPrepareOptions菜单(菜单){
//以纳秒为单位获取当前时间。
长按时间=System.currentTimeMillis();
//如果双击。。。
if(pressTime-lastPressTime我修改了此代码以检测保持事件(长点击)以及短点击和双击。其工作原理是将短点击的检测延迟到尚未处理事件的操作启动事件(clickHandled==false)
为onShortClick()、onLongClick()和onDoubleClick()提供您自己的方法
private长时间;
private long previousTouchTime=0;
私密长钮扣时间;
私有布尔clickHandled=false;
私有长双击间隔=ViewConfiguration.getDoubleTapTimeout();
private long_HOLD_TIMEOUT=ViewConfiguration.getLongPressTimeout();
@凌驾
公共布尔onTouch(视图v,最终运动事件){
开关(event.getAction()){
case MotionEvent.ACTION\u DOWN:
thisTouchTime=System.currentTimeMillis();
if(thisTouchTime-上一次TouchTime长时间\u保持\u超时){
clickHandled=true;
onLongClick(事件);
}否则{
Handler myHandler=newhandler(){
公共无效handleMessage(消息m){
如果(!ClickHandle){
clickHandled=true;
onShortClick(事件);
}
}
};
消息m=新消息();
sendMessageDelayed(m,双击间隔);
}
}
打破
case MotionEvent.ACTION\u移动:
myParams.x=initialDrawX+(int)(event.getRawX()-initialTouchX);
myParams.y=initialDrawY+(int)(event.getRawY()-initialTouchY);
windowManager.UpdateView布局(v,myParams);
打破
}
返回false;
}
这不会解决问题,因为在双击中第一次按下按钮时,您将运行“else”案例并启动单次单击事件,然后立即执行“if”案例。啊,好的,我现在知道了。查看编辑是否更好。我还没有检查它是否编译。在handleMessage decla之后缺少一个分号定量。但它工作得很好。太棒了!在谷歌搜索这个问题的答案时,我从来没有使用过handler对象,也从来没有找到任何关于它的信息。非常感谢!完美的答案。谢谢:)我是如何检测到长时间点击的?我现在正在浏览文档,但没有找到任何有效的信息?(现在长时间单击只显示键盘)我想我明白你的意思了。我希望长时间单击物理键盘,而不是视图。视图已注册长时间单击。
boolean mHasDoubleClicked = false;
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// Get current time in nano seconds.
long pressTime = System.currentTimeMillis();
// If double click...
if (pressTime - lastPressTime <= DOUBLE_PRESS_INTERVAL) {
Toast.makeText(getApplicationContext(), "Double Click Event", Toast.LENGTH_SHORT).show();
mHasDoubleClicked = true;
}
else { // If not double click....
mHasDoubleClicked = false;
Handler myHandler = new Handler() {
public void handleMessage(Message m) {
if (!mHasDoubleClicked) {
Toast.makeText(getApplicationContext(), "Single Click Event", Toast.LENGTH_SHORT).show();
}
}
};
Message m = new Message();
myHandler.sendMessageDelayed(m,DOUBLE_PRESS_INTERVAL);
}
// record the last time the menu button was pressed.
lastPressTime = pressTime;
return true;
}
private long thisTouchTime;
private long previousTouchTime = 0;
private long buttonHeldTime;
private boolean clickHandled = false;
private long DOUBLE_CLICK_INTERVAL = ViewConfiguration.getDoubleTapTimeout();
private long LONG_HOLD_TIMEOUT = ViewConfiguration.getLongPressTimeout();
@Override
public boolean onTouch(View v, final MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
thisTouchTime = System.currentTimeMillis();
if (thisTouchTime - previousTouchTime <= DOUBLE_CLICK_INTERVAL) {
// double click detected
clickHandled = true;
onDoubleClick(event);
} else {
// defer event handling until later
clickHandled = false;
}
previousTouchTime = thisTouchTime;
break;
case MotionEvent.ACTION_UP:
if (!clickHandled) {
buttonHeldTime = System.currentTimeMillis() - thisTouchTime;
if (buttonHeldTime > LONG_HOLD_TIMEOUT) {
clickHandled = true;
onLongClick(event);
} else {
Handler myHandler = new Handler() {
public void handleMessage(Message m) {
if (!clickHandled) {
clickHandled = true;
onShortClick(event);
}
}
};
Message m = new Message();
myHandler.sendMessageDelayed(m, DOUBLE_CLICK_INTERVAL);
}
}
break;
case MotionEvent.ACTION_MOVE:
myParams.x = initialDrawX + (int) (event.getRawX() - initialTouchX);
myParams.y = initialDrawY + (int) (event.getRawY() - initialTouchY);
windowManager.updateViewLayout(v, myParams);
break;
}
return false;
}