Создание 9 патчей, доступных во время выполнения
Я успешно создаю 9patch, который можно использовать во время работы на Android 3.0+, используя отличный инструмент, предоставленный Брайаном Гриффи (найденный здесь).
По сути, я загружаю необработанный (без патчей) графический файл из сети, а имя файла содержит вставки для крышки, которые мне нужно использовать для масштабирования изображения соответственно. Затем я использую эти значения с приведенным выше классом и применяю изображение в качестве фона для множества элементов (например, TextView
, ImageButton
, Button
, ViewGroup
и т.д.).
Это работает отлично, как вы можете видеть здесь:
![Android 3.0+ result]()
Однако, запуск того же кода на Android 2.3.x дает результат:
![Android 2.x result]()
Я просмотрел исходный код, используемый в Android, для анализа изображения 9patch (здесь и здесь), но не нашли способа заставить это работать правильно. Я пробовал все, что мог бы наброситься на него безрезультатно.
Для записи 9patch состоит из трех столбцов на каждой оси, одна фиксированная, одна растяжимая и одна фиксированная.
Здесь надеюсь, что кто-то еще решил эту проблему раньше.
Спасибо заранее.
EDIT Меня интересует только дублирование этого поведения на Android 2.3 и выше (у меня первоначально было 2.x).
EDIT # 2 Этот метод описывает именно то, что я пытаюсь сделать + Исходное изображение: ![source image]()
EDIT # 3 Размер изображения 22px/58px (ширина/высота), а вставки - 14/6/14/6 (верхний/левый/нижний/правый).
Ответы
Ответ 1
Соединяя все, что я заметил до сих пор, и немного оттачивая его:
-
В структуре Res_png_9patch
(в которую входит байтовый блок) нет разницы между версиями андроида (см. http://code.metager.de/source/xref/android), так что это не похоже на причину.
-
Другие ответы о девяти исправлениях патчей предполагают, что каждая область (особенно растяжимая) должна быть как минимум 2x2 пикселя (если не 3x3), но за пределами этого меньше лучше.
-
Однако, как выделяется часть байтового блока, похоже, что он может быть обновлен. Попробуйте установить 4-й байт на 9 (количество патчей, я думаю), добавив еще 7 NO_COLOR
к концу и перемещая его размер до 56 + (7 x 4) = 84 байта
Ответ 2
Он работает для меня после того, как я обновил код. Я думаю, что размер цвета сделал его недовольным по какой-то причине (на основе комментариев в исходном коде Android каждый патч имеет подсказку цвета, устанавливая меньшее количество секций в этом случае 9, похоже, вызывает проблемы). Я еще не тестировал ваше изображение.
public static NinePatch createFixedNinePatch(Resources res, Bitmap bitmap, int top, int left, int bottom, int right, String srcName){
ByteBuffer buffer = getByteBufferFixed(top, left, bottom, right);
NinePatch patch = new NinePatch(bitmap, buffer.array(), srcName);
return patch;
}
public static ByteBuffer getByteBufferFixed(int top, int left, int bottom, int right) {
//Docs check the NinePatchChunkFile
ByteBuffer buffer = ByteBuffer.allocate(84).order(ByteOrder.nativeOrder());
//was translated
buffer.put((byte)0x01);
//divx size
buffer.put((byte)0x02);
//divy size
buffer.put((byte)0x02);
//color size
buffer.put(( byte)0x09);
//skip
buffer.putInt(0);
buffer.putInt(0);
//padding
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(0);
buffer.putInt(0);
//skip 4 bytes
buffer.putInt(0);
buffer.putInt(left);
buffer.putInt(right);
buffer.putInt(top);
buffer.putInt(bottom);
buffer.putInt(NO_COLOR);
buffer.putInt(NO_COLOR);
buffer.putInt(NO_COLOR);
buffer.putInt(NO_COLOR);
buffer.putInt(NO_COLOR);
buffer.putInt(NO_COLOR);
buffer.putInt(NO_COLOR);
buffer.putInt(NO_COLOR);
buffer.putInt(NO_COLOR);
return buffer;
}
Ответ 3
Похоже, что работа с 9 патчами уже подробно описана на SO - Создает NinePatch/NinePatchDrawable во время выполнения
Ответ 4
Не совсем ответ на вопрос, но полезное обходное решение...
Я всегда находил работу с файлами 9-patch во время выполнения, чтобы быть волосатыми. Я успешно использовал FrameLayouts и автоматическое изменение размера текста для достижения желаемых эффектов. Если ваше приложение будет использовать этот 9-патч, а не позволять пользователю загружать его в качестве изображения (так сказать, генератор изображений Android с 9 патчами), я бы посоветовал вам изучить это.