Andorid源碼系列:View的onTouchEvent()與performClick(),performLongClick()調用時機解析


這是大土豆的第一篇博客,想着工作3年多了,在工作上從一名菜鳥逐漸成長為在項目中能干點事的人,自己對Android的見解也一步步加深,有必要寫一些對Android代碼和開發過程中的感悟,和廣大朋友們分享分享,見解不到之處還請多多見諒。

  好了,廢話就說到這兒。今天先來講講一些輕量級的Android源碼吧。咱們說說View的設置點擊監聽以及touch回調方法的觸發。

 先來看setOnClick的代碼。這是最常見的java設置監聽/回調的方法,把設置的接口傳進來,賦值給靜態類對象mListenerInfo的一個接口類型的成員變量,方便以后回調

    public void setOnClickListener(OnClickListener l) {
        if (!isClickable()) {
            setClickable(true);
        }
        getListenerInfo().mOnClickListener = l;
    }

再看看setOnLongClick的代碼,也是一樣的道理

public void setOnLongClickListener(OnLongClickListener l) {
        if (!isLongClickable()) {
            setLongClickable(true);
        }
        getListenerInfo().mOnLongClickListener = l;
    }

好了,回調設置完了,咱們來看View的方法onTouchEvent(),在手指按下這個View的時候,會執行這個checkForLongClick()方法,開始計時了,

case MotionEvent.ACTION_DOWN:
                    mHasPerformedLongPress = false;
    ........
checkForLongClick(0);

一步步點進去,在ViewConfiguration.java里面,配置500毫秒,超過這個時間就會回調你設置的onlongclick的接口監聽,執行你的業務代碼

private static final int DEFAULT_LONG_PRESS_TIMEOUT = 500;

好了,我們再回到onTouchEvent,分析ACTION_DOWN的代碼

case MotionEvent.ACTION_UP:
......
......
if (!mHasPerformedLongPress) {
                            // This is a tap, so remove the longpress check
                            removeLongPressCallback();

                            // Only perform take click actions if we were in the pressed state
                            if (!focusTaken) {
                                // Use a Runnable and post this rather than calling
                                // performClick directly. This lets other visual state
                                // of the view update before click actions start.
                                if (mPerformClick == null) {
                                    mPerformClick = new PerformClick();
                                }
                                if (!post(mPerformClick)) {
                                    performClick();
                                }
                            }
                        }

手指放開的時候,如果回調過longClick(),就會把對應的監聽回調的成員變量給清空了。然后performClick(),這個我就不貼代碼了,就是回調onClick給設置View監聽的地方

綜上所述,onLongClick的回調是在ACTION_DOWN(也就是手指按下)的時候開始觸發邏輯的,onClick的回調是在ACTION_UP(也就是手指抬起)的時候觸發的,這兩個方法不影響onTouchEvent()的執行和邏輯,只是onTouchEvent()方法的順帶處理。

 

PS:

歡迎大家關注我的微信公眾號"大土豆愛開發",技術包括但不限於JavaEE,Android,Git等。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM