自定义列表视图绘制

3

我想在ListView上方绘制一个叠加层。因此,我选择了最明显的方法,并将自定义绘图代码放置在ListView子类的super.onDraw(canvas)下面。

令我惊讶的是,列表是在我的自定义绘图之上呈现的。我知道可以通过将ListView包装在FrameLayout中轻松实现此功能,但我认为没有必要再加载另一个视图。修复此问题并解释为什么会遇到此问题将非常棒,谢谢!

我的绘图代码大致如下:

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawRect(rect, paint);
}
2个回答

6
ListView的特点在于它实际上并不绘制列表内容。这是由绑定到列表的Adapter处理的,或者更具体地说是由Adapter创建的那些填充ListView的Views处理的。
ListView的onDraw方法在包含的Views被创建和显示之前发生。
在ListView上绘制东西可能会很昂贵,因为你正在将另一个图层合成到已经复杂的View上面。像你建议的使用FrameLayout放置另一个View在顶部可能是做你所尝试的事情的“最佳”方法,或者(根据你试图实现的效果),你可以修改Adapter或Views以显示你要覆盖的数据。

4
覆盖 onDraw 方法,而不是 dispatchDraw 方法似乎可以实现您的需求:
@Override
protected void dispatchDraw(Canvas canvas) {
    super.dispatchDraw(canvas);
    ...
}

这就是我一直在寻找的! - themarshal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接