我有一个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}}。我已阅读本网站的建议,绝不应该使用此方法。有谁知道我怎样才能最好地解决这些问题?
答案 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
个),所有这些问题都消失了。希望有人读这篇文章会从我的错误中吸取教训!