Android kotlin CoordinatorLayout使用筆記(二)

Android kotlin CoordinatorLayout使用筆記(一)
Android kotlin CoordinatorLayout使用筆記(三)
Android kotlin CoordinatorLayout使用筆記(四)

前言

這次會(huì)講解AppbarLayout和NestedScrollView的用法
這兩位都是CoordinatorLayout的???/p>

NestedScrollView
字如其名,就是一個(gè)支持嵌套ScrollView,并且自帶了一個(gè)behavior,加上去之后,就可以把滑動(dòng)事件傳遞到AppbarLayout

app:layout_behavior="@string/appbar_scrolling_view_behavior"

示例代碼

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <View
            android:layout_width="match_parent"
            android:layout_height="50dp"
            app:layout_scrollFlags="scroll"/>

    </com.google.android.material.appbar.AppBarLayout>

    <androidx.core.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/colorAccent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="20sp"
            android:textColor="#000"
            android:padding="10dp"
            android:text="這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本"/>

    </androidx.core.widget.NestedScrollView>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

效果演示

圖1

代碼說明

可以看到,NestedScrollView把滑動(dòng)事件傳遞到了AppbarLayout,使之一起協(xié)調(diào)滑動(dòng)
細(xì)心的我們發(fā)現(xiàn)了,AppBarLayout里面使用了layout_scrollFlags這個(gè)屬性,不急,接下來我們就說說AppBarLayout

AppBarLayout 繼承自LinearLayout,布局方向?yàn)榇怪狈较?。所以我們可以把它?dāng)成垂直布局的LinearLayout來使用,其內(nèi)部加入了一些屬性輔助我們來實(shí)現(xiàn)各種酷炫效果

layout_scrollFlags

scroll: 值設(shè)為scroll的View會(huì)跟隨滾動(dòng)事件一起發(fā)生移動(dòng)。就是當(dāng)指定的ScrollView發(fā)生滾動(dòng)時(shí),該View也跟隨一起滾動(dòng),就好像這個(gè)View也是屬于這個(gè)ScrollView一樣。

效果就是圖1,上面已經(jīng)演示了

enterAlways: 值設(shè)為enterAlways的View,當(dāng)任何時(shí)候ScrollView往下滾動(dòng)時(shí),該View會(huì)直接往下滾動(dòng)。而不用考慮ScrollView是否在滾動(dòng)到最頂部還是哪里

我們把layout_scrollFlags改動(dòng)如下:

app:layout_scrollFlags="scroll|enterAlways"

snap :這個(gè)屬性讓控件變得有彈性,如果控件下拉了75%的高度,就會(huì)自動(dòng)展開,如果只有25%顯示,就會(huì)反彈回去關(guān)閉。

   app:layout_scrollFlags="scroll|snap"

exitUntilCollapsed:值設(shè)為exitUntilCollapsed的View,當(dāng)這個(gè)View要往上逐漸“消逝”時(shí),會(huì)一直往上滑動(dòng),直到剩下的的高度達(dá)到它的最小高度后,再響應(yīng)ScrollView的內(nèi)部滑動(dòng)事件

如我們這里設(shè)置了最小高度為20dp,那么會(huì)響應(yīng)完AppBarLayout的20dp,才會(huì)和NestedScrollView一起協(xié)調(diào)滑動(dòng)

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <View
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:minHeight="20dp"
            app:layout_scrollFlags="scroll|exitUntilCollapsed"/>

    </com.google.android.material.appbar.AppBarLayout>

    <androidx.core.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/colorAccent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="20sp"
            android:textColor="#000"
            android:padding="10dp"
            android:text="這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本"/>

    </androidx.core.widget.NestedScrollView>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

enterAlwaysCollapsed:是enterAlways的附加選項(xiàng),一般跟enterAlways一起使用,它是指,View在往下“出現(xiàn)”的時(shí)候,首先是enterAlways效果,當(dāng)View的高度達(dá)到最小高度時(shí),View就暫時(shí)不去往下滾動(dòng),直到ScrollView滑動(dòng)到頂部不再滑動(dòng)時(shí),View再繼續(xù)往下滑動(dòng),直到滑到View的頂部結(jié)束

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:minHeight="40dp">

        <View
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:background="#444"
            app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed"/>

    </com.google.android.material.appbar.AppBarLayout>

    <androidx.core.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/colorAccent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="20sp"
            android:textColor="#000"
            android:padding="10dp"
            android:text="這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本這是一個(gè)長(zhǎng)文本"/>

    </androidx.core.widget.NestedScrollView>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

結(jié)語

以上是AppbarLayout和NestedScrollView的用法,下篇將會(huì)說明下CollapsingToolbarLayout的用法

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

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