自定义ViewGroup中的自定义View是否应使用onDraw()或layout()?

时间:2012-12-19 21:26:03

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

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

2 个答案:

答案 0 :(得分:5)

  

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

我看不到你如何用ViewGroup方法绘制onLayout个孩子。该方法应该用于将孩子放在屏幕上。

  

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

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

  

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

如果您想要实际看到某些内容,则不应忽略onDraw方法。

  

并且有人能给我一个layout()方法如何工作的例子   以及如何将我的onDraw()方法“转换”为layout()方法?

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

custom ViewGroup

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

答案 1 :(得分:1)

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

另见我的回答here