View的Click,LongClick,Touch事件的研究

概述

我們都知道一個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.測試界面

先附上測試界面的效果圖,如下:
HomePage
上圖有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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章