如何停止onDraw()方法导致ListView的滚动不稳定

时间:2014-11-25 16:58:10

标签: android android-listview bitmap android-view

我有一个ListView,其子Views在其Canvas方法(例如onDraw()等)中包含了对drawPath()的多次调用。我发现当你滚动ListView时,对onDraw(频繁)的调用会导致非常不稳定的滚动。我发现您可以通过将View中的每个ListView替换为ImageView来解决此问题,其中Bitmap使用原始View创建图像view.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); int bitmapWidth = view.getMeasuredWidth(); int bitmapHeight = view.getMeasuredHeight(); view.layout(0, 0, bitmapWidth, bitmapHeight); Bitmap bitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); view.draw(canvas); 像这样的代码。

Bitmap.createBitmap()

这解决了滚动不稳定的问题。但问题是方法OutOfMemoryError似乎倾向于抛出{{1}}。我已阅读本网站的建议,绝不应该使用此方法。有谁知道我怎样才能最好地解决这些问题?

2 个答案:

答案 0 :(得分:0)

一些事情:

1)发布更多来源

2)阅读http://developer.android.com/training/improving-layouts/smooth-scrolling.html

3)考虑使用ArrayAdapter http://developer.android.com/reference/android/widget/ArrayAdapter.html

您可能希望跟踪调用create bitmap的次数,以及如何处理垃圾收集。如果您没有正确回收您的观看次数,并且您创建了大量这些位图,则会很快压倒您的可用内存。

为了提高效率,您可以查看位图缓存,ala:

http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

答案 1 :(得分:0)

几个月后我找到了解决方案。在我开始使用Bitmap之前,我无意中在onDraw()方法中分配了大量对象。我没有从Android Studio收到任何警告,因为new关键字用于从onDraw而不是onDraw调用的方法中。我发现如果你不小心在循环中写new Paint()而不是重用Paint对象,它会严重损害滚动的性能。

我现在在我的应用程序中只有少量Paint个对象和一个Path对象(根本没有Bitmap个),所有这些问题都消失了。希望有人读这篇文章会从我的错误中吸取教训!