【问题标题】:Android: how to get a faster onDraw()Android:如何获得更快的 onDraw()
【发布时间】:2012-02-29 16:31:55
【问题描述】:

我创建了一个调用 DrawView extends View 的活动,我在 Canvas 上绘制类似于二叉树的东西。画布尺寸大于屏幕尺寸,onDraw 函数绘制所有的画布,而不仅仅是它的可见部分。我添加了一个水平和一个垂直的scrollView,显然onDraw 被一次又一次地调用来刷新视图。 我想知道是否可以使用该图像在图像(位图或类似的东西)上绘制画布来显示树,而无需调用 onDraw 函数。 如果我不能这样做,我该怎么做才能获得更快的视图?

【问题讨论】:

    标签: android view canvas bitmap ondraw


    【解决方案1】:

    如果您使用的是 API 11 或更高版本,您可以尝试在清单的应用程序标签中使用硬件加速属性。

    <application ... android:hardwareAccelerated="true" ...>
    

    除了可以考虑使用 View 之外的其他渲染之外,还可以查看 SurfaceView。

    一般来说,我认为你不应该覆盖 View,除非你正在构建一个 UI 组件(如按钮),但不要引用我的话。

    【讨论】:

    • 我使用的是 android 2.3.3(所以 targetSdkVersion="11"),但是当我尝试使用它时出现错误:“在包中找不到属性 'hardwareAccelerated' 的资源标识符‘机器人’”
    • 那是因为 2.3.3 是 API 级别 10。
    • 不幸的是,我认为 2.3.3 是 API10。
    【解决方案2】:

    从技术上讲,画布是在位图上绘制的。所以实际上是比屏幕大的位图。为什么要让位图比屏幕大?更大的位图 = 更多的内存使用 - 这可能会减慢速度。你只是在屏幕的裁剪范围内真正绘图——你可能认为你是在屏幕外绘图,但事实并非如此。在另一个位图上绘图对您没有帮助 - 您已经在这样做了。无需查看您的代码,您可以尝试:

    • 仅通过调用 invalidate(rect) 来绘制二叉树中的更改,这只会重新绘制已更改的内容
    • 如果二叉树是静态的,只需创建它的 png/jpg 并显示该图像而不是自己绘制它
    • 确保您调用 invalidate 的次数没有超出您的需要

    【讨论】:

    • 我的树是静态的,那么如何实现类似于您的第二个解决方案点的东西?我的意思是,我可以导出 png/jpg,但是当用户滚动时如何在视图上显示它?
    • 一旦你创建了你想要的静态 png/jpg 图像,你就可以调用 canvas.drawBitmap() 查看文档。或者(取决于您的需要)您可以使用 ImageView 并在其中设置图像。
    猜你喜欢
    • 2013-11-20
    • 2021-04-03
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多