首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

源碼解析 CoordinatorLayout.Behavior 原理(Android)

     編輯:關於C++

一、Behavior 實例化

在佈局 XML 中通過 app:layout_behavior="com.example.MyBehavior" 指定。
CoordinatorLayout.LayoutParams 構造函數中調用 parseBehavior():
1. 解析完整類名(支持相對包名 ".MyBehavior")
2. 反射獲取構造函數 Constructor(Context, AttributeSet)
3. 實例化並緩存
因此自定義 Behavior 必須實現雙參構造函數。

二、layoutDependsOn / onDependentViewChanged 調用流程

CoordinatorLayout 註冊 ViewTreeObserver.OnPreDrawListener,在 onPreDraw() 中調用 dispatchOnDependentViewChanged(false):
1. 遍歷按依賴排序的子 View 列表 mDependencySortedChildren
2. 對每個子 View,檢查其矩形區域是否變化
3. 若變化,遍歷其後的子 View,調用其 Behavior 的 layoutDependsOn(parent, child, dependency)
4. 返回 true 則調用 onDependentViewChanged(parent, child, dependency)
此機制實現了「觀察者模式」:被依賴 View 變化時通知依賴者。

三、onStartNestedScroll / onNestedPreScroll 實現原理

嵌套滑動機制:
- 可滑動子 View (如 NestedScrollView) 持有 NestedScrollingChildHelper
- 觸摸 ACTION_DOWN 時調用 startNestedScroll()
- 向上遍歷父 View,調用 ViewParentCompat.onStartNestedScroll()
- CoordinatorLayout 實現 NestedScrollingParent,其 onStartNestedScroll() 遍歷子 View 調用各 Behavior 的 onStartNestedScroll()
- 返回 true 的 Behavior 成為嵌套滑動消費者,後續滑動事件分發給它

四、Behavior 事件分發流程

CoordinatorLayout 重寫 onInterceptTouchEvent 和 onTouchEvent,內部調用 performIntercept():
- 遍歷子 View(從上層到下層)
- TYPE_ON_INTERCEPT:調用 Behavior.onInterceptTouchEvent(),攔截返回 true 則消費事件
- TYPE_ON_TOUCH:調用 Behavior.onTouchEvent(),處理觸摸事件
- 支持 mBehaviorTouchView 記錄當前處理觸摸的 View,實現事件鏈
Behavior 如同代理,決定事件是否被攔截/消費。

五、總結

Behavior 是 CoordinatorLayout 協調子 View 交互的核心:
- 依賴關係:layoutDependsOn + onDependentViewChanged
- 嵌套滑動:onStartNestedScroll 系列
- 觸摸事件:onInterceptTouchEvent / onTouchEvent
理解源碼流程有助於自定義複雜協調行為。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved