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

Другие вопросы по тегам