2013-05-12 6 views
13

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

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

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

Android 3.0+ result

Однако, работает один и тот же код на Android 2.3.x дает результат:

Android 2.x result

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

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

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

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

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

РЕДАКТИРОВАТЬ # 2 Эту сущность описывает exactly what I'm trying to do + Исходное изображение: source image

РЕДАКТИРОВАТЬ # 3 Размер изображения 22px/58px (ширина/высота) и вставки являются 14/6/14/6 (верхний/левый/нижний/правый).

+0

Как вы применяете сгенерированную 9patch? –

+0

@mr_archano Я использую класс в gist выше и передаю его вставки с надписью, которые соответствуют масштабируемым частям изображения, которое я хочу отобразить. Это создает «NinePatchDrawable», который затем я устанавливаю в качестве фона для «TextView». – Andre

+0

Хорошо, я вижу. Мне просто интересно, как «Drawable.setBounds()» каким-то образом связана с этой проблемой. –

ответ

5

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

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

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

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

+0

Я пробовал практически каждую комбинацию, о которой я думал. Проблема с этим объяснением заключается в том, что он не определяет, как отмечать растяжимые и фиксированные разделы (хотя я знаю, что они всегда будут SFSxSFS). Я также сравнил байтовые данные одного и того же изображения, загруженные через обычный файл .9.png, и тот, который я генерирую, копируя один в другой (.png chunk в сгенерированный фрагмент версии), дает тот же эффект. – Andre

+0

Если я загружаю изображение с помощью обычного метода appt/.9png, он работает нормально. Я добавил gist, показывающий мой исходный код и изображение. – Andre

+0

Я добавил размер и вставки изображения. Отображаемая версия - «удвоенная», поэтому вставки должны быть удвоены. – Andre

0

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

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

+0

Спасибо, но пользователь загружает изображение, и его нужно применять к элементу произвольного размера, поэтому, к сожалению, это не сработает. – Andre

16

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

ОТЛИЧНО, это СОВЕРШЕННО! Спасибо. – Andre

+0

Godlike. Это спасло мое дно, большое время ... – Scorchio

+0

Спасибо, но каково правильное значение для верхнего, левого, нижнего и правого ?. В настоящее время я использую top = bitmapWidth/4, left = bitmapHeight/2, bottom = bitmapWidth - left, right = bitmapHeight - left. Фон хорош, но содержимое (текст в кнопке) по-прежнему выходит за пределы изображений. Как заставить контент в кнопке посередине растрового изображения ?. – Paul

Смежные вопросы