AppBarLayout 高度更改在 appCompat v24.0.0 上延迟

AppBarLayout elevation change is delayed on appCompat v24.0.0

Appcompat v24.0.0 中导致 shadow/elevation 在 Activity 之后渲染到 AppbarLayout是可见的。在 AppbarLayout.

的阴影绘制中很容易看出滞后

并且在以前的 Appcompat 库版本中没有这种延迟。

同时使用 Appcompat v24.0.0Appcompat v23.4.0 进行测试,在新版本中可以清楚地看到阴影绘图。

这是 Appcompat v24.0.0 中的错误。

References: https://code.google.com/p/android/issues/detail?id=213895

为了尽量减少elevation绘图的延迟,在自己的StateListAnimator中将持续时间设置为1ms并应用到AppbarLayout.

appbar_always_elevated.xmlanimator-v21文件夹下res目录.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item>
        <objectAnimator android:propertyName="elevation"
                        android:valueTo="8dp"
                        android:valueType="floatType"
                        android:duration="1"/>
    </item>

</selector>

在 AppbarLayout 中:

<android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:fitsSystemWindows="true"
        android:stateListAnimator="@animator/appbar_always_elevated"
        android:theme="@style/AppTheme.AppBarOverlay">

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

克里斯·贝恩斯说 here

The StateListAnimator owns all elevation handling now. If you want to do it yourself, set a null StateListAnimator and call setElevation() as you please.

因此,如果您的 AppBarLayout 不可折叠,您可以使用此:

<android.support.design.widget.AppBarLayout
    android:stateListAnimator="@null"
    android:elevation="@dimen/design_appbar_elevation">

@Vipul Asri 给了我们一个很好的答案,但是 appbar_always_elevated.xml 应该是 animator-v11 而不是 animator-v21 文件夹。具有 AppbarLayout 的布局应该放在 v21 文件夹中。

总结一下,结构是这样的:

-res
   -animator-v11
      -appbar_always_elevated.xml
   -layout
      -a_layout_wich_has_the_appbarlayout.xml
   -layout-v21
      -a_layout_wich_has_the_appbarlayout.xml

注意有两个a_layout_wich_has_the_appbarlayout.xml文件(AppbarLayoutv21 android:stateListAnimator 属性 的文件夹和没有 属性 的非 v21 文件夹。

看一看:

在非 v21 布局文件夹中:

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

并且,在 v21 布局文件夹中:

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:stateListAnimator="@animator/appbar_always_elevated">

编辑

奇怪的是,如果您将 AppbarLayoutTabLayout 一起使用,则会立即绘制阴影,但请注意,如果您正在使用android:stateListAnimator 属性 这种情况下,阴影视图有点不同。

我想这不是错误,而是一个功能。

AppBarLayout 的 elevation 动画持续时间由 R.integer.app_bar_elevation_anim_duration 控制,默认为 150.

要删除动画,只需执行以下操作即可:

<integer name="app_bar_elevation_anim_duration" tools:override="true">0</integer>