为什么列表和状态列表选择器波动动画不能完全在API24上绘制?

时间:2017-02-22 21:50:32

标签: android android-recyclerview rippledrawable statelistdrawable

在这种情况下,问题与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”,而不是视图边缘的完全展开。

  • Nexus 6,Nougat(7.0.0),API 24
  • Nexus 5X,Nougat(7.x.x),小版本不是100%
  • 不同AVD的目标API级别24

测试结果良好

我已经对以下设备进行了测试,其中涟漪效果动画以其完整的长度动画精美到视图的边缘:

  • Nexus 5,Marshmallow(6.0.1),API level 23
  • Nexus 4,Lollipop(5.1.1),API等级22

我不能为我的生活弄清楚这是怎么回事。 N6和N5X看起来非常糟糕,因为动画在中途停止,动画停止时没有明显的模式。

我已经阅读了很多SO问题以及RecyclerView,StateListDrawable和RippleDrawable文档,但是没有任何解释可以解释我看到的行为。

我最接近的,就是我目前正在使用的内容,以及我在这篇文章中就代码分享的内容,来自这个答案https://stackoverflow.com/a/31335539/975641

有没有人知道为什么会发生这种情况以及如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

我不知道为什么它在棉花糖中起作用的具体原因,而不是牛轧糖。但是,最常见的是当您看到此问题时,这是因为RecyclerAdapter#notifyItemChanged(int)刷新和/或重新绑定太多了。

基本上会发生什么是

  1. 用户点击
  2. 动画开始
  3. 要求在该项目上重新绑定
  4. RecyclerView调用项目的重新绑定
  5. 因视图重置而取消动画。
  6. 最常见的情况是,在调用RecyclerAdapter#notifyDatasetChanged()方法或RecyclerView.Adapter#notifyItem____次数过多时会发生这种情况。

    如果可能,最好使用notifyDatasetChanged()方法。 notifyItem_____将导致列表中所有项目的重新绑定。使用nofityDatasetChanged()方法将确保只在需要时更新单个项目。否则,您需要确保仅在数据集中存在实际更改时才调用invalidate

    另一个常见问题是,如果应用在RecyclerViewRecyclerView的任何父级中调用RecyclerView。这将导致刷新整个View树,这需要重新绑定greeting中的所有项目。