Кнопка создания материала с рамкой

Я знаю, как сделать кнопку Material Design с заполнением цветом:

style="@style/Widget.AppCompat.Button.Colored"

И безграничная прозрачная кнопка:

style="@style/Widget.AppCompat.Button.Borderless.Colored"

Тем не менее, есть ли способ сделать границу с материалом (прозрачной внутри)? Что-то вроде ниже?

enter image description here

Ответ 1

Вы также можете использовать новые Материальные компоненты для Android.

В стабильном выпуске компонентов материалов Android в ноябре 2018 года Google переместил компоненты материалов из пространства имен android.support.design в com.google.android.material.
Библиотека компонентов материалов является заменой Библиотеки поддержки дизайна Android.

Добавьте зависимость к вашему build.gradle:

dependencies { implementation ‘com.google.android.material:material:1.0.0 }

В этом случае вы можете использовать MaterialButton в файле макета:

<com.google.android.material.button.MaterialButton
   ....
   style="@style/Widget.MaterialComponents.Button.OutlinedButton"
   app:cornerRadius=".."
   app:strokeColor="@color/colorPrimary"/>

Примените стиль @style/Widget.MaterialComponents.Button.OutlinedButton.

В вашем случае используйте атрибут app:cornerRadius, чтобы изменить размер радиуса угла. Это закруглит углы с указанными размерами.
Используйте атрибут te app:strokeColor и app:strokeWidth, чтобы изменить цвет и ширину границы.
enter image description here

Вы также можете настроить углы, используя ShapeApperance (для этого требуется версия 1.1.0)

<style name="MyButton" parent="Widget.MaterialComponents.Button.OutlinedButton">
    <item name="shapeAppearanceOverlay">@style/MyShapeAppearance</item>
</style>
<style name="MyShapeAppearance" parent="">
    <item name="cornerFamilyTopLeft">rounded</item>
    <item name="cornerFamilyBottomLeft">rounded</item>
    <item name="cornerFamilyTopRight">cut</item>
    <item name="cornerFamilyBottomRight">cut</item>
    <item name="cornerSize">8dp</item>
</style>

Официальный документ здесь, а все спецификации Android здесь.

OLD (поддержка библиотеки)

С новой библиотекой поддержки 28.0.0 библиотека дизайна теперь содержит Material Button.

Вы можете добавить эту кнопку в наш файл макета с помощью:

<android.support.design.button.MaterialButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="XXXX"
    android:textSize="18sp"
    app:icon="@drawable/ic_android_white_24dp" />

Вы можете настроить кнопку с помощью следующих атрибутов:

  • app:backgroundTint: используется для нанесения оттенка на фон кнопки. Если вы хотите изменить цвет фона кнопки, используйте этот атрибут вместо фона.

  • app:strokeColor: цвет, который будет использоваться для нажатия кнопки

  • app:strokeWidth: ширина, которая будет использоваться для нажатия кнопки

Также

Ответ 2

Вот как это сделать правильно.

Что вам нужно сделать, это

1 - Создайте форму с возможностью инсульта
2 - Создайте рябь
3 - Создайте селектор, который выберет меньше, чем v21
4 - Создайте новый стиль для кнопки с рамкой
5 - Применить стиль на кнопке

1 - Создайте форму с инсультом btn_outline.xml

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

    <stroke
        android:width="2dp"
        android:color="@color/colorAccent">
    </stroke>
    <solid android:color="@color/colorTransparent"/>
    <corners
        android:radius="5dp">
    </corners>

</shape>

2 - Создайте drawable-v21/bg_btn_outline.xml

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
        android:color="@color/colorOverlay">
    <item>
        <shape>
            <stroke
                android:width="2dp"
                android:color="@color/colorAccent"/>
            <corners android:radius="5dp"/>
        </shape>
    </item>
    <item android:id="@android:id/mask">
        <shape>
            <stroke
                android:width="2dp"
                android:color="@color/colorAccent"/>
            <solid android:color="@android:color/white"/>
            <corners android:radius="5dp"/>
        </shape>
    </item>

</ripple>

android:id="@android:id/mask" требуется иметь обратную связь с обратной связью на кнопке. Слой, который отмечен как маска, не отображается на экране, его просто для обратной связи касания.

3 - Создайте селектор, который выберет меньше, чем v21 drawable drawable/bg_btn_outline.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/btn_outline" android:state_pressed="true">
        <shape android:shape="rectangle">
            <solid android:color="@color/colorOverlay"/>
        </shape>
    </item>
    <item android:drawable="@drawable/btn_outline" android:state_focused="true">
        <shape android:shape="rectangle">
            <solid android:color="@color/colorOverlay"/>
        </shape>
    </item>

    <item android:drawable="@drawable/btn_outline"/>

</selector>

4 - Создайте новый стиль для кнопки с границей. Все ресурсы, которые необходимы для создания стиля, приведены выше, как ваш стиль должен выглядеть так:

<style name="ButtonBorder" parent="Widget.AppCompat.Button.Colored"/>

<style name="ButtonBorder.Accent">
        <item name="android:background">@drawable/bg_btn_outline</item>
        <item name="android:textColor">@color/colorAccent</item>
        <item name="android:textAllCaps">false</item>
        <item name="android:textSize">16sp</item>
        <item name="android:singleLine">true</item>
    </style>

4 - Применить стиль на кнопке

<Button
   style="@style/ButtonBorder.Accent"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"/>

