我们都知道一个View有以下三个事件监听方法:
setOnClickListener();
setOnLongClickListener();
setOnTouchListener();
每一个方法代表着用户不同的操作,分别为:短按,长按和触摸操作.
短按事件
通常一个View设置短按事件监听的代码如下:
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//do something
}
});
长按事件
通常一个View设置长按事件监听的代码如下:
ttttButton.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
//do something
return true;
}
});
这里有一个返回值:
true if the callback consumed the long click, false otherwise.
意思是说:如果时间被消费了返回true,否则返回false.
触摸事件
通常一个View设置触摸事件监听的代码如下:
ttttButton.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_DOWN) {
//do something
return true;
}
if (action == MotionEvent.ACTION_MOVE) {
//do something
return true;
}
if (action == MotionEvent.ACTION_UP) {
//do something
return true;
}
return false;
}
});
这里每一个动作都有一个返回值,返回值会影响触摸事件.一个View如果只设置了onTouchListener事件监听.
只有Down返回值为true时,Move和Up动作才能监听到.
如果给一个View同时设置以上三个方法,会出现怎样的结果呢?
先附上测试界面的效果图,如下:
上图有8个按钮,全部都是设置了onClickListener,onLongClickListener,onTouchListener.正如图中所示,按钮上的字母代表不同的含义.点击不同的按钮进行测试.
最终的测试结果列表如下:
序号 | Click | LongClick | Down | Move | Up | 短按 | 长按 | 备注 |
---|---|---|---|---|---|---|---|---|
1 | 无 | true | true | true | true | down-move-up | down-move-up | |
2 | 无 | true | false | true | true | down-move-up-longClick | down-move-longClick-move-up | 按钮不抬起 |
3 | 无 | true | true | true | false | down-move-up | down-move-up | |
4 | 无 | true | false | true | false | down-move-up-click | down-move-longClick-move-up | |
5 | 无 | false | true | true | true | down-move-up | down-move-up | |
6 | 无 | false | false | true | true | down-move-up-longClick | down-move-longClick-move-up | 按钮不抬起 |
7 | 无 | false | true | true | false | down-move-up | down-move-up | |
8 | 无 | false | false | true | false | down-move-up-click | down-move-longClick-move-up-click |
其中上表中的第2项结果如下图(上为短按,下为长按),按钮不会弹起:
测试结果因返回值不同而不同.所以尽管onTouchListener中down返回true时move和up才起作用,但是如果设置了onlongclciklistener,即使down返回false也能触发move和up事件.
一般地,View的onTouchListener优先级高于onClickListener和onLongClickListener.
可以根据需要使用不同的事件监听进行组合.
源码在我的GitHub中:DevWiki的GitHub:ViewClickDemo