[Из песочницы] Использование библиотеки Android support percent на примере PercentRelativeLayout

Когда я впервые столкнулся с разметкой макетов в Android, со всеми этими FrameLayout, LinearLayout, RelativeLayout. С понятиями веса и гравитации для элементов интерфейса. Я недоумевал, почему нельзя было сделать так, как давно уже делается в html. Где есть возможность указать разметку в процентах? И вот, наконец такая возможность появилась. Появилась она конечно не вчера, но я на нее наткнулся только сейчас, и статей на хабре, с чем это едят не нашел.

image

Итак, что же нужно для того, чтобы пощупать это счастье? Нужно совсем немного, открыть build.gradle своего приложения, добавить туда строку

dependencies {
    compile 'com.android.support:percent:23.4.0'
}

и выполнить синхронизацию.

Всё, все прелести разметки в процентах вам доступны, по крайней мере для minSDK 14 (меньше я не проверял).

Пустой макет у нас будет выглядеть так:




Для указания размеров и положения дочерних элементов мы можем использовать следующие атрибуты
  • layout_widthPercent
  • layout_heightPercent
  • layout_marginPercent
  • layout_marginLeftPercent
  • layout_marginTopPercent
  • layout_marginRightPercent
  • layout_marginBottomPercent
  • layout_marginStartPercent
  • layout_marginEndPercent
  • layout_aspectRatio

При этом нужно указывать префикс не android: layout_widthPercent, а app: layout_widthPercent, в соответствии с указанным в заголовке макета пространством имен. Значения этим атрибутам назначаются в процентах, с обязательным указанием знака %.

Собственно назначение почти всех атрибутов интуитивно понятно, ширина, высота и отступы в процентах от родительского макета.

Уточнить стоит пожалуй только layout_aspectRatio. Этот атрибут даёт вам возможность задавать соотношение сторон элемента. Например, вы хотите создать квадратную кнопку, которая занимает 15% от ширины экрана. Вы указываете layout_widthPercent = »15%», если вы укажете layout_heightPercent = »15%» то кнопка у вас получится прямоугольная. Поэтому, нужно layout_heightPercent не указывать, а указать layout_aspectRatio = »100%». В этом случае ширина будет вычисляться по формуле: layout_heightPercent * layout_aspectRatio /100.

Еще может возникнуть вопрос, чем layout_marginStartPercent отличается от layout_marginLeftPercent, и layout_marginEndPercent от layout_marginRightPercent соответственно? Тут все просто, это для обеспечения локализации интерфейса, для тех языков, которые читаются слева на право, Start = Left, а для тех которые справа налево Start = Right.

PercentRelativeLayout является наследником RelativeLayout, поэтому наряду с Percent-атрибутами, вы можете использовать атрибуты RelativeLayout, например можно указать высоту кнопки как android: layout_height=«wrap_content», а ширину app: layout_heightPercent = »25%».

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

Комментарии (1)

  • 20 августа 2016 в 14:25

    0

    Его удобно с RecyclerView использовать. Например, если нужно, чтобы скролилось горизонтально, а на весь экран помещались 2 квадратные ячейки за раз, просто ставишь для RecyclerView
    app:layout_widthPercent="100%"
    app:layout_aspectRatio="200%"
    

    И для CardView:
    app:layout_aspectRatio="100%"
    app:layout_heightPercent="100%"
    

© Habrahabr.ru