我是否在每次通话时使整个屏幕无效?

 廉杰登_393 发布于 2023-02-04 19:05

我是Android开发和阅读本书的新手Hello Android.它使用Sudoku示例,我所指的代码就在这里.

在这个onTouchScreen中,它调用select方法,调用invalidate两次.问题是,在那之后调用invalidatingonDraw方法是什么?在这种情况下,在我的select方法中,它会这样做

    废止

    调用onDraw

    做一些事情

    废止

    调用onDraw

它是如何发生的,整个屏幕也会重新生成吗?所有的数字和提示等,因为从作者所说的书

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

究竟他想在这说什么?

添加了信息

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

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

    问:系统如何知道,哪一段代码"只"重绘脏区?
    A:Canvas::getClipBounds会给你一个脏的矩形,你应该画一些东西.
    你里面for looponDraw,比较脏矩形与要绘制矩形位置.然后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

    2023-02-04 19:07 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有