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

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

enter image description here

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

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

4b9b3361

Ответ 1

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

enter image description here

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

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

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

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

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