当前位置: 首页 > 知识库问答 >
问题:

使用Android的RecolyerView时,在滑动行下添加带有文本/图标的彩色背景

陶刚豪
2023-03-14

编辑:真正的问题是我的linearlayout被包装在另一个布局中,这导致了不正确的行为。Sanvywell的公认答案比我在问题中提供的代码片段更好、更完整地说明了如何在滑动视图下绘制颜色。

现在RecyclerView小部件已经在ItemTouchHelper类的帮助下对行滑动提供了原生支持,我尝试在一个行的行为将与Google的Inbox应用程序类似的应用程序中使用它。也就是说,向左侧滑动执行一个动作,向右侧滑动执行另一个动作。

使用ItemTouchHelper.SimpleCallback的OnSwiped方法很容易实现操作本身。然而,我无法找到一个简单的方法来设置颜色和图标,应该出现在当前正在刷的视图下(就像在谷歌的收件箱应用程序)。

为此,我尝试重写ItemTouchHelper.SimpleCallback的onChildDraw方法,如下所示:

@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView,
                        RecyclerView.ViewHolder viewHolder, float dX, float dY,
                        int actionState, boolean isCurrentlyActive) {
    RecyclerViewAdapter.ViewHolder vh = (RecyclerViewAdapter.ViewHolder) viewHolder;
    LinearLayout ll = vh.linearLayout;

    Paint p = new Paint();
    if(dX > 0) {
        p.setARGB(255, 255, 0, 0);
    } else {
        p.setARGB(255, 0, 255, 0);
    }

    c.drawRect(ll.getLeft(), ll.getTop(), ll.getRight(), ll.getBottom(), p);

    super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}

从dX确定滑动方向并设置适当的颜色可以按照预期工作,但我从ViewHolder获得的坐标总是对应于第一个LinearLayout充气的地方。

如何为当前划过的行中的linearlayout获取正确的坐标?有没有更简单的方法(不需要重写onChildDraw)来设置背景颜色和图标?

共有1个答案

尤研
2023-03-14

我也在努力实现这个特性,但是您把我引向了正确的方向。

@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
    if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
        // Get RecyclerView item from the ViewHolder
        View itemView = viewHolder.itemView;

        Paint p = new Paint();
        if (dX > 0) {
            /* Set your color for positive displacement */

            // Draw Rect with varying right side, equal to displacement dX
            c.drawRect((float) itemView.getLeft(), (float) itemView.getTop(), dX,
                    (float) itemView.getBottom(), p);
        } else {
            /* Set your color for negative displacement */

            // Draw Rect with varying left side, equal to the item's right side plus negative displacement dX
            c.drawRect((float) itemView.getRight() + dX, (float) itemView.getTop(),
                    (float) itemView.getRight(), (float) itemView.getBottom(), p);
        }

        super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
    }
}
 类似资料:
  • 我有一个奇怪的问题,老实说,我不知道该怎么做。 我有一个背景图像的盒子。在背景图片上,我有很多带有背景颜色和文字的框。我希望每个框中的文本的颜色是透明的,所以颜色将是文本上面的背景图像的一部分。 这里有一个例子:http://jsfiddle.net/wjdwohdd/5/ 它应该是一个图像,而不是绿色背景。 如果我设置颜色:透明,文本的颜色变成红色,我不确定它是否可以作为背景图片。 编辑:我更新

  • 我已经做了一些研究,我还没有找到一个示例或实现,允许您在滑动时将一个视图(下面的示例图像)放在RecyclerView下面。是否有人有任何例子或想法,如何实现这将不使用库。 下面是我如何实现扫瞄以解除职务。

  • 当我移除Android:BackgroundTint标记时,错误就消失了。知道为什么会这样吗?

  • 我的app里有一些这样的按钮: 我正在尝试创建一个带有文本和图标的按钮。Android:DrawableLeft对我不起作用(也许会,但我不知道如何设置图标的最大高度)。 所以我创建了一个包含ImageView和TextView的LinearLayout,并使其像一个按钮一样运行: 我的新按钮正是我想要的(字体大小,图标和文本放置)。但它看起来不像我的默认按钮: 所以我试着改变新按钮的背景和文本颜