【发布时间】:2012-11-30 07:07:39
【问题描述】:
我是 android 开发新手,我正在探索 View。我遇到了已知的两种方法onDraw(Canvas c) 和draw(Canvas c)。
能否解释一下这两种方法的区别和用法?用图像更新画布时,哪种方法会提供更好的性能(FPS)?
【问题讨论】:
标签: android view android-canvas
我是 android 开发新手,我正在探索 View。我遇到了已知的两种方法onDraw(Canvas c) 和draw(Canvas c)。
能否解释一下这两种方法的区别和用法?用图像更新画布时,哪种方法会提供更好的性能(FPS)?
【问题讨论】:
标签: android view android-canvas
它们之间是有区别的
onDraw(Canvas c) 是一种覆盖方法,在呈现视图时会自动调用。在这里,您可以进行额外的绘图,例如画圆、线或任何您想要的。
draw(Canvas c) 用于手动将此视图(及其所有子视图)渲染到给定的画布上。在调用此函数之前,视图必须已经完成了完整的布局。实现视图时,实现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 文档笨拙,对此存在误解。
简短的回答是,draw(Canvas) 是对 View 的入站调用以执行一些重要的事情,并且在 draw(Canvas) 实现的中间某处,它还将触发 onDraw(Canvas) 回调。
View 时不要覆盖 draw(Canvas)。draw() 将在每个周期为您节省一些不需要的调用。更长的答案
draw(Canvas)。这是我可以在查看代码中找到的:
onDraw()来了实用提示
您可以将任何视图渲染到您创建的屏幕外位图中,然后在任何地方使用此位图:
Canvas c = new Canvas();
c.setBitmap(myOffscreenBitmap);
myView.draw(c);
onDraw(Canvas) 也可以解决问题。【讨论】:
Step 4 或在 dispatchDraw(canvas) 完成后更正确地获取此信息