Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 旋转位图时获取OME_Android - Fatal编程技术网

Android 旋转位图时获取OME

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

我正试图旋转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.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)之后添加这些行吗;方法,然后检查。