在这种情况下,问题与RecyclerView有关,在这里我想要使用涟漪效果来动画(大致如果不完全)从手指触摸自定义颜色到视图的完整范围,就像一个listview行在视图的布局方面,最后以另一种颜色选择行结束其动画。
我有
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>
测试结果不好
我已经对以下设备进行了测试,其中涟漪效果动画过早停止,导致更多的“blip”/“ping”,而不是视图边缘的完全展开。
测试结果良好
我已经对以下设备进行了测试,其中涟漪效果动画以其完整的长度动画精美到视图的边缘:
我不能为我的生活弄清楚这是怎么回事。 N6和N5X看起来非常糟糕,因为动画在中途停止,动画停止时没有明显的模式。
我已经阅读了很多SO问题以及RecyclerView,StateListDrawable和RippleDrawable文档,但是没有任何解释可以解释我看到的行为。
我最接近的,就是我目前正在使用的内容,以及我在这篇文章中就代码分享的内容,来自这个答案https://stackoverflow.com/a/31335539/975641
有没有人知道为什么会发生这种情况以及如何解决这个问题?
答案 0 :(得分:1)
我不知道为什么它在棉花糖中起作用的具体原因,而不是牛轧糖。但是,最常见的是当您看到此问题时,这是因为RecyclerAdapter#notifyItemChanged(int)
刷新和/或重新绑定太多了。
基本上会发生什么是
最常见的情况是,在调用RecyclerAdapter#notifyDatasetChanged()
方法或RecyclerView.Adapter#notifyItem____
次数过多时会发生这种情况。
如果可能,最好使用notifyDatasetChanged()
方法。 notifyItem_____
将导致列表中所有项目的重新绑定。使用nofityDatasetChanged()
方法将确保只在需要时更新单个项目。否则,您需要确保仅在数据集中存在实际更改时才调用invalidate
。
另一个常见问题是,如果应用在RecyclerView
或RecyclerView
的任何父级中调用RecyclerView
。这将导致刷新整个View树,这需要重新绑定greeting
中的所有项目。