2012-02-29 51 views
1

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

回答

1

从技术上讲,画布绘制在位图上。所以它实际上是比屏幕更大的位图。你为什么让位图比屏幕大?更大的Bitmaps =更多的内存使用 - 这可能会减慢一点。你只能真正在画面的剪裁范围内绘制 - 你可能认为你正在画屏幕,但你没有。在另一个位图上绘图不会帮助你 - 你已经这么做了。不看你的代码,你可以尝试:

  • 只画出二叉树通过调用invalidate(rect)只重画发生了什么变化有什么变化
  • 如果二叉树的意思是静态的,只需要创建一个PNG /它的JPG和显示图像与绘制它自己所有
  • 确保你不叫失效比你更需要
+0

我的树是静态的,那么如何实现类似于第二个解决方案点的东西?我的意思是,我可以导出png/jpg,但是如何在用户滚动时在视图上显示它? – Ant4res 2012-02-29 17:07:31

+0

一旦你创建了一个你想要的静态png/jpg图像,你就可以调用canvas.drawBitmap()来查看文档。或者(根据您的需要),您可以使用ImageView并在其中设置图像。 – dbryson 2012-02-29 17:12:53

+0

非常感谢,我会尽力按照您的建议去做。 – Ant4res 2012-02-29 17:17:48

4

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

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

除此之外,你可以考虑使用另一种渲染而不是视图,也可以看看SurfaceView。

一般来说,我认为你不应该重写视图,除非你正在构建一个UI组件(就像一个Button),不要在此引用我。

+0

我使用的Android 2.3.3(所以targetSdkVersion =“11”),但是当我尝试使用它时,我有错误:“找不到属性'hardwareAcceler的资源标识符ated'in package'android'“ – Ant4res 2012-02-29 16:48:22

+0

这是因为2.3.3是API级别10. – DeeV 2012-02-29 16:56:02

+0

不幸的是我认为2.3.3是API10。 – Andreas 2012-02-29 16:57:16