Это в значительной степени. Вот пример того, как теперь выглядят кнопки. enter image description here

Ответ 3

Это можно сделать довольно легко, если для атрибута кнопки Material Design Button style установить значение @style/Widget.MaterialComponents.Button.OutlinedButton, а для значения атрибута app:strokeColor выбрать предпочитаемый цвет.

Пример:

<com.google.android.material.button.MaterialButton
                android:text="Rounded outlined button"
                android:layout_height="wrap_content"
                android:layout_width="wrap_content"
                android:id="@+id/btnRound"
                style="@style/Widget.MaterialComponents.Button.OutlinedButton"
                app:strokeColor="@color/colorPrimaryDark"/>

Ссылки:

Ответ 4

Кредиты @NomanRafique за подробный ответ! Однако из-за пользовательского фона мы потеряли несколько важных вещей:

  1. Высота кнопки больше, чем у Widget.AppCompat.Button по умолчанию.
  2. Прокладки
  3. Включить/отключить состояния

В случае, если вам интересно, вот как выглядит фон по умолчанию: https://android.googlesource.com/platform/frameworks/support/+/a7487e7/v7/appcompat/res/drawable-v21/abc_btn_colored_material.xml

Повторно используя оригинальные вставки, paddings и селекторов цветов, в простом случае мы можем придумать что-то вроде этого (все значения по умолчанию взяты из библиотеки поддержки android):

вытяжка-V21/bg_btn_outlined.xml

<inset xmlns:android="http://schemas.android.com/apk/res/android"
       android:insetLeft="@dimen/abc_button_inset_horizontal_material"
       android:insetTop="@dimen/abc_button_inset_vertical_material"
       android:insetRight="@dimen/abc_button_inset_horizontal_material"
       android:insetBottom="@dimen/abc_button_inset_vertical_material">
    <ripple xmlns:android="http://schemas.android.com/apk/res/android"
            android:color="?attr/colorControlHighlight">
        <item>
            <shape>
                <stroke
                    android:width="2dp"
                    android:color="@color/abc_btn_colored_borderless_text_material"/>
                <corners android:radius="@dimen/abc_control_corner_material"/>
                <padding
                    android:bottom="@dimen/abc_button_padding_vertical_material"
                    android:left="@dimen/abc_button_padding_horizontal_material"
                    android:right="@dimen/abc_button_padding_horizontal_material"
                    android:top="@dimen/abc_button_padding_vertical_material"/>
            </shape>
        </item>
        <item android:id="@android:id/mask">
            <shape>
                <stroke
                    android:width="2dp"
                    android:color="@color/abc_btn_colored_borderless_text_material"/>
                <solid android:color="@android:color/white"/>
                <corners android:radius="@dimen/abc_control_corner_material"/>
            </shape>
        </item>
    </ripple>
</inset>

styles.xml

<style name="Button.Outlined" parent="Widget.AppCompat.Button.Borderless.Colored">
    <item name="android:background">@drawable/bg_btn_outlined</item>
</style>

На этом этапе у нас должна быть наброшенная кнопка, которая реагирует на касания, учитывает enabled="false" состояние и той же высоты, что и Widget.AppCompat.Button по умолчанию:

enter image description here

Теперь, вы можете начать настраивать цвета, предоставив собственную реализацию селектора цветов @color/abc_btn_colored_borderless_text_material.

Ответ 5

Вот как я делаю кнопки только с границей и эффектом пульсации на Lollipop и выше. Так же, как и кнопки AppCompat, они оказывают понижающее влияние на более низкие API-интерфейсы (если вам нужны ряби на более низких API-интерфейсах, вам нужно использовать внешнюю библиотеку). Я использую FrameLayout, потому что это дешево. Цвет текста и границы черного цвета, но вы можете изменить его с помощью обычного:

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="20dp"
    android:background="@drawable/background_button_ghost">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?android:selectableItemBackground"
        android:gravity="center"
        android:padding="14dp"
        android:textSize="16sp"
        android:textAllCaps="true"
        android:textStyle="bold"
        android:textColor="@android:color/black"
        android:text="Text"/>
</FrameLayout>

рисуем /background_button_ghost.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <stroke
        android:width="2dp"
        android:color="@android:color/black"/>
    <solid android:color="@color/transparent"/>
</shape>

Если я что-то пропустил, оставьте комментарий, и я обновлю ответ.

Ответ 6

В вашем XML используйте это,

            <com.google.android.material.button.MaterialButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Its a button"
                android:textColor="@android:color/white"
                android:textSize="@dimen/_12ssp"
                app:backgroundTint="@android:color/transparent"
                app:strokeColor="@android:color/white"
                app:strokeWidth="@dimen/_1sdp" />

где

  1. app: backgroundTint используется для цвета фона
  2. app: strokeColor - цвет рамки
  3. app: strokeWidth - ширина границы

Ответ 7

Просто вы можете использовать этот код. Это выглядит хорошо.

           <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="#ffffff"
                android:orientation="vertical">

                <android.support.v7.widget.AppCompatButton
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:backgroundTint="#F48025"
                    android:text="login"
                    android:textColor="@color/colorWhite" />

            </LinearLayout>

Здесь цвет границы:

android:background="#ffffff"

И цвет фона:

android:backgroundTint="#F48025"

Ответ 8

Этот сайт дает нам полный обзор того, как внедрить материальные компоненты в наш проект. Благодарю вас.