Android - ресурс png, преобразованный в ColorDrawable на Android ‹ 4.0

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

  ...
  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();
  ...

Я вижу следующее, зарегистрированное на Android 2.2 и 2.3

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

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


person 500865    schedule 24.09.2013    source источник
comment
Если в png есть цветные пиксели, это все еще происходит? Не уверен, что оптимизация png aapt действительно может преобразовать сплошное цветное изображение в ColorDrawable или это ошибка при разрешении ваших пользовательских атрибутов.   -  person zapl    schedule 24.09.2013
comment
Этого не происходит для изображений с цветными пикселями. Если была какая-либо ошибка с пользовательскими атрибутами, она должна была выйти из строя на любом устройстве. Он работает, как и ожидалось, на Nexus 4 под управлением 4.3.   -  person 500865    schedule 24.09.2013


Ответы (2)


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

person Romain Guy    schedule 30.09.2013
comment
Для записи, есть ли способ переопределить это поведение или необходимо проверить его в коде? - person Geobits; 30.09.2013
comment
Согласно документации здесь: developer.android.com/guide/ тем/ресурсы/ , я привожу рисуемый объект к BitmapDrawable, что приводит к сбою, потому что в этом случае он преобразуется в ColorDrawable. - person 500865; 30.09.2013
comment
Документация неверна и должна быть обновлена. @Geobits: вам придется проверить это в коде. - person Romain Guy; 30.09.2013
comment
Просто для пояснения, BitmapDrawable или ColorDrawable - единственно возможные случаи, верно? - person 500865; 30.09.2013
comment
Чтобы было ясно, эта функция возвращает Drawable, и это все. Вы не должны не делать предположения о том, что он возвращает помимо этого. Если вам нужно растровое изображение, используйте это: developer.android.com/reference/android/graphics/ - person hackbod; 13.10.2013
comment
Обычно я бы этого не делал, но у моего вопроса очень мало просмотров, и я понятия не имею, как это сделать, поэтому не могли бы вы взглянуть на этот вопрос пожалуйста? Я был бы очень признателен - person Dan; 01.03.2016

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

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

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

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

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

person android developer    schedule 27.09.2013
comment
Обычно я бы этого не делал, но у моего вопроса очень мало просмотров, и я понятия не имею, как это сделать, поэтому не могли бы вы взглянуть на этот вопрос пожалуйста? Я был бы очень признателен - person Dan; 01.03.2016