9-Patch Drawable размеры Android. Как различные плотности справляются с нерастянутыми областями?

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

Рассмотрим изображение выше. - Пунктирная линия разграничивает 9-патч png, который я вырежу из файла фотошопа. Мне это нужно для создания всплывающего окна. - Коробка включает в себя dropShadow, как показано на этой фотографии с помощью измерительного инструмента. - Розовые линии показывают, как я буду использовать инструмент draw9Patch для создания 9-Patch.

Мой вопрос: если у меня есть представление «Контейнер» с 9-исправлением для фона, мне нужно убедиться, что его дочерние представления всегда находятся внутри белого поля. Я собирался использовать прокладку для этого. Я собирался установить отступ равным измерительному инструменту. Поэтому, если в фотошопе это 30 пикселей, я установлю layout_paddingLeft"=30dp" для контейнера. (Дизайн находится в MDPI, поэтому я предполагаю, что это преобразование в порядке). Однако как экраны разной плотности справляются с 9path. Например, будет ли измеренная площадь 30px или 30dip?


person JackMahoney    schedule 20.02.2013    source источник
comment
Я всегда думал, что содержимое останется (принудительно, нерастягиваемая область действует как отступ) в поле, полученном в результате пересечения линий растяжения. У вас есть пример контента, переполняющего это поле, или вы просто предполагаете, что он может переполниться?   -  person user    schedule 20.02.2013


Ответы (1)


С помощью инструмента draw9patch вы можете определить:

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

  • вертикальное растяжение: черные пиксели слева
  • растяжение по горизонтали: черные пиксели на верхней стороне
  • вертикальный контент: черные пиксели справа
  • горизонтальное содержимое: черные пиксели внизу

Обратите внимание, что пиксели растяжения не обязательно должны быть непрерывными, поэтому вы можете исключить из растяжения какой-то конкретный фрагмент (посмотрите на стрелку всплывающего окна выше). В то же время вы можете составить разумное представление о том, где будет размещен ваш контент, просто взглянув на превью справа с фиолетовыми областями. Как вы можете предположить, таким образом вам не нужно указывать какие-либо отступы. в вашем макете: представление будет учитывать эти значения, используя 9патч, который вы установили в качестве фона.

Области без растяжения масштабируются с плотностью пикселей. Таким образом, если вы установите 9patch выше как ресурс mdpi, крайний левый верхний фрагмент будет отображаться в области 50x40 пикселей @mdpi и в области 100x80 пикселей @xhdpi. Вместо этого крайние левые области растяжения располагают свою ширину в соответствии с dpi, а высоту — в соответствии с содержимым. Аналогичным образом работают и другие растягивающие слайсы.

В обоих случаях работа с 9-патчем «низкого разрешения» может привести к уродливым артефактам пикселизации. Возможное решение состоит в том, чтобы предоставить разные 9 патчей для каждого поддерживаемого dpi или определить только более высокие (xhdpi) и позволить Android уменьшить их соответствующим образом.

Границы содержимого также обрабатываются как dp, поэтому они масштабируются в соответствии с плотностью пикселей. Например: левый отступ, определенный в исходном 9patch как 40px@mdpi, будет преобразован в 80px@xhdpi, поэтому содержимое никогда не выйдет за заданные границы. Обратите внимание, что вы даже можете переопределить границы содержимого, указанные в 9patch, с помощью свойств padding* в макете.

person a.bertucci    schedule 20.02.2013
comment
или определить только более высокие (xhdpi) и позволить Android уменьшить их соответственно, мне очень помогает. - person Xavier.S; 28.09.2016