Android 旋转位图时获取OME
我正试图旋转Img(位图),由休闲代码。它的工作很好,最多可以旋转5-6圈,然后我就开始发狂了Android 旋转位图时获取OME,android,Android,我正试图旋转Img(位图),由休闲代码。它的工作很好,最多可以旋转5-6圈,然后我就开始发狂了 private void rotateImg() { Matrix matrix = new Matrix(); matrix.postScale(curScale, curScale); matrix.postRotate(curRotate); try { temp = Bitmap.createBitmap(temp, 0, 0, temp.get
private void rotateImg() {
Matrix matrix = new Matrix();
matrix.postScale(curScale, curScale);
matrix.postRotate(curRotate);
try {
temp = Bitmap.createBitmap(temp, 0, 0, temp.getWidth(),
temp.getHeight(), matrix, true);
setImage.setImageBitmap(temp);
} catch (OutOfMemoryError e) {
curRotate = curRotate - 45.0f;
Toast.makeText( this,"Out Of Memory",Toast.LENGTH_LONG).show();
}
}
这里的“test”是从SD卡加载的静态位图文件。每次调用此方法时,可能必须使用
bitmap.recycle()
方法。试试这样的
private void rotateImg() {
Matrix matrix = new Matrix();
matrix.postScale(curScale, curScale);
matrix.postRotate(curRotate);
try {
temp.recycle(); //removes the memory occupied by this bitmap object
temp=null;
temp = Bitmap.createBitmap(temp, 0, 0, temp.getWidth(),
temp.getHeight(), matrix, true);
setImage.setImageBitmap(temp);
} catch (OutOfMemoryError e) {
curRotate = curRotate - 45.0f;
Toast.makeText( this,"Out Of Memory",Toast.LENGTH_LONG).show();
}
}
第一个答案可能是一个潜在的解决方案。这里的问题是,您正在创建大量的位图对象,这些对象相当大,无论出于何种原因,它们都没有得到gc'd
更好的解决方案可能是使用单个位图,并在绘制位图时应用旋转/缩放。例如,如果您在
画布
上绘制,该画布是视图
的一部分,rotateImg可以简单地旋转矩阵并在视图上调用无效
,然后在视图的onDraw
方法中使用无效绘制位图(位图位图、矩阵、绘制)
在画布上渲染位图。文档是。为什么每次都要创建位图?有什么具体原因吗?
如果没有,请使用以下代码:
private void rotateImg() {
int cx = temp.getWidth() / 2;
int cy = temp.getHeight() / 2;
matrix.preTranslate(-cx, -cy);
matrix.postRotate(curRotate);
matrix.postTranslate(cx, cy);
setImage.setImageMatrix(matrix);
}
但是我在下一行使用那个“temp”文件来创建一个新的位图,我想我们可能会在代码“尝试使用一个回收的位图”中遇到一些错误。你能在setImage.setImageBitmap(temp)之后添加这些行吗;方法,然后检查。