在android中查看onDraw(Canvas c)与draw(Canvas c)的对比?

min*_*ini 18 android view android-canvas

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

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

Ali*_*ran 25

他们之间有区别

  1. 所述的onDraw(帆布c)中是一个覆盖方法和视图被呈现时自动调用.在这里,您可以进行额外的绘制,例如制作圆圈,线条或任何您想要的图形.

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

或者简单来说,绘制(Canvas c)只是一个在渲染视图时不会自动调用的函数.用户需要提供将在其上呈现此视图的画布,并且用户还必须在调用此函数之前在画布上执行所有绘制.

  • 我不知道这是如何回答这个问题的.好像你刚从内联文档中粘贴了一样 (10认同)
  • 从我的测试来看,当视图被渲染时,两者都会被调用。draw(Canvas c) 将首先被调用,然后 onDraw(Canvas c) 在 draw(Canvas c) 中被调用。所以我不认为这里的“不自动调用”这个词是有效的,因为在呈现视图时两者都是“自动调用”的。 (2认同)

Kar*_*shy 13

就好像有人还在寻找像我一样的答案而没有找到答案.

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

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

}
Run Code Online (Sandbox Code Playgroud)

  • 请发布文档参考。好答案。 (2认同)
  • 我实际上检查了源代码,但你可以看到,在渲染时,ViewGroup每个都调用它的子项'draw()'方法,你可以在这里查看http://developer.android.com/guide/topics/ui /how-android-draws.html (2认同)

Ami*_*val 6

由于笨拙的API文档,对此存在误解。
简短的答案是对View draw(Canvas)入站调用,以执行一些重要的操作,而在draw(Canvas)实现过程中的某个地方,它也会触发onDraw(Canvas)回调。

  • draw(Canvas)实现View用于版面设计的自定义时,请勿覆盖。
  • 如果您的自定义视图打算用作全屏游戏,那么覆盖draw()将为您节省每个周期的一些不必要的调用。

更长的答案

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

有用的提示

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

    Canvas c = new Canvas();
    c.setBitmap(myOffscreenBitmap);
    myView.draw(c);
    
    Run Code Online (Sandbox Code Playgroud)
    • 对于简单的情况(当它不是ViewGroup且不需要滚动条时),简单方法onDraw(Canvas)也可以解决问题。