【问题标题】:What canvas does the Android View Class's onDraw method get passed?Android View Class 的 onDraw 方法通过什么画布?
【发布时间】:2023-03-03 02:35:01
【问题描述】:

Android 的View 类有一个名为onDraw 的方法,并且onDraw 得到了一个画布。只有用户从不明确创建被传递的画布,并且似乎没有其他方法可以访问它。

传递给onDraw 的画布是什么,它是在哪里创建的,有没有办法访问它?

感谢您的帮助。

【问题讨论】:

  • 只要在 View.onDraw 中设置一个断点并扫描下面的帧,其中一个应该是 ViewRoot
  • Canvas 对象只是原生 2D 库函数的包装器,在绘图表面上带有锁。如果您想访问该绘图表面,则必须访问私有 API,否则这样做是不明智的。你到底想在onDraw 之外做什么?如果我们知道您的意图,我们可能会更好地建议如何实现它。

标签: android android-canvas android-view ondraw


【解决方案1】:

Understanding Canvas and Surface concepts得出结论

一个视图隐含地有一个与之关联的画布。当从特定视图中调用 invalidate() 或为特定视图(即视图 v,然后调用 v.invalidate())时,与该视图关联的画布将发送到视图的 onDraw 方法。

当一个视图包含其他视图时,分层视图树会从发出无效调用的视图开始遍历和重绘。

【讨论】:

    【解决方案2】:

    ViewRootImpl,视图层次结构中的最顶层类,为整个可见窗口请求Canvas,并将其传递给Activity 的顶层ViewGroup。然后每个ViewGroup 将这个Canvas连接子集版本传递给每个子Viewdraw() 方法。

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

    您可以尝试使用您控制的Canvas 的新实例自己调用draw()。这不会在屏幕上绘制任何内容,但您可以在课堂上的其他地方阅读Canvas,将其转换为位图等。请参阅此答案以获取示例:Convert view to bitmap on Android

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-26
      • 1970-01-01
      • 1970-01-01
      • 2013-11-06
      • 1970-01-01
      相关资源
      最近更新 更多