Android:如何获得更快的onDraw()

Android:如何获得更快的onDraw(),android,view,canvas,bitmap,ondraw,Android,View,Canvas,Bitmap,Ondraw,我创建了一个调用DrawView扩展视图的活动,我在画布上绘制类似于二叉树的东西。画布大小大于屏幕大小,onDraw函数绘制所有画布,而不仅仅是画布的可见部分。我添加了一个水平和垂直的滚动视图,很明显,onDraw会一次又一次地被调用来刷新视图。 我想知道我是否可以在图像上绘制画布、位图或类似的东西,使用该图像显示树,而无需调用onDraw函数。 如果我不能做到这一点,我可以做些什么来获得更快的视图?如果您使用的是API 11或更高版本,您可以尝试在清单中的应用程序标记中使用硬件加速属性 <

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

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

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

除了可以考虑使用另一个渲染而不是视图之外,还可以查看Survivew。


通常,我认为您不应该覆盖视图,除非您正在构建一个像按钮一样的UI组件,但不要引用我的话。

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

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

除了可以考虑使用另一个渲染而不是视图之外,还可以查看Survivew。


一般来说,我认为您不应该覆盖视图,除非您正在构建一个像按钮一样的UI组件,但请不要引用我的话。

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

仅通过调用Invalidate来绘制二叉树中的更改,Invalidate只重新绘制已更改的内容 如果二叉树是静态的,只需创建一个png/jpg,并显示该图像,而不是自己绘制 确保您没有超出需要调用invalidate
从技术上讲,画布绘制在位图上。所以实际上是位图比屏幕大。为什么要使位图比屏幕大?更大的位图=更多的内存使用-这可能会使速度减慢一点。你只在屏幕的剪裁范围内画画——你可能认为你在画画,但事实并非如此。在另一个位图上绘图对您没有帮助-您已经在这样做了。无需查看代码,您可以尝试:

仅通过调用Invalidate来绘制二叉树中的更改,Invalidate只重新绘制已更改的内容 如果二叉树是静态的,只需创建一个png/jpg,并显示该图像,而不是自己绘制 确保您没有超出需要调用invalidate
我使用的是android 2.3.3,所以targetSdkVersion=11,但当我尝试使用它时,我出现了一个错误:在包“android”中找不到属性“hardwareAccelerated”的资源标识符,这是因为2.3.3是API级别10。不幸的是,我认为2.3.3是API10。我使用的是android 2.3.3,所以targetSdkVersion=11,但当我尝试使用它时,我发现了一个错误:在包“android”中找不到属性“hardwareAccelerated”的资源标识符,这是因为2.3.3是API级别10。不幸的是,我认为2.3.3是API10。我的树是静态的,所以我如何实现类似于第二个解决方案点的东西?我的意思是,我可以导出png/jpg,但是当用户滚动时,我如何在视图上显示它?一旦您创建了所需的静态png/jpg图像,您将调用canvas.drawBitmap see docs。或者根据您的需要,您可以使用ImageView并在其中设置图像。我的树是静态的,那么如何实现类似于第二个解决方案点的东西呢?我的意思是,我可以导出png/jpg,但是当用户滚动时,我如何在视图上显示它?一旦您创建了所需的静态png/jpg图像,您将调用canvas.drawBitmap see docs。或者根据您的需要,您可以使用ImageView并在其中设置图像。