學習資料:
- dodo_lihao同學的CoordinatorLayout使用(三):NestedScrollView & 嵌套滑動事件
本篇記錄學習Behavior
相關的嵌套滑動事件,學習嵌套事件其實本質就是學習了解NestedScrolling
機制
1.NestedScrolling機制 <p>
隨便一百度,感覺前幾篇出來的博客質量都蠻不錯的
- Jlog大神的Android NestedScrolling 實戰
- 鴻洋大神的Android NestedScrolling 機制完全解析帶你玩轉嵌套滑動
- tuacy同學的Android 嵌套滑動分析
NestedScrolling機制
是在5.0
時推出,其作用就是提供一套父容器
和childview
滑動交互機制,自然的,核心有兩個東西:
- NestedScrollingChild,嵌套滑動子接口
- NestedScrollingParent,嵌套滑動父接口
個人理解:
實現了NestedScrollingChild
接口的可滑動childview
,在準備進入滑動狀態后,可以根據需求,在滑動時主動向實現了NestedScrollingParent
接口的父容器
傳遞消息,而父容器
就根據收到的消息,再指定對象來作出響應
我所謂的傳遞
和接收
消息,其實就是接口回調的過程,具體的中間工作原理過程可以看前面給出的博客,現在的要求是先學會使用
CoordinatorLayout
實現了NestedScrollingParent
接口,RecyclerView
實現了NestedScrollingChild
,而NestedScrollView
則實現了兩個接口
這樣就可以理解在CoordinatorLayout
中,想要配合AppBarLayout
實現折疊隱藏ToolBar
時,ListView
和ScrollView
不能起到效果的原因。因為ListView
和ScrollView
沒有實現NestedScrollingChild
,并不能將滑動狀態主動告訴CoordinatorLayout
,自然而然的,也就無法作出回應
NestedScrollView
實現了兩個接口,也就是說既可以當作傳遞
消息的childview
,也可以當作接收
消息的父容器
CoordinatorLayout
作為一個實現了NestedScrollingParent
接口的父容器
,接收
到消息時,根據消息真正作出響應消息的是綁定了Behavior
的對象。至于消息如何被處理消費,則要看具體的Behavior
子類中,依賴對象
和綁定對象
的邏輯操作
2. 簡單例子 <p>
說明:
例子的思路和代碼是直接從dodo_lihao同學
的博客中照搬來的,感覺他博客中的案例很容易表現出NestedScrolling機制
在Behavior
中的使用特點
效果就是左面一列滑動并不會影響右面的一列,而有面一列滑動時,會影響左面,左面跟隨右面而滑動
2.1 布局代碼
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/activity_nested_scroll"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.widget.NestedScrollView
android:layout_width="100dp"
android:layout_height="match_parent"
android:layout_gravity="start"
app:layout_behavior=".behavior.NestedBehavior">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimary"
android:text="A\\nB\\nC\\nD\\nE\\nF\\nG\\nH\\nI\\nJ\\nK\\nL\\nM\\nN\\nO\\nP\\nQ\\nR\\nS\\nT\\nU\\nV\\nW\\nX\\nY\\nZ"
android:textColor="@color/colorAccent"
android:textSize="30sp" />
</android.support.v4.widget.NestedScrollView>
<android.support.v4.widget.NestedScrollView
android:layout_width="100dp"
android:layout_height="match_parent"
android:layout_gravity="end">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimary"
android:text="A\\nB\\nC\\nD\\nE\\nF\\nG\\nH\\nI\\nJ\\nK\\nL\\nM\\nN\\nO\\nP\\nQ\\nR\\nS\\nT\\nU\\nV\\nW\\nX\\nY\\nZ"
android:textColor="@color/colorAccent"
android:textSize="30sp" />
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>
布局中就是兩個NestedScrollView
,內部各自有一個TextView
,左面的NestedScrollView
使用了app:layout_behavior=".behavior.NestedBehavior"
作為綁定對象
2.2 NestedBehavior <p>
思路:
- NestedScrollView直接會發送事件
- CoordinatorLayout也就是外面parent的會自動接收
- 一個Behavior子類來消費
public class NestedBehavior extends CoordinatorLayout.Behavior<NestedScrollView> {
public NestedBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
}
/**
* 返回值就是依賴childView的滑動準備狀態
* 告訴CoordinatorLayout,要準備開始滑動
*/
@Override
public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, NestedScrollView child, View directTargetChild, View target, int nestedScrollAxes) {
return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL;
}
/**
* 滑動過程中回調
* CoordinatorLayout接收到消息后,事件真正被消費的回調方法
*/
@Override
public void onNestedScroll(CoordinatorLayout coordinatorLayout, NestedScrollView child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) {
super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed);
int scrollY = target.getScrollY();
child.setScrollY(scrollY);
}
/**
* 返回值就是依賴的childView的是否處于Fling狀態
*
*/
@Override
public boolean onNestedFling(CoordinatorLayout coordinatorLayout, NestedScrollView child, View target, float velocityX, float velocityY, boolean consumed) {
child.fling((int) velocityY);
return true;
}
}
NestedScrollView
既可以接受消息又可以傳遞消息,無需綁定
3. 最后 <p>
NestedScrolling機制
以后用到,還需要再根據實際需求深入學習,現在也只是入門學習了解
首付一半,免息打白條分一年,在京東買的MacBook Pro
乞丐版也用了兩天了,逐漸適應了系統,感覺蠻好用的,就是開了Android Studio
后,動不動就熱乎乎的有點不爽。以后得努力學習,掙多點錢趕緊還白條。。。
本人很菜,有錯誤請指出
共勉 :)