這是大土豆的第一篇博客,想着工作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等。