【发布时间】:2018-04-02 15:12:28
【问题描述】:
我有一个带有 2 个 ItemDecorations 的 RecyclerView。 如何指定每个 ItemDecoration 的高程(z-index),以设置将哪一个绘制在另一个之上?
【问题讨论】:
标签: android android-recyclerview z-index item-decoration
我有一个带有 2 个 ItemDecorations 的 RecyclerView。 如何指定每个 ItemDecoration 的高程(z-index),以设置将哪一个绘制在另一个之上?
【问题讨论】:
标签: android android-recyclerview z-index item-decoration
来自documentation for RecyclerView.addItemDecoration():
物品装饰已订购。列表中较早放置的装饰将首先运行/查询/绘制,以了解它们对项目视图的影响。添加到视图的填充将被嵌套;由较早装饰添加的填充将意味着列表中的其他项目装饰将被要求在前一个装饰的给定区域内绘制/填充。
所以基本上,如果你写:
recycler.addItemDecoration(decoration1);
recycler.addItemDecoration(decoration2);
绘图将是:
decoration1.onDrawdecoration2.onDrawdecoration1.onDrawOverdecoration2.onDrawOver这样做的结果是,稍后添加的ItemDecorations 将在之前添加的基础上绘制。从技术上讲,z-index 仍然是相同的,但如果 decoration1 全部绘制为蓝色,decoration2 将同一事物绘制为红色,那么您会看到红色。
【讨论】:
ItemDecorations 只匹配 RecyclerView afaik 的 Z 索引。 ItemDecoration.onDraw(...) documentation 暗示了这一点,因为它为您的 draw 方法提供了 RecyclerView 的画布:
void onDraw (Canvas c, RecyclerView 父级, 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>
【讨论】: