概述
我們都知道一個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同時設置以上三個方法,會出現怎樣的結果呢?
測試
1.測試界面
先附上測試界面的效果圖,如下:
上圖有8個按鈕,全部都是設置了onClickListener,onLongClickListener,onTouchListener.正如圖中所示,按鈕上的字母代表不同的含義.點擊不同的按鈕進行測試.
2.測試結果
最終的測試結果列表如下:
序號 | 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項結果如下圖(上爲短按,下爲長按),按鈕不會彈起:
第6項結果如下圖(上爲短按,下爲長按),按鈕不會彈起:
3.結論
測試結果因返回值不同而不同.所以儘管onTouchListener中down返回true時move和up才起作用,但是如果設置了onlongclciklistener,即使down返回false也能觸發move和up事件.
一般地,View的onTouchListener優先級高於onClickListener和onLongClickListener.
可以根據需要使用不同的事件監聽進行組合.
4.源碼
源碼在我的GitHub中:DevWiki的GitHub:ViewClickDemo