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.0 和 Appcompat 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.xml在animator-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文件(AppbarLayout在v21 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">
编辑
奇怪的是,如果您将 AppbarLayout 与 TabLayout 一起使用,则会立即绘制阴影,但请注意,如果您正在使用android:stateListAnimator 属性 这种情况下,阴影视图有点不同。
我想这不是错误,而是一个功能。
AppBarLayout 的 elevation 动画持续时间由 R.integer.app_bar_elevation_anim_duration
控制,默认为 150
.
要删除动画,只需执行以下操作即可:
<integer name="app_bar_elevation_anim_duration" tools:override="true">0</integer>
在 Appcompat v24.0.0 中导致 shadow/elevation 在 Activity 之后渲染到 AppbarLayout
是可见的。在 AppbarLayout
.
并且在以前的 Appcompat 库版本中没有这种延迟。
同时使用 Appcompat v24.0.0 和 Appcompat 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.xml在animator-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文件(AppbarLayout在v21 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">
编辑
奇怪的是,如果您将 AppbarLayout 与 TabLayout 一起使用,则会立即绘制阴影,但请注意,如果您正在使用android:stateListAnimator 属性 这种情况下,阴影视图有点不同。
我想这不是错误,而是一个功能。
AppBarLayout 的 elevation 动画持续时间由 R.integer.app_bar_elevation_anim_duration
控制,默认为 150
.
要删除动画,只需执行以下操作即可:
<integer name="app_bar_elevation_anim_duration" tools:override="true">0</integer>