Android 每次通话我都会使整个屏幕失效吗?

Android 每次通话我都会使整个屏幕失效吗?,android,optimization,ondraw,invalidation,Android,Optimization,Ondraw,Invalidation,我是Android开发新手,正在阅读《你好,Android》。它使用了一个数独的例子,我指的代码是 在这个屏幕上,它调用select方法,该方法调用两次invalidate。问题是,invalization之后是否调用了onDraw方法?在这种情况下,在我的select方法中,它就可以了 使无效 打电话给昂德劳 做点什么 使无效 打电话给昂德劳 这是怎么发生的,整个屏幕也会重新生成吗?所有的数字和提示等等,因为作者在书中说 在本例的早期版本中,我使整个 当光标移动时显示屏幕。因此,在每个关键点上

我是Android开发新手,正在阅读《你好,Android》。它使用了一个数独的例子,我指的代码是

在这个屏幕上,它调用select方法,该方法调用两次invalidate。问题是,
invalization
之后是否调用了
onDraw
方法?在这种情况下,在我的select方法中,它就可以了

  • 使无效
  • 打电话给昂德劳
  • 做点什么
  • 使无效
  • 打电话给昂德劳
  • 这是怎么发生的,整个屏幕也会重新生成吗?所有的数字和提示等等,因为作者在书中说

    在本例的早期版本中,我使整个 当光标移动时显示屏幕。因此,在每个关键点上 按,整个拼图必须重新绘制。这导致了它的滞后 很明显。将代码切换为仅使最小值无效 改变了的矩形使它运行得更快

    他到底想说什么

    添加信息


    我在onDraw方法中添加了一些日志,一些在开始时,一些在for循环中。每当我触摸一个新的矩形,所有的日志都被调用。这是否意味着整个屏幕正在重新填充,因为onDraw中的所有代码都已重新执行?

    在代码中,您所说的无效是:

      invalidate(selRect);
    
    ?

    如果是,他只调用所选矩形的onDraw
    selRect

    只有
    无效()重绘孔屏幕


    希望能有帮助

    在本例中,您应该注意到,
    invalidate()
    调用有一个
    Rect
    作为参数。这意味着只有视图的这个区域变脏了,并且将被系统重新绘制

    调用invalidate()不会立即触发onDraw()方法。系统只在他想要重新绘制视图时才做出决定

    来自Android文档:

    如果视图可见,将调用onDraw(android.graphics.Canvas) 在将来的某个时候

    知道在
    select
    方法中,可能会发生以下情况: 1.使视图的一小部分无效 2.做点什么 3.使视图的另一小部分无效 4.视图的这两部分正在重新绘制

    希望有帮助。

    这是直接来自:

    通过遍历树并渲染与无效区域相交的每个视图来处理图形。因为树是按顺序遍历的,这意味着父母将在其子女之前(即之后)绘制,兄弟姐妹将按他们在树中出现的顺序绘制。如果为视图设置了可绘制的背景,则视图将在调用其onDraw()方法之前为您绘制背景

    请注意,框架不会绘制不在无效区域中的视图`

    据我所知,一旦你的视图第一次被绘制出来,一棵由父对象和子对象以及它们在屏幕上的位置组成的树。当您传递指定区域以使其无效时,将检查此树在该区域中是否存在受影响的节点,并且仅调用这些节点进行绘制

    现在我也不明白的是,在这个例子中,唯一的视图是拼图视图。我不确定如何优化单个视图的图形。检查文本中是否有进一步讨论

    如果不是,那么我的理论是画布对象(矩形)也是上述树的一部分,并且仅绘制这些部分,即指定区域中的矩形

    更重要的是,在使用区域失效和完全失效后,你看到了什么改进吗?

    Kraken


    问:但是日志呢?如果我的循环被执行,那么肯定意味着所有canvas.draw也将被执行?
    答:是的,整个图纸将在您的示例代码中执行。您必须自己在
    onDraw
    方法中优化渲染过程

    问:系统如何知道,哪段代码“仅”重绘脏区?
    答:
    Canvas::getClipBounds
    会给你一个脏矩形,你应该在上面画点东西。
    onDraw
    中的
    for循环
    中,将脏矩形与要绘制的矩形进行比较。如果它们不相交,则继续执行

    但是请记住,如果将多个区域设置为脏区域,则返回的rect将是所有脏区域的并集。
    请参见以下两个问题:

    希望这对你有帮助

    ==========================

    作者是对的。但这仍然可以优化

    调用
    invalidate(Rect)
    将自动设置画布的剪辑区域。(这就是
    canvas.getClipBounds()
    可以返回该区域的原因)。
    然后,在
    onDraw()
    期间,将忽略从剪辑区域中绘制的任何内容。它们不会出现在屏幕上,因此确实缩短了绘图时间。
    但忽视它们仍然会增加管理费用。因此,对于图形密集型应用程序,
    onDraw()
    可以更好地优化,如果您事先排除它们

    您可以在android的
    键盘视图
    中找到一个优化
    onDraw()
    的好例子,它提供了android输入法的视图。

    即使多次调用invalidate,onDraw方法也只会被调用一次。基本上,当视图无效时,在RunLoop方法中调用onDraw。这意味着,如果在将控件返回给runloop之前多次使视图无效,则视图将只重绘一次。
    请注意,如果您使视图的两个不同的矩形无效,系统将尝试在重新绘制视图之前合并这些矩形。

    我在onDraw方法中添加了一些日志,一些在开始时,一些在for循环中。每当我触摸一个新的矩形,所有的原木