2

我正在扩展线性布局:

public class MyLinearLayout extends LinearLayout {
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        Paint paint = new Paint();
        paint.setColor(0xFFFF0000);
        canvas.drawLine(0, 0, getWidth(), getHeight(), paint);
    }
}

如果布局有子元素,上面的红线不应该画在上面吗?考虑如下布局:

<MyLinearLayout>
    <ImageView />
</MyLinearLayout>

我希望在子 ImageView 上方绘制红线。但它被画在它下面。我假设在 super.onDraw() 行完成后所有子绘图都已完成。

有没有办法在所有子绘图完成后到达画布并在上面画一些东西?

谢谢

4

3 回答 3

11

除非您调用,否则布局不会绘制setWillNotDraw(false);。他们这样做是出于效率原因。

编辑

onDraw()真正的意思是只允许您Canvas在绘图操作发生之前修改。它实际上并没有绘制。你想要做的是draw()像这样覆盖:

@Override
protected void draw(Canvas canvas) {
    super.draw(canvas);

    Paint paint = new Paint();
    paint.setColor(0xFFFF0000);
    canvas.drawLine(0, 0, getWidth(), getHeight(), paint);
}

调用 super 将绘制视图中的所有子项。然后它将绘制所有线条。我仍然相信你需要setWillNotDraw(false)被召唤。

于 2012-05-23T20:24:35.540 回答
0

我正在重写我的答案,因为我没有看到你在画布上绘制的代码行。

像其他一些图形环境一样,画布是反转的。所以调用 getHeight() 实际上是在底部画线。而是打电话

   canvas.drawLine( 0, 0, getWidth(), 0, paint);

这意味着在顶部画线,横跨视图的宽度。

此外,调用 super first 会在任何自定义绘画之前先绘制孩子,这样你就可以了。

于 2014-10-20T16:16:31.963 回答
0

如果你有一个 LinearLayout 并且你需要:

  1. 首先绘制所有子元素,例如按钮、图像视图
  2. 然后,在这些组件之上,直接在画布上绘制一些东西。

    你可以试试这个:

    公共类 YourClass 扩展了 LinearLayout
    {
    @覆盖
    受保护的无效dispatchDraw(帆布画布)
    {
        super.dispatchDraw(画布);

    // do your custom drawings afterwards canvas.drawCircle... canvas.drawLine...
于 2017-10-10T18:02:07.063 回答