Изменение уровня AppBarLayout задерживается на appCompat v24.0.0
В Appcompat v24.0.0 вызывает отображение тени/возвышения до AppbarLayout
после видимости Activity. И отставание можно легко увидеть в теневом чертеже до AppbarLayout
.
И это отставание не было в предыдущей версии библиотеки Appcompat.
Протестировано с использованием как Appcompat v24.0.0, так и Appcompat v23.4.0, теневой рисунок, четко видный в новой версии.
Ответы
Ответ 1
Это ошибка в Appcompat v24.0.0
.
Ссылки: https://code.google.com/p/android/issues/detail?id=213895
Чтобы свести к минимуму задержку при рисовании elevation
, установите длительность 1 мс в свой собственный StateListAnimator
и примените ее к AppbarLayout
.
appbar_always_elevated.xml в папке аниматор-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>
Ответ 2
Крис Банес сказал здесь:
StateListAnimator теперь владеет всеми обработками высоты. Если вы хотите сделать это самостоятельно, установите нулевой StateListAnimator и вызовите setElevation(), как вам удобно.
Итак, если ваш AppBarLayout
не сжимается, вы можете использовать это:
<android.support.design.widget.AppBarLayout
android:stateListAnimator="@null"
android:elevation="@dimen/design_appbar_elevation">
Ответ 3
Я предполагаю, что это не ошибка, а функция.
Продолжительность анимации возвышения AppBarLayout контролируется R.integer.app_bar_elevation_anim_duration
, который по умолчанию равен 150
.
Чтобы удалить анимацию, выполните следующие действия:
<integer name="app_bar_elevation_anim_duration" tools:override="true">0</integer>
Ответ 4
@Vipul Asri дал нам хороший ответ, но appbar_always_elevated.xml должен быть в аниматоре-v11 вместо аниматора-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, этот случай, теневой вид немного отличается.