Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在android中查看onDraw(画布c)与draw(画布c)的对比?_Android_View_Android Canvas - Fatal编程技术网

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

在android中查看onDraw(画布c)与draw(画布c)的对比?,android,view,android-canvas,Android,View,Android Canvas,我是android开发新手,我正在探索视图。我遇到了两种已知的方法onDraw(Canvas c)和draw(Canvas c) 请给我解释一下这两种方法的区别和用法好吗?使用图像更新画布时,哪种方法可以提供更好的性能(FPS)?它们之间存在差异 是一种覆盖方法,在渲染视图时自动调用。在这里,你可以做你的附加绘图,比如画圆、线或任何你想要的东西 用于手动将此视图(及其所有子视图)渲染到给定画布。在调用此函数之前,视图必须已完成完整布局。实现视图时,实现onDraw(android.graphic

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


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

它们之间存在差异

  • 是一种覆盖方法,在渲染视图时自动调用。在这里,你可以做你的附加绘图,比如画圆、线或任何你想要的东西

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


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

    如果有人像我一样一直在寻找答案,却没有找到答案

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

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

    由于API文档的笨拙,人们对此有一种误解。
    简短的回答是:<代码>绘制(画布)< /C>是在视图上做一些重要的事情,在“代码>画图(画布)< /COD>实现的某个地方,它也会触发<代码> OnDead(画布)< /Cult>回调。

    • 在实现用于布局内部的自定义
      视图时,不要覆盖
      draw(Canvas)

    • 如果您的自定义视图打算用作全屏游戏,那么覆盖
      draw()
      将在每个周期为您节省一些不必要的调用
    更长的答案

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

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

      Canvas c = new Canvas();
      c.setBitmap(myOffscreenBitmap);
      myView.draw(c);
      
      • 对于简单的情况(当它不是视图组并且不需要滚动条时),简单的
        onDraw(Canvas)
        也可以做到这一点

    请告诉我这两种方法之间的性能(FPS),我看不出这是如何回答问题的。看起来您刚刚从我的测试中的内联文档中粘贴,在呈现视图时将调用这两个文档。draw(Canvas c)将首先被调用,然后onDraw(Canvas c)将在内部draw(Canvas c)中被调用。因此,我认为这里的“未自动调用”一词是无效的,因为在渲染视图时,这两个词都是“自动调用的”。draw由framework自动调用。测量通过onMeasure()回调完成,并在其中调用setMeasuredDimensions。与draw/onDraw没有直接关系。draw()调用onCall()并执行一些额外的操作。这个答案有点误导。答案被接受并获得高分,但遗憾的是第二个陈述完全错误。请发布一份参考文件。回答很好。我实际上检查了源代码,但是你可以看到,在渲染时,ViewGroup都调用其子对象的“draw()”方法,你可以检查这里@KarimTarabishy我们可以使用invalidate方法调用draw方法吗?这就是为什么你应该重写onDraw(),而不是draw()。这个答案非常准确,但是有一个理由可以超越draw而不是onDraw(c),而不是super.draw(c)。性能如果您不关心框架功能,并且希望尽可能快地绘制,例如视图中类似于游戏的情况,您可能希望跳过这些内容。@HaMMeReD同意,在游戏循环中跳过框架代码是有意义的。但如果在视图层次结构中实现自定义视图,则需要框架代码。因为onDraw在绘制子视图之前调用,所以在onDraw的初始状态下,我对子视图一无所知measurements@AkbolatSSS在同一方法中以同步方式调用这两个函数,首先调用draw(),然后调用onDraw()。因此,在儿童测量方面没有差异。这两种情况都发生在布局完成且大小设置为“一切”之后。@AmirUval不同意,我检查了该行为,视图组不知道onDraw中的子级大小,它将在
    步骤4
    后获得此信息,或者在
    dispatchDraw(画布)
    完成后获得更正确的信息