一、NestedScrollView的基本介紹
NestedScrollView是Android Support v4包中提供的滑動控制項,它繼承自FrameLayout,可以嵌套一個ScrollView或者ListView等可滑動的控制項,實現滑動嵌套的效果。NestedScrollView需要設置app:layout_behavior屬性,通常使用的是AppBarLayout.ScrollingViewBehavior。
接下來,我們將詳細說明如何利用NestedScrollView實現滑動嵌套控制項的聯動效果。
二、CoordinatorLayout的基本介紹
在講解如何利用NestedScrollView實現滑動嵌套控制項的聯動效果之前,我們需要了解另一個重要的控制項——CoordinatorLayout,用於實現一些複雜的交互布局效果。CoordinatorLayout是Android Support v7包中提供的控制項,它可以對子控制項之間的交互行為進行協調,比如對一個FAB按鈕的位置進行動態調整。
CoordinatorLayout使用了Behavior來協調布局,每個Behavior都可以獨立控制一個View的布局和行為。例如AppBarLayout.ScrollingViewBehavior可以控制NestedScrollView在AppBarLayout下方時的滑動效果。
三、實現滑動嵌套控制項的聯動效果
要實現NestedScrollView的滑動嵌套控制項的聯動效果,需要結合AppBarLayout、CollapsingToolbarLayout和Toolbar這些控制項,以及RecyclerView或ListView等可滑動的控制項。
步驟1:布局文件設置
在activity的xml布局文件中,需要定義AppBarLayout、CollapsingToolbarLayout、NestedScrollView等控制項,其中NestedScrollView中包含RecyclerView或ListView等可滑動的子控制項。如下所示:
<android.support.design.widget.CoordinatorLayout
android:layout_height="match_parent"
android:layout_width="match_parent">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.design.widget.CollapsingToolbarLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<ImageView
android:layout_width="match_parent"
android:layout_height="300dp"
app:layout_collapseMode="parallax" />
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_collapseMode="pin" />
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<!-- 可滑動的子控制項-->
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>
步驟2:設置Toolbar
在布局文件中,需要定義Toolbar,並設置app:layout_scrollFlags=”scroll|enterAlways”屬性,這個屬性表示在向上滑的時候,Toolbar會跟隨滑動並且在屏幕上消失,向下滑的時候,Toolbar出現。如下所示:
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_collapseMode="pin"
app:layout_scrollFlags="scroll|enterAlways" />
步驟3:設置可滑動控制項和Behavior
在布局文件中,需要定義一個可滑動的控制項(如RecyclerView或ListView等),並設置app:layout_behavior屬性為AppBarLayout.ScrollingViewBehavior,這個屬性告訴CoordinatorLayout,該控制項的滑動行為需要與AppBarLayout關聯。
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
步驟4:設置聯動效果
接下來,在Activity的Java文件中,需要處理NestedScrollView和RecyclerView的聯動效果。在ScrollView滾動的時候,需要設置RecyclerView的滑動狀態,即setNestedScrollingEnabled(false)或setNestedScrollingEnabled(true)。如下所示:
NestedScrollView scrollView = findViewById(R.id.nestedScrollView);
RecyclerView recyclerView = findViewById(R.id.recyclerView);
scrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
@Override
public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
recyclerView.setNestedScrollingEnabled(scrollY != 0);
}
});
四、總結
NestedScrollView的滑動嵌套控制項的聯動效果可以通過結合AppBarLayout、CollapsingToolbarLayout和Toolbar等控制項,以及RecyclerView或ListView等可滑動的控制項來實現。需要注意設置布局屬性、Behavior和設置聯動效果等細節。
完整代碼示例:
布局文件:
<android.support.design.widget.CoordinatorLayout
android:layout_height="match_parent"
android:layout_width="match_parent">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.design.widget.CollapsingToolbarLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<ImageView
android:layout_width="match_parent"
android:layout_height="300dp"
app:layout_collapseMode="parallax" />
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_collapseMode="pin" />
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v4.widget.NestedScrollView
android:id="@+id/nestedScrollView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>
Java文件:
NestedScrollView scrollView = findViewById(R.id.nestedScrollView);
RecyclerView recyclerView = findViewById(R.id.recyclerView);
scrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
@Override
public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
recyclerView.setNestedScrollingEnabled(scrollY != 0);
}
});
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/309525.html