Android 坐标布局和AppBar布局立面图

Android 坐标布局和AppBar布局立面图,android,android-layout,coordinator-layout,Android,Android Layout,Coordinator Layout,我创建了一个像这样的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="@d

我创建了一个像这样的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>

这实际上是
折叠工具栏布局的一个实现细节,如图所示:


折叠工具栏布局
显示未固定的图元时,它将删除高程-默认情况下,只有当仅固定的子项可见时,它才会具有高程。

原因如上所述,请尝试以下方法解决:

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

解决方案是使用
app:elevation=0dp
删除默认高程,并将
android:translationZ
设置为所需高程

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


的文档说明可以使用
app:elevation
属性设置自定义高程值,但对于大于
0dp
的值,它不适用于我,因此我使用
translationZ
作为解决方法。

setTargetElevation()
现在不推荐用于AppBarLayout

基于布局状态将自定义高程应用于AppBarLayout的新正确实现是使用StateListAnimator。 如您所见,“材质组件”使用此选项

我在中添加了始终显示AppBarLayout高程的示例实现

你所需要的只是一个。在
/res/animator
和2下创建自定义状态列表animator。将AppBarLayout的StateListAnimator设置为:

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

我想知道为什么这个答案获得了很多选票。如果作者没有固定的元素怎么办?@LeoDroidcoder-绝大多数
折叠工具栏布局
用法都有固定的
工具栏
,因此得名。如果不是这样,您可能根本不想或不需要使用
折叠工具栏布局
。可能有一个固定的
工具栏
,它将允许在折叠状态下绘制阴影
折叠工具栏布局
。但是许多开发人员想要的是在扩展状态下绘制阴影,即使用任何值
verticalOffset
。尽管它可能与最新AndroidX库的Android 10上的材质设计指南不一致:有时立面是您要求的,有时是默认的(当在NestedView中滚动时),有时只是消失了(当折叠工具栏布局处于展开状态时)。
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);
}
appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
        @Override
        public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
            //some other code here
            ViewCompat.setElevation(appBarLayout, The Elevation In Px);
        }
    });
appBarLayout.stateListAnimator = AnimatorInflater.loadStateListAnimator(context, R.animator.appbar_always_elevated_state_list_animator)