3

Согласно документации here, ресурс png должен быть преобразован в BitmapDrawable. Тем не менее, я наблюдая странное поведение которой PNG-файл, который имеет только черные пиксели в нем в результате аварии из-за ClassCastException (завернутые в InvocationTargetException), если я пытаюсь сделать следующее в настраиваемое представление в конструкторе:Android - ресурс png, преобразованный в ColorDrawable на android <4.0

 
    ... 
    tempDrawable = typedArr.getDrawable(R.styleable.CustomView_src); // Source points to a png file 
    Log.i("TestPNGToResource", "Canonical Class Name " + tempDrawable.getClass().getCanonicalName()); 
    tempBitmap = ((BitmapDrawable) tempDrawable).getBitmap(); 
    ... 

Я вижу следующие входа в систему андроида 2.2 и 2,3

 
09-24 13:21:37.575: I/TestPNGToResource(532): Canonical Class Name android.graphics.drawable.ColorDrawable 

Почему ресурс не преобразуется в BitmapDrawable?

+0

Если у png есть цветные пиксели, это все еще происходит? Не уверен, что png-оптимизация 'aapt' может фактически преобразовать сплошное цветное изображение в' ColorDrawable' или если это ошибка при разрешении ваших настраиваемых атрибутов – zapl

+0

Это не происходит для изображений с цветными пикселями. Если возникла ошибка с пользовательскими атрибутами, она должна была сбой на любом устройстве. Он работает так, как ожидается, на Nexus 4 с 4.3. – 500865

ответ

3

Это оптимизация, выполняемая aapt. Он способен распознавать изображения, сделанные из одного цвета, и превращать их в один цвет, а не в растровое изображение. Это более экономично, улучшает время загрузки и т. Д.

+2

Для записи, есть ли способ переопределить это поведение или нужно проверить его в коде? – Geobits

+0

В соответствии с документацией здесь: http://developer.android.com/guide/topics/resources/drawable-resource.html#Bitmap, я отбрасываю drawable в BitmapDrawable, что приводит к сбою, потому что в этом случае это преобразование в ColorDrawable. – 500865

+1

Документация неверна и должна быть обновлена. @Geobits: вам нужно будет проверить его в коде. –

0

Я предполагаю, что это не произойдет для 9-патч-изображений, верно? также, при использовании файла изображения, извлечение файла apk по-прежнему отображает файл изображения внутри него?

во всяком случае, я не уверен, если это поможет, но вы пытались проверить это значение:

TypedValue value = a.peekValue(R.styleable.CustomView_src); 

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

однако, если в специальном случае, который вы показали, вы получаете ссылочный тип, возможно, вы можете заставить его быть BitmapDrawable, просто создав растровое изображение, используя BitmapFactory.decodeResource().

+0

Обычно я бы этого не делал, но у моего вопроса было очень мало просмотров, и я понятия не имею, как это сделать, чтобы вы могли взглянуть на этот [вопрос] (http://stackoverflow.com/questions/ 35729545/reflection-in-background-android) пожалуйста? Я бы очень признателен за это. – Dan

 Смежные вопросы

  • Нет связанных вопросов^_^