2012-11-30 36 views

回答

22

有他们

  1. onDraw(Canvas c)之间差是一个覆盖方法和视图被呈现时自动调用。在这里你可以做你的额外的绘画,如制作圆圈,线条或任何你想要的。

  2. draw(Canvas c)用于手动将此视图(及其所有子项)呈现给定画布。在调用这个函数之前,视图必须已经完成了一个完整的布局。在实现视图时,请执行onDraw(android.graphics.Canvas)而不是重写此方法。如果您确实需要重写此方法,请调用超类版本。

或者在简单的话平局(帆布c)中是一个简单的,当视图被渲染不会自动调用的函数。用户需要提供该视图将呈现的画布,并且在调用此函数之前用户还必须完成画布上的所有绘制。

+0

能告诉我这2种方法 – mini

+9

之间的性能(FPS),我看不出这个答案。好像你刚刚从内联文档中粘贴 – Migisha

+0

从我的测试中,当视图呈现时,两者都会被调用。绘制(Canvas c)将首先调用,然后onDraw(Canvas c)调用内部绘制(Canvas c)。所以我不认为这里的“不自动调用”一词是有效的,因为当视图呈现时,两者都被“自动调用”。框架自动调用 – HendraWD

8

就是如果有人仍然在寻找像我这样的答案,并没有找到答案。

当需要重新绘制视图时,draw()方法由框架调用,然后draw()方法调用onDraw()绘制视图的内容。

void draw(Canvas canvas) 
{ 
    ..... do default stuff (background, layers) 
    onDraw(canvas) 
    ..... do other stuff (scroll bars, fading edges, children) 

} 
+1

请发布文档参考。好答案。 – milosmns

+1

我实际上检查了源代码,但您可以看到,渲染时,ViewGroup每个都调用其子的draw()方法,您可以在这里检查http://developer.android.com/guide/topics/ ui/how-android-draws.html –

+1

谢谢,这总结得非常好。 – milosmns

1

由于笨拙的API文档,对此存在一种误解。
简短的回答是,draw(Canvas)是一个入境呼吁一个视图做一些重要的东西,并在draw(Canvas)执行中间的某个地方,它也会触发一个onDraw(Canvas)回调。

  • 实施旨在布局内使用自定义View时,不要覆盖draw(Canvas)
  • 如果您的自定义视图旨在用作全屏游戏,那么覆盖draw()将在每个周期为您节省一些不需要的调用。

再回应

  • 该框架在其绘制循环使用draw(Canvas)。这就是我可以在视图代码中找到:
    • 步骤1:绘制背景,如果需要的话
    • 第2步:保存画布层
    • 第3步:绘制内容--- onDraw()来这里
    • 步骤4:绘制孩子
    • 步骤5:绘制淡入淡出效果并恢复层
    • 步骤6:绘制滚动条

有用的提示

  • 可以渲染任何视图为您创建一个屏幕外的位图,并在以后使用该位图的任何地方:当它不

    Canvas c = new Canvas(); 
    c.setBitmap(myOffscreenBitmap); 
    myView.draw(c); 
    
    • 简单的情况下(一个ViewGroup并且不需要滚动条),简单的onDraw(Canvas)也可以做到这一点。
+0

这个答案是相当准确的,但是有一个原因可能会取代onDraw(c)而不是调用super.draw(c)。 性能 如果您不关心框架功能并希望尽可能快地绘制,像View中的情况那样的游戏,你可能想跳过那些东西。 – HaMMeReD

+0

@HaMMeReD同意,在游戏循环中跳过框架代码是有意义的。但是如果在视图层次结构中实现自定义视图,则框架代码是必需的。 – auval