Создание 9 патчей, доступных во время выполнения

Я успешно создаю 9patch, который можно использовать во время работы на Android 3.0+, используя превосходный инструмент, предоставленный Брайаном Гриффи (найденный здесь ).

По сути, я загружаю необработанный (без патчей) графический файл из сети, а имя файла содержит вставки для крышки, которые мне нужно использовать, чтобы соответственно масштабировать изображение. Затем я использую эти значения с классом, указанным выше, и применяю изображение в качестве фона для множества элементов (таких как TextView , ImageButton , Button , ViewGroup и т. Д.).

Это прекрасно работает, как вы можете видеть здесь:

Результат Android 3.0+

Тем не менее, запуск того же кода на Android 2.3.x дает результат:

Результат Android 2.x

Я просмотрел исходный код, используемый в Android, для анализа изображения 9patch ( здесь и здесь ), но не нашел способа заставить его работать правильно. Я пробовал все, что мог бы наброситься на него, но безрезультатно.

Для записи 9patch состоит из трех столбцов на каждой оси, одна фиксированная, одна растяжимая и одна фиксированная.

Здесь надеются, что кто-то еще решил эту проблему раньше.

Заранее спасибо.

EDIT Меня интересует только дублирование этого поведения на Android 2.3 и выше (у меня первоначально было 2.x).

РЕДАКТИРОВАТЬ # 2 Этот смысл описывает то, что я пытаюсь сделать + Исходное изображение: Исходное изображение

EDIT # 3 Размер изображения 22px / 58px (ширина / высота), а вставки – 14/6/14/6 (верхний / левый / нижний / правый).

Solutions Collecting From Web of "Создание 9 патчей, доступных во время выполнения"

Соединяя все, что я заметил до сих пор, и немного оттачивая его:

  • Кажется, что нет никакой разницы в структуре Res_png_9patch (в которую входит байтовый кусок) между версиями Android (см. http://code.metager.de/source/xref/android ), чтобы это не выглядело Причина.

  • Другие ответы о девяти исправлениях патчей предполагают, что каждая область (особенно растяжимая) должна быть как минимум 2×2 пикселя (если не 3×3), но лучше этого меньше.

  • Однако способ выделения части байтового блока выглядит так, как будто он может быть обновлен. Попробуйте установить 4-й байт на 9 (количество патчей, я думаю), добавив еще 7 NO_COLOR s к концу и перемещая его размер до 56 + (7 x 4) = 84 байта

Он работает для меня после обновления кода. Я думаю, что размер цвета сделал его недовольным по какой-то причине (основываясь на комментариях в исходном коде 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; } 

Похоже, что работа с 9 патчами уже подробно описана на SO – создайте NinePatch / NinePatchDrawable во время выполнения

Не совсем ответ на вопрос, но полезный обходной путь …

Я всегда находил работу с файлами 9-patch во время выполнения, чтобы быть волосатыми. Я успешно использовал FrameLayouts и автоматическое изменение размера текста для достижения желаемых эффектов. Если ваше приложение будет использовать этот 9-патч и не позволяет пользователю загружать его в качестве изображения (так сказать, генератор изображений Android-9), я бы посоветовал вам изучить его.