Почему анимация пульсации списка и селектора списка состояний не отображается полностью в API24?

В этом случае вопрос относится к RecyclerView, где я бы хотел, чтобы эффект пульсации анимировал (примерно, если не точно), с того места, где палец касался пользовательского цвета до полного размера представления, во многом как строка списка в условия макета представления и, наконец, заканчивают анимацию строкой, выделенной другим цветом.

я имею

items_row.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/rowLayout"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:orientation="horizontal"
  android:paddingBottom="5dp"
  android:paddingTop="5dp"
  android:background="@drawable/items_ripple_state_selector"
  >

  <RelativeLayout
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:gravity="center">

    <TextView
      android:id="@+id/item_unit"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_below="@+id/item_amount"
      android:layout_centerHorizontal="true"
      android:gravity="center"
      android:text="unit" />

    <TextView
      android:id="@+id/item_amount"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_alignParentTop="true"
      android:layout_centerHorizontal="true"
      android:gravity="center"
      android:text="amount" />
  </RelativeLayout>

  <RelativeLayout
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="4.6"
    android:gravity="center_vertical">

    <TextView
      android:id="@+id/item_title"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="title"
      android:textAppearance="?android:attr/textAppearanceLarge" />

    <TextView
      android:id="@+id/item_description"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_alignLeft="@+id/item_title"
      android:layout_alignWithParentIfMissing="true"
      android:layout_below="@+id/item_title"
      android:text="description" />
  </RelativeLayout>
</LinearLayout>

а также

items_ripple_state_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  <item>
    <selector>
      <item android:state_pressed="true" android:drawable="@color/state_activated" />
      <item android:state_selected="true" android:drawable="@color/state_selected" />
      <item android:drawable="@android:color/transparent" />
    </selector>
  </item>
  <item>
    <ripple android:color="@color/primary">
      <item android:id="@android:id/mask">
        <color android:color="@android:color/white" />
      </item>
    </ripple>
  </item>
</layer-list>

Тесты, которые вышли плохими

Я провел тесты на следующих устройствах, в которых анимация волнового эффекта останавливается слишком рано, приводя скорее к "щелчку"/"пингу", а не к полному расширению до краев вида.

  • Nexus 6, Nougat (7.0.0), API 24
  • Nexus 5X, Nougat (7.xx), не 100% на минорной версии
  • Целевой уровень API для различных AVD 24

Тесты, которые вышли хорошие

Я провел тесты на следующих устройствах, в которых анимация волнового эффекта прекрасно анимируется в том, что, как я ожидаю, это полная длина до краев вида:

  • Nexus 5, Marshmallow (6.0.1), уровень API 23
  • Nexus 4, Lollipop (5.1.1), уровень API 22

Я не могу на всю жизнь понять, что происходит с этим. Это выглядит довольно ужасно на N6 и N5X, так как анимация останавливается на полпути, без четкой картины, когда анимация останавливается.

Я прочитал довольно много SO вопросов, а также документацию RecyclerView, StateListDrawable и RippleDrawable, но просто нет ничего, что могло бы объяснить поведение, которое я вижу.

Самое близкое, что я пришел, - это то, что я сейчас использую, и то, что я поделился в этом посте с точки зрения кода, пришло из этого ответа /questions/25006898/effekt-ryabi-android-pereopredelennyij-vyibrannyim-sostoyaniem/25006914#25006914

У кого-нибудь есть идея, почему это происходит и как это исправить?

1 ответ

Решение

Я не знаю конкретной причины, по которой он работает в "Зефире", но не в нуге. Тем не менее, чаще всего, когда вы видите эту проблему, это потому, что RecyclerView слишком много освежает и / или перепривязывает.

В основном, что произойдет,

  1. Клики пользователей
  2. Анимация начинается
  3. Что-то требовало привязки к этому предмету
  4. RecyclerView вызывает повторную привязку для элемента
  5. Анимация отменяется, потому что вид сбрасывается.

Чаще всего это происходит при звонке либо RecyclerAdapter#notifyItemChanged(int) метод или RecyclerAdapter#notifyDatasetChanged() слишком много раз.

Было бы лучше использовать RecyclerView.Adapter#notifyItem____ методы, если это возможно. notifyDatasetChanged() вызовет повторную привязку ко всем элементам в списке. С использованием notifyItem_____ методы будут гарантировать, что обновляются только отдельные элементы, когда они должны быть. В противном случае вам нужно убедиться, что только nofityDatasetChanged() когда есть фактические изменения в наборе данных.

Другая распространенная проблема - вызов приложения invalidate либо в RecyclerView или любой родитель RecyclerView, Это приведет к обновлению всего дерева представления, что потребует повторной привязки для всех элементов в RecyclerView,

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