Изменение высоты AppBarLayout задерживается на appCompat v24.0.0
В Appcompat v24.0.0 вызывает рендеринг тени / возвышения в AppbarLayout
после того, как активность видна. И на графике теней легко увидеть отставание AppbarLayout
,
И это отставание не было в предыдущей версии библиотеки Appcompat.
Протестировано с использованием Appcompat v24.0.0 и Appcompat v23.4.0, в новой версии отчетливо виден теневой рисунок.
4 ответа
Это ошибка вAppcompat v24.0.0
,
Ссылки: https://code.google.com/p/android/issues/detail?id=213895
Чтобы минимизировать задержку в elevation
рисунок, установите продолжительность 1 мс в вашем собственном StateListAnimator
и применить его к 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>
Крис Бейнс сказал здесь:
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 Асри дал нам хороший ответ, но 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, то в этом случае представление тени будет немного другим.