Android View类的onDraw方法传递了哪个画布?

3
Android中的View类有一个名为onDraw的方法,它会传递一个画布(canvas)。然而,用户从未显式地创建该画布,也似乎没有其他方式可以访问它。
那么,这个传递给onDraw的画布是什么,它是在哪里创建的,是否有办法访问它呢?
谢谢你的帮助。

只需在View.onDraw中设置断点并扫描下面的帧,其中一个应该是ViewRoot。 - pskink
Canvas 对象只是本地 2D 库函数的包装器,具有绘图表面锁定。如果您想访问该绘图表面,则无法在不访问私有 API 的情况下进行访问,而且这样做也是不明智的。你在 onDraw 之外到底想做什么?如果我们知道您的意图,我们可能更能够建议如何实现它。 - Dave
2个回答

0

理解画布和表面概念的结论可以得出:

一个视图隐式地与一个画布关联。当在特定视图内或针对特定视图调用invalidate()时(即View v并且您随后调用v.invalidate()),该视图关联的画布将发送到View的onDraw方法中。

当视图包含其他视图时,会遍历层次结构的视图树,并从发出无效调用的视图开始重绘。


0

ViewRootImpl,位于视图层级的最顶层类,请求一个Canvas来覆盖整个可见窗口,并将其传递给你的Activity的顶级ViewGroup。然后,每个ViewGroup将这个拼接截取的Canvas的子集传递给每个子Viewdraw()方法。

据我所知,在onDraw()(和相关方法)之外,无法操作Canvas

你可以尝试使用你自己控制的新实例Canvas来调用draw()。这不会在屏幕上绘制任何内容,但是你可以在类中其他地方读取Canvas、将其转换为位图等。请参考这个答案,了解示例:在Android上将视图转换为位图


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接