Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Проблема при переработке растрового изображения, полученного из BitmapDrawable.

Автор вопроса: ZippyОтветов: 1

Я загружаю растровое изображение для использования в качестве текстуры в моем приложении OpenGLES 2.0.

Если я загружаю и использую растровое изображение через Bitmapfactory, тогда все в порядке. Вот так:

Загрузить

 public void loadBitmaps{

    backgrounds= BitmapFactory.decodeResource(view.getResources(), R.drawable.backgrounds, BMFOptions);
    ...

Использовать

//Apply as texture to OpenGL Quad

Переработка

backgrounds.recycle();

.

Теперь проблема...........

.

Когда я загружаю растровое изображение как bitmapDrawable, у меня возникают проблемы (объяснено ниже кода). Вот так:

.

Объявить BitmapDrawable на уровне класса

public class Res{

    BitmapDrawable bd;
    ...

Загрузить

public void loadBitmaps(){

    bd = (BitmapDrawable) view.getResources().getDrawable(R.drawable.backgrounds);
    backgrounds = bd.getBitmap();
    ...

Использовать

//Apply as texture to OpenGL Quad

Переработка

backgrounds.recycle();

При этом это работает в первый раз, но если я затем нажму назад, чтобы выйти, и перезапущу приложение, текстуры не будут отображаться, и все, что я получаю, это черные квадраты.

Если я сделаю что-либо из следующего, это решит проблему, и я хотел бы знать, почему ......

  • Либо переместите объявление bd из переменной класса, поэтому я использую:

BitmapDrawable bd = (BitmapDrawable) view.getResources().getDrawable(R.drawable.backgrounds);

  • Или просто сделайте это после создания растрового изображения:

бд = ноль;

  • наконец, я также могу просто не перерабатывать растровое изображение, но это не вариант

Примечание Мне нужно получить доступ к растровому изображению таким образом, а не использовать BitmapFactory, поскольку я обращаюсь к нему через псевдоним XML.

androidbitmapfactorybitmapdrawable

Ответы

Ответ 1 · рейтинг 3 · Kevin Coppock

Экземпляры Drawable кэшируются и совместно используются, поэтому при вызове getDrawable() он загрузит тот, который в настоящее время кэширован, а не создаст новое растровое изображение. Если вы переработаете базовое растровое изображение, это вызовет проблемы с будущим использованием. Скорее всего, вы захотите сделать копию чертежа перед его изменением:

BitmapDrawable bmpDrawable = (BitmapDrawable) view.getResources()
        .getDrawable(R.drawable.backgrounds);
Bitmap original = bmpDrawable.getBitmap();
Bitmap copy = original.copy(original.getConfig(), true);

Дополнительную информацию о переносимых мутациях см. в этой записи в блоге.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы