我试图通过以下代码旋转Img(位图)。在得到OME之后,它的工作时间可以达到5-6转?
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”是从SDCard加载的静态位图文件。
答案 0 :(得分:1)
第一个答案可能是一个潜在的解决方案。这里的问题是你正在创建很多的Bitmap对象,这些对象相当大,而且无论出于何种原因他们都没有获得gc'd。
更好的解决方案可能是使用单个位图,并在绘制时应用旋转/缩放。例如,如果您使用的Canvas
是View
的一部分,则rotateImg可以简单地旋转矩阵并在视图上调用invalidate
,然后在视图中onDraw
您可以使用画布上的void drawBitmap (Bitmap bitmap, Matrix matrix, Paint paint)
来渲染位图。文档为here。
答案 1 :(得分:1)
为什么每次都创建位图?有什么具体原因吗? 如果不使用以下代码:
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);
}
答案 2 :(得分:0)
每次调用此方法时,可能必须使用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();
}
}