位图崩溃时出现“无法从位图生成纹理”消息

时间:2013-07-28 11:09:37

标签: java android bitmap recycle

我在动画上处理简单的应用程序。我使用标准视图。在onDraw metod我的应用程序绘制背景(存储为Bitmap)和几个精灵。在主循环中,我需要修改背景位图(附加代码)。我用于那个setPixel()方法。 当我尝试更改位图时,我会在LogCat中收到这样的消息:“无法从位图生成纹理”。之后,bacground仍然出现在屏幕上,但我既不能使用getPixel()也不能使用setPixel()方法。我发现一些提示是因为位图被回收了,但我在我的应用程序中添加了一些控件,之后“崩溃”bitmap.isRecycled()仍为false,而bitmap.isMutable()仍为true。所以,我不知道是什么问题。

public void drawOnBmp (float xF, float yF, float r) {       
    float[][] kolo;
    float xP, yP;
    float xStart, yStart;

    xStart = xF - r / 2;
    yStart = yF - r / 2;
    kolo = new float[(int)r + 1][(int)r + 1];
    for (int i = 0; i < 360; i++) {
        xP = r / 2 + (float)(r / 2 * Math.cos(2 * Math.PI * (double)i / 360));
        yP = r / 2 + (float)(r / 2 * Math.sin(2 * Math.PI * (double)i / 360));
        kolo[(int)xP][(int)yP] = 1;
    }
    boolean start;
    for (int i = 0; i < (int)r + 1; i++) {
        start = false;
        for (int j = 0; j < (int)r + 1; j++) {
            if (kolo[i][j] == 1)
                if (start == false) start = true;
                else if (j >= r / 2) break;
            if (start == true) kolo[i][j] = 1;
        }
    }
    // obraz is a bitmap with background
    for (int i = 0; i < (int)r; i++) {
        for (int j = 0; j < (int)r; j++) {
            if(kolo[i][j] == 1 && (int)xStart + i >= 0 && (int)yStart + j >= 0 && 
               (int)xStart + i < obraz.getWidth() && (int)yStart + j < obraz.getHeight())
                obraz.setPixel((int)xStart + i, (int)yStart + j, 0);
        }
    }
}

}

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。没有解决它,但这可能对任何人都有用。

一些提示来自google.group's主题

  

有趣的是它似乎与硬件有关   Android 3.x引入了渲染。将图层类型设置为   用于绘制位图的相应View的软件,   解决了这个问题。

设置

view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

对我来说真的很有用,但在我的应用中它影响了性能所以我必须使用View.LAYER_TYPE_HARDWARE

我仍然在寻找问题的解决方案和根源。如果发现任何将更新。此外,还有任何其他信息。