Android / PNG с 9 патчами: Что, если мне нужно что-то вроде PNG с 11 патчами?

В Draw 9-patch все выглядит нормально. Однако мой SDK говорит, что 9-исправление png имеет неверный формат. Потому что у меня что-то вроде 11-патч png. Потому что я не хочу масштабировать маленькую область захвата. Как заставить его работать? На скриншоте все описано:

альтернативный текст

Сообщение об ошибке в консоли:

ERROR: 9-patch image /res/drawable-hdpi/top_complete.9.png malformed.
        Can't have more than one marked region along edge.
        Found at pixel #10 along bottom edge.
ERROR: Failure processing PNG image /res/drawable-hdpi/top_complete.9.png

person OneWorld    schedule 17.09.2010    source источник


Ответы (7)


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

Установите флажок, чтобы показать область содержимого, и поэкспериментируйте с ней, чтобы понять, о чем я говорю.

альтернативный текст

person colithium    schedule 17.09.2010
comment
На исходном изображении соедините два нижних сегмента линии. Вот и все. Как я уже сказал, нижняя строка определяет область СОДЕРЖИМОГО, а не область РАСШИРЯЕМОГО. - person colithium; 18.09.2010
comment
Ты прав. Он также работает и более надежен. Теперь я действительно понял, что означает правая и нижняя строка. Я не читал developer.android.com/guide/topics /graphics/ достаточно внимательно. - person OneWorld; 20.09.2010
comment
Это невероятно легко сделать ошибку. Я просто случайно прочитал этот самый документ не так давно. Мне еще пришлось посмотреть, какая сторона какая :) - person colithium; 20.09.2010

Я бы не стал разбивать его на левое и правое, я бы удалил == в 9-патче и использовал его как отдельное изображение с центром и нижней гравитацией, чтобы оно всегда оставалось посередине, где вы этого хотите.

Подсказка: я всегда уменьшаю «масштабированную» часть до ширины/высоты 1 пикселя, чтобы получить минимизированное изображение.

person WarrenFaith    schedule 17.09.2010
comment
Хорошо, я посмотрю на это. Я опубликую свой успех ;) Подсказка @ur: это правильно, но это возможно только в том случае, если ваш градиент идет только в одном направлении. - person OneWorld; 17.09.2010
comment
правда... с нетерпением жду вашего решения! - person WarrenFaith; 17.09.2010
comment
Думаю, у него просто ошибка с областью содержимого 9-го патча (нижняя и правая области). То, что он хочет сделать, должно быть возможным. И было бы гораздо аккуратнее, если бы он это делал с одним 9-ти патчем ИМХО. - person colithium; 17.09.2010

альтернативный текст

9-Patch PNG без граббера

альтернативный текст

XML кнопки:

<Button
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:textColor="#FFFFFF"
  android:textStyle="bold"
  android:textSize="11sp"
  android:id="@+id/ButtonTop"
  android:background="@drawable/top_just_bg"
  android:drawableBottom="@drawable/top_dropper"
  android:gravity="center"
  android:paddingLeft="15sp"
  android:paddingRight="15sp"
  android:paddingTop="3sp"
  android:text="There we go! It's working... ;)"></Button>

Можно ли использовать Padding и sp-значения?

person OneWorld    schedule 17.09.2010
comment
также рассмотрите ответ mreichelt, который я не тестировал, потому что мое решение сработало очень хорошо. я отмечаю свой ответ, потому что он точно соответствует вопросу. спасибо вам всем! - person OneWorld; 18.09.2010
comment
Мне любопытно узнать, приняли ли вы мое предложение? Я почти уверен, что вы можете легко достичь того, чего изначально хотели. - person colithium; 18.09.2010
comment
Этот ответ тоже хорош, но лучше используйте ответ от colithium. - person OneWorld; 20.09.2010

Поскольку исходная проблема еще не решена: вы можете разделить изображение на два слоя, один NinePatchDrawable для растягиваемой части и сплошной (по центру) для статического изображения. Затем просто используйте LayerDrawable, чтобы нарисовать их поверх каждого Другие. Вот хороший пример использования соответствующего тега <layer-list>. Вот как это сделать правильно. ;-)

person mreichelt    schedule 17.09.2010

Разделите исходное изображение на две части и используйте их.

person apa64    schedule 17.09.2010
comment
Я хочу использовать кнопку элемента и поместить текст, длина которого может меняться, поверх этой кнопки. Эта кнопка должна растягиваться вместе с текстом до определенной ширины. Только что я разделил изображение и назначил левую сторону для рисования слева, а другую - для рисования слева. Но чем он не растягивается - person OneWorld; 17.09.2010

Это изображение выше выглядит нормально, и предварительный просмотр показывает, что все в порядке.

Какое сообщение об ошибке выдает устройство при попытке его использования?

Вы уверены, что каждый пиксель на краю либо полностью белый, либо черный?
Даже малейшая прозрачность на краю может нарушить работу Android.


Изменить:
Ага, сообщение об ошибке указывает на проблему.
Только верхний край изображения определяет, какие области будут растянуты.

Удалите черные пиксели на нижнем краю, предполагая, что это просто полоса захвата, внутри которой не будет содержимого (например, текста).

В противном случае просто заполните центральный пробел в нижнем крае, чтобы текстовое содержимое отображалось в фиолетовой области.

person Christopher Orr    schedule 17.09.2010

Просмотрите все границы... Две сверху и слева (будут масштабироваться) и по 1 справа и снизу (масштабироваться не будут).

введите здесь описание изображения

person Alberto Hdez    schedule 14.10.2015