我正在尝试在ListView上方绘制一个叠加层。所以我采用了最明显的方法,并将我的自定义绘图代码放在我的ListView子类中的super.onDraw(canvas)下面。
令我惊讶的是,列表显示在我的自定义绘图上方。我知道这可以通过将ListView包装在FrameLayout中轻松完成,但我认为不需要膨胀另一个视图。修复和解释为什么我遇到这个问题会很棒,谢谢!
我的绘图代码如下所示:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawRect(rect, paint);
}
答案 0 :(得分:6)
关于ListView的事情是它实际上并没有绘制列表内容。这是由绑定到列表的适配器处理的 - 或者更具体地说是由填充ListView的适配器创建的视图。
ListView的onDraw在创建和显示包含的视图之前发生。
在ListView之上绘制内容可能很昂贵,因为您要在已经复杂的View上方合成另一个层。将另一个视图置于顶部(如您所建议使用FrameLayout)可能是您尝试执行操作的“最佳”方式,或者(取决于您尝试实现的效果),您可以修改适配器或视图显示您尝试叠加的数据。
答案 1 :(得分:4)
覆盖dispatchDraw
代替onDraw
似乎可以做你想要的事情:
@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
...
}