Percent Support Library
Percent Support Library — библиотека, позволяющая при создании пользовательских интерфейсов указывать размеры не в пикселях, а в процентах.
До появления этой библиотеки создать элемент интерфейса шириной в 20% от всей ширины экрана можно было двумя путями:
- Используя веса (
layout_weight
) вLinearLayout
; - Описывая это в коде, создавая кастомные
ViewGroup
или переопределяяonMeasure()
.
Одно из возможных решений до появления Percent Support Library выглядит так (не делайте так в своих программах):
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="15"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="30"
android:orientation="horizontal">
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="55"/>
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="30"
android:background="#00ffff"
android:gravity="center"
android:text="Target"/>
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="15"/>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="55"/>
</LinearLayout>
То есть мы имеем лишние элементы, необоснованную вложенность и много ненужного кода. Это убавляет как производительность, так и читаемость.
Непонятно, почему Google так долго готовил решение, но оно, наконец, появилось в виде новой библиотеки.
Библиотека подключается отдельной строчкой в build.gradle:
compile 'com.android.support:percent:23.3.0'
Библиотека дает нам два новых класса — PercentFrameLayout
и PercentRelativeLayout
.
Эти классы наследуют все возможности FrameLayout
и RelativeLayout
, а также дают
10 новых атрибутов:
layout_widthPercent
иlayout_heightPercent
— ширина и высота в процентахlayout_marginPercent
— отступы, в процентахlayout_marginLeftPercent
,layout_marginTopPercent
,layout_marginRightPercent
,layout_marginBottomPercent
,layout_marginStartPercent
,layout_marginEndPercent
— один отступ, в процентахlayout_aspectRatio
— соотношение ширины к высоте, в процентах
Описанная выше задача с помощью новой библиотеки решается так:
<TextView
…
app:layout_heightPercent="30%"
app:layout_widthPercent="30%"
app:layout_marginLeftPercent="55%"
app:layout_marginTopPercent="15%"/>
Регулярно возникающую задачу - сделать квадратный элемент, можно решить с помощью атрибута layout_aspectRatio
:
<TextView
…
app:layout_widthPercent="20%"
app:layout_aspectRatio="100%"/>
При использовании атрибутов layout_heightPercent
и layout_widthPercent
традиционные layout_height
и
layout_width
не нужны. Если студия будет показывать ошибку и сообщать, что ‘layout_height’ should be defined
, —
не верьте и не обращайте внимание.
Ссылки:
- Описание библиотеки на официальном сайте
- Описания новых атрибутов даны в описаниях классов: PercentFrameLayout и PercentRelativeLayout
- Исходный код примера для этой статьи: https://github.com/JollyDroidNotebook/PercentLibraryDemo