我是Android开发和阅读本书的新手Hello Android
.它使用Sudoku示例,我所指的代码就在这里.
在这个onTouchScreen中,它调用select方法,调用invalidate两次.问题是,在那之后调用invalidating
的onDraw
方法是什么?在这种情况下,在我的select方法中,它会这样做
废止
调用onDraw
做一些事情
废止
调用onDraw
它是如何发生的,整个屏幕也会重新生成吗?所有的数字和提示等,因为从作者所说的书
在此示例的早期版本中,无论何时移动光标,我都会使整个屏幕无效.因此,在每个按键上,整个拼图都必须重新绘制.这导致它明显滞后.将代码切换为仅使变化的最小矩形无效使其运行得更快.
究竟他想在这说什么?
添加了信息
我在onDraw方法中添加了一些日志,一些在开始时添加,一些在for循环中.每当我触摸一个新的矩形时,都会调用所有日志.这是否意味着整个屏幕正在重新填充,因为onDraw中的所有代码都被重新执行?
鲲
问:但是日志呢,当然,如果我的循环被执行,这意味着所有的canvas.draw也将被执行?
答:是的,整个图纸将在您的示例代码中执行.您必须自己在onDraw
方法中优化渲染过程.
问:系统如何知道,哪一段代码"只"重绘脏区?
A:Canvas::getClipBounds
会给你一个脏的矩形,你应该画一些东西.
你里面for loop
的onDraw
,比较脏矩形与要绘制矩形位置.然后continue
如果它们不相交就行.
但请记住,如果您将多个区域设置为脏,则返回的rect将是所有脏区域的并集.
请看下面的两个问题:
在draw()中获取脏区域
Android:invalidate(dirty)
希望这会帮助你.
==========================
作者是对的.但这仍然可以优化.
调用invalidate(Rect)
将自动为画布设置剪辑区域.(这就是为什么canvas.getClipBounds()
可以返回该区域).
然后,在此期间onDraw()
,将忽略从剪辑区域中抽出的任何内容.它们不会出现在屏幕上,因此它确实减少了绘图时间.
但忽略它们仍然需要花费很多成本.因此,对于图形密集型应用程序,onDraw()
如果事先将其排除,可以更好地进行优化.
您可以onDraw()
在android中找到一个很好的优化示例KeyboardView
,它提供了android的输入法的视图.
http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/inputmethodservice/KeyboardView.java