我尝试每隔10-100ms旋转3个imageViews(或者更好的是它们后面的位图)。 我做这样的轮换:
ImageView ivLoad;
Bitmap bMapLoad;
....
Matrix mat=new Matrix();
mat.reset();
mat.postScale(1.55f, 1.55f);
mat.postRotate((float)currentLoadDegree+(float)LoadDegree);
bMapLoad = Bitmap.createBitmap(bMapLoadgr, 0, 0, bMapLoadgr.getWidth(), bMapLoadgr.getHeight(), mat, true);
ivLoad.setImageBitmap(bMapLoad);
ivLoad.setScaleType(ScaleType.CENTER);
....
我第一次启动应用程序everthing工作正常。 第二次也有效 但第三次启动应用程序时崩溃时出现以下错误:
03-27 10:01:09.234: E/AndroidRuntime(3603): java.lang.OutOfMemoryError
03-27 10:01:09.234: E/AndroidRuntime(3603): at android.graphics.Bitmap.nativeCreate(Native Method)
03-27 10:01:09.234: E/AndroidRuntime(3603): at android.graphics.Bitmap.createBitmap(Bitmap.java:605)
03-27 10:01:09.234: E/AndroidRuntime(3603): at android.graphics.Bitmap.createBitmap(Bitmap.java:551)
经过很长一段时间的努力,我发现当我在onDestroy中调用System.exit(0)方法时,我会发现。
现在我不知道是否会有更好的方法,因为在google上很多人都认为System.exit(0)不安全。
所以我会遇到这个问题吗?
答案 0 :(得分:2)
您可以旋转正在绘制的画布,而不是旋转位图。
canvas.save();
canvas.translate(-canvasWidth/2, -canvasHeight/2);
canvas.rotate(degrees)
canvas.drawBitmap( ... )
canvas.translate(-canvasWidth/2, -canvasHeight/2);
canvas.restore();
现在,只有在图像本身更新时才会获得新的位图,即使您可以根据需要随时旋转它。但是如果你得到一个新的Bitmap,你仍然需要在旧的Bitmap上调用Bitmap.recycle()
。
答案 1 :(得分:1)
您不应该在旋转的每一步重新创建位图,而应该尝试将其旋转。这也可以通过Matrix(你已经使用过的)来避免过多的内存使用。
答案 2 :(得分:0)
您获得OutOfMemoryError
,因为每次轮播Bitmap
时都会加载ImageView
。您应该考虑重用已经加载的位图。当您不再需要位图时,也请调用Bitmap.recycle()
方法。