Изменение уровня 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, этот случай, теневой вид немного отличается.