CoordinatorLayout事件分析

首先明確AppbarLayout默認(rèn)的Behavior是 AppbarLayout.Behavior?

RecyclerView的Behavior為AppbarLayout.ScrollingViewBehavior

觸摸在AppbarLayout上面

1 : 觸摸在AppBarLayout上面, 首先CoordinatorLayout接收事件,走onInterceptTouchEvent(), 然后先去判斷behavior是否攔截事件,return 結(jié)果。

2 : 事件繼續(xù)向下傳遞,因為AppbarLayout沒有重寫dispatchEvent() onInterceptTouchevent(),onTouchEvent()方法,默認(rèn)走viewGroup的分發(fā)方法,默認(rèn)不攔截。

3 :最終回到AppbarLayout的onTouchEvent()方法,和之前一樣,先調(diào)用behavior的OnTouchEvent()方法,

返回true,則該事件在CoordinatorLayout的OntouchEvent()中處理,之后move事件不再走onInterceptTouchEvent() AppBarLayout開始滾動。

4 :?OnPreDrawListener 監(jiān)聽View樹的改變,因此onChildViewsChanged() 被調(diào)用,之后雙層for循環(huán),遍歷每個控件和其他控件是否有依賴關(guān)系。調(diào)用behavior的b.onDependentViewChanged(this,checkChild,child); 然后ScrollingViewBehavior就被調(diào)用,recyclerView調(diào)用offsetChildAsNeeded()方法開始滾動。

觸摸再RecyclerView上


recyclerView事件分發(fā)
recyclerView事件分發(fā)

1 觸摸在recyclerView上面。首先CoordinatorLayout接收事件,走onInterceptTouchEvent(), 然后先去判斷behavior是否攔截事件,return 結(jié)果。

2 : 返回false不攔截,直接傳遞給recyclerview的onInterceptTouchEvent(),返回false ,不攔截,接著傳遞。

3 : 傳遞到OnTouchEvent方法上面,return true,之后move事件,recyclerView的move事件不會再經(jīng)由recyclerView的onInterceptTouchEvent() 直接較給recyclerView的onTouchEvent()方法處理了。

4 : recyclerView的OntouchEvent()方法中,調(diào)用onNestedpreScroll() 判斷AppBarLayout是否消費距離。如果消費了,recylerview減去距離后,調(diào)用內(nèi)部滾動。

總結(jié)

AppbarLayout上面,RecyclerView是通過RecyclerView的behavior改變onDependentViewChanged滾動的。

RecyclerView上面,AppBarLayout是通過AppbarLayout的behavior的onNestedPreScroll() ,onNestedScroll()

可以理解為:

觸摸非滾動View上,其他的view使用依賴關(guān)系,被動依賴。

觸摸在滾動View上,其他View使用監(jiān)聽滾動onNestedPreScroll(),onNestedScroll(),主動有反饋。

當(dāng)然View可以任意組合,但原生的recyclerView都提供了onNestedPreScroll()等方法,會方便處理事件。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容