Почему анимация пульсации списка и селектора списка состояний не отображается полностью в 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
слишком много освежает и / или перепривязывает.
В основном, что произойдет,
- Клики пользователей
- Анимация начинается
- Что-то требовало привязки к этому предмету
- RecyclerView вызывает повторную привязку для элемента
- Анимация отменяется, потому что вид сбрасывается.
Чаще всего это происходит при звонке либо RecyclerAdapter#notifyItemChanged(int)
метод или RecyclerAdapter#notifyDatasetChanged()
слишком много раз.
Было бы лучше использовать RecyclerView.Adapter#notifyItem____
методы, если это возможно. notifyDatasetChanged()
вызовет повторную привязку ко всем элементам в списке. С использованием notifyItem_____
методы будут гарантировать, что обновляются только отдельные элементы, когда они должны быть. В противном случае вам нужно убедиться, что только nofityDatasetChanged()
когда есть фактические изменения в наборе данных.
Другая распространенная проблема - вызов приложения invalidate
либо в RecyclerView
или любой родитель RecyclerView
, Это приведет к обновлению всего дерева представления, что потребует повторной привязки для всех элементов в RecyclerView
,