在Appcompat v24.0.0中,会在 Activity 可见后渲染阴影/高度。AppbarLayout
在阴影绘图中很容易看到滞后AppbarLayout
。
而这种滞后在以前的 Appcompat 库版本中是不存在的。
使用Appcompat v24.0.0和Appcompat v23.4.0测试,在新版本中可以清楚地看到阴影绘制。
在Appcompat v24.0.0中,会在 Activity 可见后渲染阴影/高度。AppbarLayout
在阴影绘图中很容易看到滞后AppbarLayout
。
而这种滞后在以前的 Appcompat 库版本中是不存在的。
使用Appcompat v24.0.0和Appcompat v23.4.0测试,在新版本中可以清楚地看到阴影绘制。
这是Appcompat v24.0.0
.
参考资料:https ://code.google.com/p/android/issues/detail?id=213895
为了尽量减少画图的延迟,自己elevation
设置duration为1msStateListAnimator
,应用到AppbarLayout
.
appbar_always_elevated.xml在res目录下的animator-v21文件夹中。
<?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>
Chris Banes在这里说:
StateListAnimator 现在拥有所有的高程处理。如果您想自己做,请设置一个 null StateListAnimator 并根据需要调用 setElevation()。
因此,如果您AppBarLayout
的不可折叠,您可以使用它:
<android.support.design.widget.AppBarLayout
android:stateListAnimator="@null"
android:elevation="@dimen/design_appbar_elevation">
我想这不是一个错误,一个功能。
AppBarLayout 的高程动画持续时间由其控制R.integer.app_bar_elevation_anim_duration
,默认为150
.
要删除动画,只需执行以下操作即可:
<integer name="app_bar_elevation_anim_duration" tools:override="true">0</integer>
@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在具有 android:stateListAnimator 属性的v21文件夹中和没有此属性的非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 属性,阴影视图会有些不同。