24

我是 android 开发新手,我正在探索View. 我遇到了已知的两种方法onDraw(Canvas c)draw(Canvas c).

请解释一下这两种方法的区别和用法?用图像更新画布时,哪种方法会提供更好的性能(FPS)?

4

3 回答 3

29

他们之间是有区别的

  1. onDraw(Canvas c)是一个覆盖方法,在渲染视图时会自动调用。在这里,您可以进行其他绘图,例如制作圆圈、线条或任何您想要的。

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

或者简单来说,draw(Canvas c)只是视图的一个函数,您可以在第一次渲染视图后调用它。此功能可用于在任何视图上进行自定义绘图。您需要提供此视图将在其上呈现的画布,并且您必须在调用此函数之前在画布上完成所有绘图。

于 2012-11-30T07:19:27.037 回答
16

就像有人仍在寻找像我这样的答案但没有找到。

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

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

}
于 2014-06-01T01:28:25.193 回答
14

由于笨拙的 API 文档,对此存在误解。
简短的回答是对 Viewdraw(Canvas)进行入站调用以执行一些重要的事情,并且在实现中间的某个地方draw(Canvas)它也会触发onDraw(Canvas)回调。

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

更长的答案

  • 该框架draw(Canvas)在其绘制周期中使用。这是我可以在查看代码中找到的:
    • 第 1 步:根据需要绘制背景
    • 第 2 步:保存画布的图层
    • 第三步:绘制内容---onDraw()来这里
    • 第四步:画孩子
    • 第五步:绘制淡入淡出效果并恢复图层
    • 第六步:绘制滚动条

有用的提示

  • 您可以将任何视图渲染到您创建的屏幕外位图中,然后在任何地方使用此位图:

    Canvas c = new Canvas();
    c.setBitmap(myOffscreenBitmap);
    myView.draw(c);
    
    • 对于简单的情况(当它不是 ViewGroup 并且不需要滚动条时),简单的onDraw(Canvas)也可以解决问题。
于 2016-11-23T00:01:48.723 回答