簡體   English   中英

AppBarLayout擴展滾動范圍

[英]AppBarLayout extend scroll range

我有滾動問題,AppBarLayout沒有完全滾動到屏幕外。

如何繼續滾動到狀態欄高度?

但是如果我設置為根布局(CoordinatorLayout)fitsSystemWIndows = false,滾動沒問題,但狀態欄變為沒有alpha通道。

<androidx.coordinatorlayout.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <com.google.android.material.appbar.AppBarLayout
        android:id="@+id/search_appbar"
        android:layout_width="match_parent"
        android:layout_height="50dp">

        <com.google.android.material.appbar.CollapsingToolbarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_scrollFlags="scroll|enterAlways">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">
                ...
                other layouts here
                ...
            </LinearLayout>

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

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

</androidx.coordinatorlayout.widget.CoordinatorLayout>

在此輸入圖像描述

將滾動行為添加到AppbarLayout中的工具欄。

app:layout_scrollFlags="scroll|enterAlways"

編輯: -用以下代碼替換CollapsingToolbarLayout的滾動行為。

app:layout_scrollFlags="scroll|exitUntilCollapsed"

我找到了解決方案

也許有人幫助。

  1. 創建包:com.google.android.material.appbar
  2. 創建擴展AppBarLayout.Behavior的類

結果圖像

package com.google.android.material.appbar

import ...

class OffsetBehavior(c: Context, a: AttributeSet) : AppBarLayout.Behavior(c, a) 
{
    private var mOffset = 0

    fun setOffset(value: Int) {
        mOffset = value
    }

    // completely copy the method onNestedPreScroll from AppBarLaout.Behavior
    // and add some changes
    override fun onNestedPreScroll(coordinatorLayout: CoordinatorLayout, child: AppBarLayout, target: View, dx: Int, dy: Int, consumed: IntArray, type: Int)
    {
        if (dy != 0) {
            val min: Int
            val max: Int

            // scroll down
            if (dy < 0) {
                min = -(child.totalScrollRange + mOffset)
                max = min + child.downNestedPreScrollRange + mOffset
            }
            // scroll up
            else {
                min = -(child.upNestedPreScrollRange + mOffset)
                max = 0
            }
            if (min != max) {
                consumed[1] = scroll(coordinatorLayout, child, dy, min, max)
            }
        }
        if (child.isLiftOnScroll) {
            child.setLiftedState(child.shouldLift(target))
        }
    }
}

然后以XML格式將其設置為AppBarLayout

<com.google.android.material.appbar.AppBarLayout
    android:id="@+id/search_appbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:layout_behavior="com.google.android.material.appbar.OffsetBehavior">
    ...
</com.google.android.material.appbar.AppBarLayout>

在活動中:

(1)增添樂趣

// getting statusbar height
// my phone with Android9 = 96px
// my phone with Android7 = 72px
fun getStatusBarHeight(): Int {
    val id = resources.getIdentifier("status_bar_height", "dimen", "android")
    return if (id > 0) {
        resources.getDimensionPixelSize(id)
    } else {
        0
    }
}

(2)in onCreate()

val lp = search_appbar?.layoutParams as? CoordinatorLayout.LayoutParams
val bh = lp?.behavior as? com.google.android.material.appbar.OffsetBehavior

bh?.setOffset(getStatusBarHeight())

結果:

https://i.stack.imgur.com/pNeze.gif

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM