【问题标题】:Should a custom View inside a custom ViewGroup use onDraw() or layout()?自定义 ViewGroup 中的自定义 View 应该使用 onDraw() 还是 layout()?
【发布时间】:2012-12-19 21:26:02
【问题描述】:

首先,我创建了一个自定义视图,它通过覆盖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);
        }
    }

【问题讨论】:

    标签: android android-view android-custom-view viewgroup


    【解决方案1】:

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

    我看不出你是如何在 onLayout 方法中绘制 ViewGroup 的孩子的。应该使用该方法将孩子定位在屏幕上。

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

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      另见我的回答here

      【讨论】:

      • 谢谢,我会考虑的。但是现在,我想了解自定义视图组是如何工作的,所以这个问题对我很重要。
      猜你喜欢
      • 1970-01-01
      • 2011-06-04
      • 1970-01-01
      • 2011-12-08
      • 2015-08-17
      • 1970-01-01
      • 1970-01-01
      • 2011-05-25
      • 2011-08-05
      相关资源
      最近更新 更多