getNinePatchChunk
работает нормально. Он вернул null, потому что вы дали Bitmap
"исходный" девятый патч. Нужен "скомпилированный" образ с девятью патчами.
В мире Android существует два типа форматов файлов с девятью патчами («исходный» и «скомпилированный»). В исходной версии вы повсюду добавляете границу прозрачности 1px — когда вы позже скомпилируете свое приложение в .apk, aapt преобразует ваши файлы *.9.png в двоичный формат, который ожидает Android. Именно здесь файл png получает метаданные «фрагмента». (подробнее)
Хорошо, теперь к делу (вы слушаете DJ kanzure).
Код клиента, примерно такой:
InputStream stream = .. //whatever
Bitmap bitmap = BitmapFactory.decodeStream(stream);
byte[] chunk = bitmap.getNinePatchChunk();
boolean result = NinePatch.isNinePatchChunk(chunk);
NinePatchDrawable patchy = new NinePatchDrawable(bitmap, chunk, new Rect(), null);
На стороне сервера вам необходимо подготовить изображения. Вы можете использовать компилятор двоичных ресурсов Android. Это автоматизирует часть усилий, связанных с созданием нового проекта Android, просто для компиляции некоторых файлов *.9.png в родной формат Android. Если бы вы делали это вручную, вы бы, по сути, сделали проект и добавили несколько файлов *.9.png («исходные» файлы), скомпилировали все в формат .apk, разархивировали файл .apk, затем нашли файл *. 9.png, и именно его вы отправляете своим клиентам.
Кроме того: я не знаю, знает ли BitmapFactory.decodeStream
о фрагменте npTc в этих png-файлах, поэтому он может правильно обрабатывать поток изображения или нет. Существование Bitmap.getNinePatchChunk
предполагает, что BitmapFactory
может... вы можете поискать его в кодовой базе основной ветки разработки.
В том случае, если он не знает о чанке npTc и ваши образы сильно лажают, то мой ответ немного меняется.
Вместо отправки скомпилированных изображений с девятью патчами клиенту вы пишете быстрое приложение для Android, которое загружает скомпилированные изображения и выдает фрагмент byte[]
. Затем вы передаете этот байтовый массив своим клиентам вместе с обычным изображением — без прозрачных границ, не с «исходным» изображением с девятью патчами, не с «скомпилированным» изображением с девятью патчами. Вы можете напрямую использовать фрагмент для создания своего объекта.
Другой альтернативой является использование сериализации объектов для отправки изображений с девятью исправлениями (NinePatch
) вашим клиентам, например, с помощью JSON или встроенного сериализатора.
Изменить Если вам действительно нужно создать собственный массив байтов фрагментов, я бы начал с просмотра do_9patch
, isNinePatchChunk
, Res_png_9patch
и Res_png_9patch::serialize()
в ResourceTypes.cpp. Также есть самодельный считыватель фрагментов npTc от Дмитрия Скибы. Я не могу публиковать ссылки, поэтому, если кто-то сможет отредактировать мой ответ, это будет здорово.
do_9patch: https://android.googlesource.com/platform/frameworks/base/+/gingerbread/tools/aapt/Images.cpp
isNinePatchChunk: http://netmite.com/android/mydroid/1.6/frameworks/base/core/jni/android/graphics/NinePatch.cpp
struct Res_png_9patch: https://scm.sipfoundry.org/rep/sipX/main/sipXmediaLib/contrib/android/androidBitmap
0_headers/frameworks/base/include/utils/ResourceTypes.h
Материал Дмитрия Скибы: http://code.google.com/p/android4me/source/browse/src/android/graphics/Bitmap.java
person
kanzure
schedule
01.04.2011