【问题标题】:CoordinatorLayout and AppBarLayout elevationCoordinatorLayout 和 AppBarLayout 高程
【发布时间】:2016-03-12 09:21:21
【问题描述】:

我已经创建了这样的 AppBar 布局

<android.support.design.widget.AppBarLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/appbar_layout"
    android:layout_height="@dimen/app_bar_height"
    android:layout_width="match_parent"
    android:fitsSystemWindows="true"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:elevation="20dp">

    <android.support.design.widget.CollapsingToolbarLayout...>
</android.support.design.widget.AppBarLayout>

它在 LinearLayout 中起作用并投射阴影:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <include layout="@layout/app_bar_large" />
</LinearLayout>

但是当我把它放到 CoordinatorLayout 中时,阴影就消失了:

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <include layout="@layout/app_bar_large" />
</android.support.design.widget.CoordinatorLayout>

如何让 appbar 再次显示它的影子?

【问题讨论】:

    标签: android android-layout coordinator-layout


    【解决方案1】:

    这其实是CollapsingToolbarLayout的一个实现细节,见source code

    if (Math.abs(verticalOffset) == scrollRange) {
      // If we have some pinned children, and we're offset to only show those views,
      // we want to be elevate
      ViewCompat.setElevation(layout, layout.getTargetElevation());
    } else {
      // Otherwise, we're inline with the content
      ViewCompat.setElevation(layout, 0f);
    }
    

    CollapsingToolbarLayout 显示非固定元素时,它会移除高度 - 默认情况下,只有当只有固定的子元素可见时才会有高度。

    【讨论】:

    • 我想知道为什么这个答案得到了很多赞成。如果作者没有固定元素怎么办?
    • @LeoDroidcoder - 绝大多数CollapsingToolbarLayout 用法都在其中固定了Toolbar,因此得名。如果不是这种情况,您可能根本不想或不需要使用CollapsingToolbarLayout
    • 可能有一个固定的Toolbar 可以在CollapsingToolbarLayout 的折叠状态下绘制阴影。但许多开发人员想要的也是以展开状态绘制阴影,即任何值 verticalOffset。即使它可能与 Material Design 指南相矛盾
    【解决方案2】:

    原因如上,试试这个解决:

    appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
            @Override
            public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
                //some other code here
                ViewCompat.setElevation(appBarLayout, The Elevation In Px);
            }
        });
    

    【讨论】:

    • 在具有最新 AndroidX 库的 Android 10 上工作不一致:有时高度是您要求的高度,有时是默认高度(在 NestedView 中滚动时),有时它就消失了(当 CollapsingToolbarLayout处于展开状态)。
    【解决方案3】:

    解决办法是用app:elevation=0dp去掉默认的高程,把android:translationZ设置成你想要的高程。

    注意:以下代码使用最新的 AndroidX / Material 库,如果您使用旧的支持库,可能无法正常工作

    <com.google.android.material.appbar.AppBarLayout
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:translationZ="8dp"
        app:elevation="0dp">
    
        <!--
          * `app:elevation=0dp` disables the default shadow that is automatically added on
          scroll ; other values e.g. `6dp` are ignored despite what the official doc says
          (see below)
          * so instead we're using `android:translationZ` to add a shadow with a custom
          elevation
        -->
    

    AppBarLayout # setTargetElevation() 的文档指出您可以使用 app:elevation 属性设置自定义海拔值,但它不适用于大于 0dp 的值,所以我使用 translationZ 作为一种解决方法。

    【讨论】:

      【解决方案4】:

      setTargetElevation() 现在已被 AppBarLayout 弃用。

      根据布局状态将自定义高程应用到 AppBarLayout 的新正确实现是使用 StateListAnimator。 如您所见,material-components 使用它here

      我在this gist 中添加了始终显示 AppBarLayout 高度的示例实现。

      您只需要 1. 在 /res/animator 下创建一个自定义状态列表动画器 2. 像这样设置 AppBarLayout 的 StateListAnimator:

      appBarLayout.stateListAnimator = AnimatorInflater.loadStateListAnimator(context, R.animator.appbar_always_elevated_state_list_animator)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-07
        • 1970-01-01
        • 1970-01-01
        • 2015-08-23
        • 1970-01-01
        • 2015-09-27
        相关资源
        最近更新 更多