2

起初,我创建了一个自定义视图,它通过覆盖该onDraw()方法来绘制自己。由于我需要创建大量视图,这被证明是不切实际的。所以我创建了一个自定义 ViewGroup,它使用该onLayout()方法绘制它的每个孩子。

我在 android 文档中读到子视图应该实现一个layout()方法。但是我制作的子视图使用 onDraw 方法来绘制自己。我该如何处理?我应该摆脱这种onDraw()方法吗?谁能给我一个关于该layout()方法如何工作以及我应该如何将我onDraw()的方法“转换”为方法的示例layout()

我当前的onDraw()方法如下所示:

protected void onDraw(Canvas canvas)
    {
        super.onDraw(canvas);

        //Draw Border.
        canvas.drawRect(mCellBounds, mBorderPaint);

        //Draw Background.
        canvas.drawRect(mBackgroundBounds, mBackGroundPaint);

        //Draw Value if not 0.
        if(Value != 0)
            canvas.drawText(Integer.toString(Value), ValueX, ValueY, mNumberPaint);

        //Draw Notes if Value == 0.
        else
        {
            for(int i = 0 ; i < 9 ; i++)
                if(NoteList[i])
                    canvas.drawText(Integer.toString(i), NoteX + ((i%3) * NoteMeasureX), NoteY + ((i/3) * NoteMeasureY), mNotePaint);
        }
    }
4

2 回答 2

5

所以我创建了一个自定义 ViewGroup,它使用 onLayout() 方法绘制它的每个孩子。

我不明白你是如何ViewGroup用它的方法画出 的孩子的onLayout。应该使用该方法将孩子定位在屏幕上。

我在 android 文档中读到子视图应该实现 layout() 方法

该方法已经实现,您使用正确的值调用它,以便View知道它应该放在屏幕上的哪个位置。

我应该摆脱 onDraw() 方法吗?

如果你想真正看到一些东西,你不应该忽略这个onDraw方法。

谁能给我一个例子,说明 layout() 方法是如何工作的,以及我应该如何将我的 onDraw() 方法“转换”为 layout() 方法?

您不会将onDraw方法转换为layout方法。例如,我制作了一个由 customViewGroup和 custom child组成的小样本View。自定义ViewGroup它将放置两个(预期的孩子),如下图所示(每个孩子的宽度和高度都是父母的一半):

自定义视图组

您可以在此处找到示例。我希望它对你有帮助。您还可以查看 SDK 布局的源代码(如 simple FrameLayout),了解它们如何发挥作用。

于 2012-12-20T11:04:26.580 回答
1

你真的需要整个视图层次结构吗?考虑使用SurfaceView,这是一种更轻松的自定义绘图方式,并且您可以在一个视图中轻松嵌入到其他视图中。

另请参阅我的答案

于 2012-12-19T22:37:15.150 回答