查看的onDraw在安卓(帆布℃)对平局(帆布C)?(View onDraw(Canvas c) v

2019-07-04 07:37发布

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

能否请您给我解释一下这两种方法的区别和用法? 哪种方法能够提供更好的性能(FPS)更新与图像的画布是什么时候?

Answer 1:

他们之间的区别

  1. 所述的onDraw(帆布c)中是一个覆盖方法和视图被呈现时自动调用。 在这里,你可以做你喜欢化妆界,任何你想要的线条或附加图。

  2. 拉伸(帆布c)中用于手动呈现该视图(及其所有子),以给定的画布。 该视图必须已经做了充分的布局调用此函数之前。 当实现一个视图,实施onDraw(android.graphics.Canvas)代替重写此方法。 如果确实需要重写此方法,调用父类的版本。

或者简单地说画(帆布c)是一个简单的,当视图渲染不会自动调用的函数。 用户需要提供在其上该视图将呈现和用户也必须做的所有在画布上绘制调用此函数之前画布。



Answer 2:

只是如果有人仍然在寻找像我这样的回答并没有发现它。

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

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

}


Answer 3:

有关于这个问题,尴尬的API文档的结果的误解。
简短的回答是, 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); 
    • 对于简单的情况下(当它不是一个ViewGroup中,不需要任何滚动条),简单onDraw(Canvas)也可以做的伎俩。


文章来源: View onDraw(Canvas c) versus draw(Canvas c) in android?