Поиск по сайту:

Дизайн кнопки Android, пользовательская кнопка, круглая кнопка, цвет


В этом уроке мы будем настраивать кнопки в нашем приложении для Android. Если вы не знакомы с кнопками Android, ознакомьтесь с этим руководством, прежде чем продолжить. Мы будем устанавливать селекторы и формы для наших кнопок в xml.

Дизайн кнопки Android

Селектор используется для определения различного поведения для разных состояний кнопки. Что такое рисуемые состояния? Каждое из следующих событий представления (кнопки или любого другого вида) является типом состояния:

  • состояние_нажато
  • состояние_выбрано
  • с фокусом на состоянии
  • состояние_включено

state_focused — это когда вы наводите курсор на виджет. Обычно работает только на эмуляторах. state_selected предназначен для выбора представления. Не работает с кнопками. Работает с RadioButtons. Обычно у кнопки есть только три важных состояния: обычное, нажатое и включенное. Для каждого из состояний селектора мы можем установить для нашей кнопки другой объект рисования/цвет/форму. Давайте начнем с реализации каждого из них в новом проекте Android Studio.

Структура проекта пользовательской кнопки Android

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="https://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@color/red"/>
    <item android:state_focused="true" android:drawable="@color/yellow"/>
    <item android:drawable="@color/green"/>
</selector>

В приведенном выше коде каждое из состояний представлено с помощью тега элемента. Тег селектора в некоторой степени ведет себя как оператор if-else if. Он проверяет каждое условие сверху вниз. Всякий раз, когда условие соответствует, оно устанавливает соответствующие вещи на кнопку и прекращает обработку тегов следующего элемента. Третий тег элемента является тегом по умолчанию. Важно, чтобы мы сохранили его в последнюю очередь. Сохранение его наверху не позволит двум другим тегам элементов выполняться когда-либо. Мы устанавливаем приведенный выше файл селектора для нашей кнопки в activity_main.xml как:

<Button
            android:id="@+id/btnBgSelector"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="8dp"
            android:background="@drawable/btn_bg_selector"
            android:padding="8dp"
            android:text="Colored Selector" />

Селектор устанавливается на атрибут фона кнопки.

Селектор для отключенной кнопки

Следующий селектор btn_bg_selector_disabled.xml используется для неактивной кнопки.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="https://schemas.android.com/apk/res/android">
    <item android:state_enabled="false" android:drawable="@color/yellow"/>
    <item android:state_pressed="true" android:drawable="@color/red"/>
    <item android:drawable="@color/green"/>
</selector>

Чтобы приведенный выше селектор работал, нам нужно указать android:enabled как false.

<Button
            android:id="@+id/btnBgSelectorDisabled"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="8dp"
            android:background="@drawable/btn_bg_selector_disabled"
            android:enabled="false"
            android:padding="8dp"
            android:text="Color Selector Disabled" />

Селектор с различными чертежами

Мы можем установить другое отображаемое изображение, которое будет отображаться в зависимости от состояния кнопки. Код селектора, который делает это, находится в файле btn_drawable_selector.xml.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="https://schemas.android.com/apk/res/android">
    
    <item android:drawable="@drawable/sad" android:state_pressed="true"/>
    <item android:drawable="@drawable/happy" android:state_focused="true"/>
    <item android:drawable="@drawable/happy"/>

</selector>

Примечание. Состояние фокусировки не работает на смартфонах. Теперь рисуемые изображения, установленные в качестве фона кнопки, могут растягиваться, если их ширина/высота больше, чем у кнопки. Поэтому нам нужно установить ширину/высоту кнопки в соответствии с нарисованным изображением. Мы можем сделать это либо путем жесткого кодирования в xml, либо программно получив размеры, которые можно рисовать, и установив их над кнопкой. Для удобства мы сделали первое здесь:

<Button
            android:id="@+id/btnDrawableSelector"
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:layout_margin="8dp"
            android:background="@drawable/btn_drawable_selector"
            android:padding="16dp" />

ImageButton — это идеальное представление, которое следует использовать, когда вам нужно отобразить рисуемый объект в качестве фона кнопки только потому, что он подходит для рисования соответствующим образом. ImageButton поставляется с атрибутом android:scale для изменения размера рисуемого изображения.

<ImageButton
            android:id="@+id/imgButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="8dp"
            android:background="@color/green"
            android:padding="8dp"
            android:scaleType="center"
            android:src="@drawable/btn_drawable_selector" />

Цвет кнопки Android

Мы можем изменить цвет текста на кнопке в зависимости от состояния селектора. Следующий код из btn_txt_selector.xml делает это. Нам нужно использовать здесь android:color вместо android:drawable.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="https://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:color="@color/red"/>
    <item android:state_focused="true" android:color="@color/yellow"/>
    <item android:color="@color/green"/>
</selector>

Кнопка в макете:

<Button
            android:id="@+id/btnTxtSelector"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="8dp"
            android:text="Text Selector"
            android:textColor="@drawable/btn_txt_selector" />

Формы кнопок Android

