2013-07-28 2 views
1

Я работаю над простым приложением с анимацией. Я использую стандартный вид. В методе onDraw мое приложение рисует фон (хранится как растровое изображение) и пару спрайтов. В основном цикле мне нужно изменить растровое изображение фона (код прилагается). Я использую этот метод setPixel(). Время от времени, когда я пытаюсь изменить растровое изображение, я получаю в LogCat такое сообщение: «Невозможно создать текстуру из растрового изображения». После этого на экране все еще появляется, но я не могу использовать ни методы getPixel(), ни setPixel(). Я нашел некоторый намек на то, что это связано с тем, что битмап был переработан, но я добавил некоторые элементы управления в свое приложение, и после этого «crash» bitmap.isRecycled() по-прежнему является false и bitmap.isMutable() по-прежнему верен. Итак, я понятия не имею, в чем проблема.Сбой битмапа с сообщением «Can not generate texture from the bitmap»

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); 
     } 
    } 
} 

}

ответ

0

Я столкнулся с такой же проблемой. Еще не решил, но это может быть полезно для любого.

Некоторые подсказки приходят из google.group's нити

Что интересно, что это, кажется, связана с аппаратным рендеринга введен с Android 3.x. Установка типа слоя на для соответствующего представления, которое делает чертеж растрового изображения, устраняет проблему.

Так установка

view.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 

действительно работал для меня, но в моем приложении она повлияла на производительность, так что я должен использовать View.LAYER_TYPE_HARDWARE

Я до сих пор ищу решение и корни этого вопроса , Будет обновлен, если будет найден. Также оценивается любая дополнительная информация.