我有一个带有 2 个 ItemDecorations 的 RecyclerView。如何指定每个 ItemDecoration 的高程(z-index),以设置将哪个项目绘制在另一个项目之上?
2 回答
从文档中RecyclerView.addItemDecoration()
:
物品装饰已订购。列表中较早放置的装饰将首先运行/查询/绘制,以了解它们对项目视图的影响。添加到视图的填充将被嵌套;由较早装饰添加的填充将意味着列表中的其他项目装饰将被要求在前一个装饰的给定区域内绘制/填充。
所以基本上,如果你写:
recycler.addItemDecoration(decoration1);
recycler.addItemDecoration(decoration2);
图纸将是:
decoration1.onDraw
decoration2.onDraw
- 正常的RecyclerView绘图
decoration1.onDrawOver
decoration2.onDrawOver
这样做的结果是,ItemDecoration
稍后添加的 s 将在之前添加的之上绘制。z-index 在技术上仍然是相同的,但是如果decoration1
全部绘制为蓝色并decoration2
以红色绘制相同的东西,您会看到红色。
ItemDecorations 只匹配 RecyclerView afaik 的 Z 索引。ItemDecoration.onDraw(...)文档暗示了这一点,因为它为您的 draw 方法提供了 RecyclerView 的画布:
void onDraw (Canvas c, RecyclerView parent, RecyclerView.State state) 在提供给 RecyclerView 的 Canvas 中绘制任何适当的装饰。通过此方法绘制的任何内容都将在绘制项目视图之前绘制,因此将出现在视图下方。
这可能是 ItemDecoration.onDrawOver(...) 也是一种方法的原因之一。
为了进一步说明,在 RecyclerView 上,它告诉您它基于索引/插入来确定它们何时被绘制
* Add an {@link ItemDecoration} to this RecyclerView. Item decorations can
* affect both measurement and drawing of individual item views.
*
* <p>Item decorations are ordered. Decorations placed earlier in the list will
* be run/queried/drawn first for their effects on item views. Padding added to views
* will be nested; a padding added by an earlier decoration will mean further
* item decorations in the list will be asked to draw/pad within the previous decoration's
* given area.</p>