Мы можем установить пользовательские формы для нашей кнопки, используя xml-тег <shape>. Эти xml-файлы также создаются в папке с возможностью рисования. shape можно использовать внутри селекторов. Можно задать следующие формы: прямоугольник (по умолчанию), овал, кольцо, линия. Наиболее часто используемые теги внутри тега формы:

  •  – установка начального и конечного цветов градиента, а также его типа (радиус, линейный, развертка).
  •  – установка цвета и ширины границы.
  •  – установка сплошного цвета на кнопке.
  • – Настройка радиуса

Android-кнопка с круглым углом

Код xml для файла btn_shape_round.xml приведен ниже:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="https://schemas.android.com/apk/res/android"
    android:padding="16dp"
    android:shape="rectangle">
    <stroke
        android:width="1dp"
        android:color="@android:color/black" />
    <corners android:radius="10dp" />
</shape>

Как и в случае с селекторами, мы можем установить это в теге android:background на кнопке в нашем XML-макете.

Форма кнопки Android с градиентом

В следующем файле btn_shape_gradient.xml мы установили градиент как radial. Мы также должны установить атрибут градиента_радиуса.

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="https://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <gradient
        android:endColor="@color/green"
        android:gradientRadius="30dp"
        android:type="radial"
        android:startColor="@color/yellow" />

    <corners android:radius="@dimen/btn_corner_radius" />

    <stroke
        android:width="4dp"
        android:color="@android:color/black" />

</shape>

Форма кнопки Android и селектор вместе

btn_selector_shape.xml содержит селектор. Каждый из предметов имеет заданную форму.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="https://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">

        <shape android:shape="oval">
            <gradient android:angle="135" android:endColor="@color/jd_red" android:startColor="@color/green" />
            <corners android:radius="20dp" />
            <stroke android:width="2dp" android:color="@android:color/black" />
        </shape>

    </item>

    <item>
        <shape android:shape="rectangle">
            <gradient android:angle="225" android:endColor="@color/green" android:startColor="@color/jd_red" />
            <corners android:radius="@dimen/btn_corner_radius" />
            <stroke android:width="4dp" android:color="@android:color/black" />
        </shape>

    </item>
</selector>

Установите это на кнопке, и форма изменится с прямоугольной на овальную при нажатии кнопки. Линейный градиент должен иметь угол, кратный 45, иначе произойдет сбой. Установка формы кнопки в виде капсулы btn_shape_capsule.xml — это место, где мы устанавливаем форму внутри селекторов в виде капсулы.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="https://schemas.android.com/apk/res/android">

    <item android:state_pressed="true">
        <shape android:shape="rectangle">

            <solid android:color="@color/colorAccent" />
            <corners android:radius="10dp" />

        </shape>

    </item>
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@color/yellow" />
            <corners android:radius="10dp" />
        </shape>

    </item>

</selector>

Ниже приведен код класса MainActivity.java, в котором размещены все приведенные выше примеры кнопок.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_vertical"
    android:orientation="horizontal"
    android:weightSum="2">


    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center"
        android:orientation="vertical">


        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Selectors"
            android:textColor="@android:color/black"
            android:textSize="18sp"
            android:textStyle="bold|italic" />


        <Button
            android:id="@+id/btnBgSelector"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="8dp"
            android:background="@drawable/btn_bg_selector"
            android:padding="8dp"
            android:text="Colored Selector" />

        <Button
            android:id="@+id/btnBgSelectorDisabled"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="8dp"
            android:background="@drawable/btn_bg_selector_disabled"
            android:enabled="false"
            android:padding="8dp"
            android:text="Color Selector Disabled" />

        <Button
            android:id="@+id/btnDrawableSelector"
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:layout_margin="8dp"
            android:background="@drawable/btn_drawable_selector"
            android:padding="16dp" />

        <ImageButton
            android:id="@+id/imgButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="8dp"
            android:background="@color/green"
            android:padding="8dp"
            android:scaleType="center"
            android:src="@drawable/btn_drawable_selector" />

        <Button
            android:id="@+id/btnTxtSelector"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="8dp"
            android:text="Text Selector"
            android:textColor="@drawable/btn_txt_selector" />


    </LinearLayout>


    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Shapes+Selectors"
            android:textColor="@android:color/black"
            android:textSize="18sp"
            android:textStyle="bold|italic" />

        <Button
            android:id="@+id/btnRoundShape"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="8dp"
            android:background="@drawable/btn_shape_round"
            android:padding="8dp"
            android:text="ROUND SHAPE" />

        <Button
            android:id="@+id/btnBgShape"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/btn_shape_gradient"
            android:padding="8dp"
            android:text="SHAPE WITH GRADIENT" />


        <Button
            android:id="@+id/btnSelectorShape"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="8dp"
            android:background="@drawable/btn_selector_shape"
            android:padding="8dp"
            android:text="SELECTOR SHAPE" />


        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="8dp"
            android:background="@drawable/btn_shape_gradient"
            android:padding="8dp"
            android:scaleType="center"
            android:src="@drawable/btn_drawable_selector" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="8dp"
            android:background="@drawable/btn_shape_capsule"
            android:padding="8dp"
            android:text="Text Selector"
            android:textColor="@drawable/btn_txt_selector" />


    </LinearLayout>


</LinearLayout>

Вывод приложения Android Custom Button Design

Скачать проект Android Button Design