Вот обходной путь, который сработал для меня. Это нехорошее решение. Он может не работать во всех случаях, и в обработке изображений имеются значительные накладные расходы. Надеюсь, кто-то найдет лучшее решение.
В моем тестировании изображения GIF в 4.4 имеют значения прозрачности как белые (-1), так и черные (-16777216). После загрузки Bitmap вы можете преобразовать белые/черные пиксели обратно в прозрачные. Конечно, это будет работать только в том случае, если остальная часть изображения не будет использовать один и тот же цвет. Если это произойдет, вы также преобразуете части своего изображения в прозрачные, которые не были бы прозрачными в исходном изображении. В моем случае это не было проблемой.
Вы можете использовать следующий код для преобразования белых или черных пикселей в прозрачный.
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
bitmap = eraseBG(bitmap, -1); // use for white background
bitmap = eraseBG(bitmap, -16777216); // use for black background
private static Bitmap eraseBG(Bitmap src, int color) {
int width = src.getWidth();
int height = src.getHeight();
Bitmap b = src.copy(Config.ARGB_8888, true);
b.setHasAlpha(true);
int[] pixels = new int[width * height];
src.getPixels(pixels, 0, width, 0, 0, width, height);
for (int i = 0; i < width * height; i++) {
if (pixels[i] == color) {
pixels[i] = 0;
}
}
b.setPixels(pixels, 0, width, 0, 0, width, height);
return b;
}
Примечание: Я должен был скопировать Bitmap к новому ARGB_8888 изображения для этой работы. Даже при загрузке растрового изображения как изменчивого, я все еще не мог изменять пиксели. Отчасти это объясняется тем, что накладные расходы слишком велики.
[Здесь] (https://code.google.com/p/android/issues/detail?id=62016) - отчет об ошибке, описывающий проблему. Не уверен, планирует ли Google исправить это. Может быть, смотреть на это поможет. – paul
Спасибо, Пол, я уже смотрел! Но даже если я использую более ранний SDK, чем 4.4, эта же проблема все еще возникает. – Mike
Он должен быть основан на версии Android на вашем устройстве, а не на SDK, который вы создаете против. Вы тестируете на устройстве 4.4? У меня есть обходное решение, которое я опубликую в ближайшее время. – paul