Подтвердить что ты не робот

Создание 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 (верхний/левый/нижний/правый).

4b9b3361

Ответ 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;
}

Ответ 4

Не совсем ответ на вопрос, но полезное обходное решение...

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