Percent Support Library — библиотека, позволяющая при создании пользовательских интерфейсов указывать размеры не в пикселях, а в процентах.

Screenshot 1

До появления этой библиотеки создать элемент интерфейса шириной в 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, — не верьте и не обращайте внимание.

Ссылки: