Кнопка создания материала с рамкой
Я знаю, как сделать кнопку Material Design с заполнением цветом:
style="@style/Widget.AppCompat.Button.Colored"
И безграничная прозрачная кнопка:
style="@style/Widget.AppCompat.Button.Borderless.Colored"
Тем не менее, есть ли способ сделать границу с материалом (прозрачной внутри)? Что-то вроде ниже?
Ответы
Ответ 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
, чтобы изменить цвет и ширину границы.
Вы также можете настроить углы, используя 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"/>
Это в значительной степени. Вот пример того, как теперь выглядят кнопки.
Ответ 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 за подробный ответ! Однако из-за пользовательского фона мы потеряли несколько важных вещей:
- Высота кнопки больше, чем у
Widget.AppCompat.Button
по умолчанию. - Прокладки
- Включить/отключить состояния
В случае, если вам интересно, вот как выглядит фон по умолчанию: 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
по умолчанию:
Теперь, вы можете начать настраивать цвета, предоставив собственную реализацию селектора цветов @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" />
где
- app: backgroundTint используется для цвета фона
- app: strokeColor - цвет рамки
- 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
Этот сайт дает нам полный обзор того, как внедрить материальные компоненты в наш проект. Благодарю вас.