【问题标题】:Adding the effects of a RippleDrawable and a StateListDrawable to a RecyclerView将 RippleDrawable 和 StateListDrawable 的效果添加到 RecyclerView
【发布时间】:2014-12-05 17:55:25
【问题描述】:

我正在开发一个在大型设备上使用双窗格布局的应用程序,类似于here 的详细说明。布局摘要;一个窗格包含选项列表,而另一个窗格将显示有关从另一个窗格中选择的选项的详细信息。

现在在选择一个选项时,存在在选择其他元素(按钮,复选框等)时看到的纹波效果,但动画完成元素后返回之前的颜色。我想在动画完成后保留涟漪中的高光,但我无法弄清楚如何实现这一点。

这就是我的波纹背景目前的样子。 focus 选择器没有做任何事情 - 无法弄清楚如何实际赋予元素焦点。我也尝试过使用selected 选择器,但这会立即发生,覆盖波纹。

<?xml version="1.0" encoding="utf-8"?>
    <ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="?android:colorAccent">
    <item android:id="@android:id/mask"
        android:drawable="@android:color/black" />
    <item>
        <selector>
            <item android:state_focused="true"
                android:drawable="@color/accent" />
        </selector>
    </item>
</ripple>

重申一下,我的问题是:是否有可能同时出现涟漪效应和突出显示的选择,如果可以,如何?

【问题讨论】:

  • 一个 hacky 解决方案(我尝试过并且有效)是将您的项目背景设置为 selector,并使用您的波纹的默认项目(没有其选择器)和 checked 状态。然后,在点击时,postDelayed 将您的视图状态设置为选中(您需要实现Checkable)。尝试不那么难的东西 - 因为RippleDrawable 只是一个LayerDrawable,请尝试覆盖onStateChange 以检测按下状态,然后(手动)将“内容”层的背景更改为其他内容,以便在动画完成时,您会看到选定的颜色。

标签: android android-5.0-lollipop android-recyclerview rippledrawable


【解决方案1】:

这为我保留了选择时的波纹动画。

与您的波纹可绘制使用:

<?xml version="1.0" encoding="utf-8"?>
    <item>
        <selector>
            <item android:state_selected="true"
                  android:drawable="@color/selected_color" />
            <item android:drawable="@color/normal_color" />
        </selector>
    </item>
</ripple>

在您的适配器上,调用 setHasStableIds(true) 并实现 getItemId 以返回代表您的行的唯一值。

当一个项目被选中时,做:

ViewHolder oldViewHolder = (ViewHolder) recyclerView.findViewHolderForItemId(oldItemId);
oldViewHolder.itemView.setSelected(false);

ViewHolder newViewHolder = (ViewHolder) recyclerView.findViewHolderForItemId(newItemId);
newViewHolder.itemView.setSelected(true);

也在您的适配器中:

@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {

    ...

    viewHolder.itemView.setSelected(isSelected);

    ...
}

附带说明,焦点选择器用于在使用方向键的设备(如电视和一些旧手机)上突出显示导航。

【讨论】:

    【解决方案2】:

    我也为此苦苦挣扎。 我最终使用了&lt;layer-list/&gt;

    您可以在与您的问题非常相似的答案中查看我的解决方案:https://stackoverflow.com/a/31335539/844206

    【讨论】:

      猜你喜欢
      • 2015-09-05
      • 1970-01-01
      • 2013-03-01
      • 2019-02-10
      • 2018-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-03
      相关资源
      最近更新 更多