Android Material Design按钮样式

时间:2014-10-13 18:40:29

标签: android button material-design android-5.0-lollipop

我对材料设计的按钮样式感到困惑。我想得到彩色凸起的按钮,如附带的链接,就像在使用部分下看到的“强制停止”和“卸载”按钮一样。有可用的样式还是我需要定义它们?

http://www.google.com/design/spec/components/buttons.html#buttons-usage

我找不到默认的按钮样式。

示例:

 <Button style="@style/PrimaryButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Calculate"
    android:id="@+id/button3"
    android:layout_below="@+id/editText5"
    android:layout_alignEnd="@+id/editText5"
    android:enabled="true" />

如果我尝试通过添加

来更改按钮的背景颜色
    android:background="@color/primary"

所有样式都会消失,例如触摸动画,阴影,圆角等。

12 个答案:

答案 0 :(得分:675)

我将添加我的答案,因为我没有使用任何其他答案。

使用Support Library v7,所有样式实际上已经定义并可以使用,对于标准按钮,所有这些样式都可用:

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

Widget.AppCompat.Buttonenter image description here

Widget.AppCompat.Button.Coloredenter image description here

Widget.AppCompat.Button.Borderless enter image description here

Widget.AppCompat.Button.Borderless.Coloredenter image description here

要回答这个问题,因此使用的样式是

<Button style="@style/Widget.AppCompat.Button.Colored"
.......
.......
.......
android:text="Button"/>

如何更改颜色

对于整个应用:

所有UI控件(不仅是按钮,还有浮动操作按钮,复选框等)的颜色由属性colorAccent管理,如here所述。 您可以修改此样式并在主题定义中应用自己的颜色:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    ...
    <item name="colorAccent">@color/Orange</item>
</style>

对于特定按钮:

如果需要更改特定按钮的样式,可以定义新样式,继承上述父样式之一。在下面的示例中,我只更改了背景和字体颜色:

<style name="AppTheme.Button" parent="Widget.AppCompat.Button.Colored">
    <item name="colorButtonNormal">@color/Red</item>
    <item name="android:textColor">@color/White</item>
</style>

然后你只需要在按钮上应用这个新样式:

android:theme="@style/AppTheme.Button"

要在布局中设置默认按钮设计,请将此行添加到styles.xml主题:

<item name="buttonStyle">@style/btn</item>

其中@style/btn是您的按钮主题。这将为具有特定主题的布局中的所有按钮设置按钮样式

答案 1 :(得分:79)

最简单的解决方案

第1步:使用最新的支持库

compile 'com.android.support:appcompat-v7:25.2.0'

第2步:使用AppCompatActivity作为您的父Activity类

public class MainActivity extends AppCompatActivity

第3步:在布局XML文件中使用app命名空间

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

第4步:使用AppCompatButton代替Button

<android.support.v7.widget.AppCompatButton
    android:id="@+id/buttonAwesome"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Awesome Button"
    android:textColor="@color/whatever_text_color_you_want"
    app:backgroundTint="@color/whatever_background_color_you_want"/>

enter image description here

答案 2 :(得分:63)

如果我理解正确,你想做这样的事情:
enter image description here

在这种情况下,它应该足以使用:

<item name="android:colorButtonNormal">#2196f3</item>

或者对于少于21的API:

<item name="colorButtonNormal">#2196f3</item>

除了Using Material Theme Tutorial

动画变体是here

答案 3 :(得分:37)

这就是我得到我想要的东西。

首先,制作一个按钮(在styles.xml中):

<style name="Button">
    <item name="android:textColor">@color/white</item>
    <item name="android:padding">0dp</item>
    <item name="android:minWidth">88dp</item>
    <item name="android:minHeight">36dp</item>
    <item name="android:layout_margin">3dp</item>
    <item name="android:elevation">1dp</item>
    <item name="android:translationZ">1dp</item>
    <item name="android:background">@drawable/primary_round</item>
</style>

按钮的波纹和背景,作为可绘制的primary_round.xml

<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/primary_600">
  <item>
    <shape xmlns:android="http://schemas.android.com/apk/res/android">
        <corners android:radius="1dp" />
        <solid android:color="@color/primary" />
    </shape>
  </item>
</ripple>

这增加了我正在寻找的涟漪效应。

答案 4 :(得分:20)

以下示例将有助于在您的应用中一致地应用按钮样式。

以下是我使用特定样式的主题示例..

<style name="MyTheme" parent="@style/Theme.AppCompat.Light">
   <item name="colorPrimary">@color/primary</item>
    <item name="colorPrimaryDark">@color/primary_dark</item>
    <item name="colorAccent">@color/accent</item>
    <item name="android:buttonStyle">@style/ButtonAppTheme</item>
</style>
<style name="ButtonAppTheme" parent="android:Widget.Material.Button">
<item name="android:background">@drawable/material_button</item>
</style>

这就是我定义按钮形状和方式的方法。 res / drawable-v21文件夹中的效果......

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="?attr/colorControlHighlight">
  <item>
    <shape xmlns:android="http://schemas.android.com/apk/res/android">
      <corners android:radius="2dp" /> 
      <solid android:color="@color/primary" />
    </shape>
  </item>
</ripple>

2dp角落是为了使其与Material主题保持一致。

答案 5 :(得分:13)

  

随着Android Material Components在2018年11月的稳定发布,Google已将材质组件从名称空间android.support.design移至com.google.android.material。    Material Component library 是Android设计支持库的替代品。

the dependency添加到build.gradle

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

然后使用:

<com.google.android.material.button.MaterialButton
        style="@style/Widget.MaterialComponents.Button.OutlinedButton" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/app_name"
        app:strokeColor="@color/colorAccent"
        app:strokeWidth="6dp"
        app:layout_constraintStart_toStartOf="parent"
        app:shapeAppearance="@style/MyShapeAppearance"
   />

您可以在此处查看full documentationAPI here

<强> OLD:

使用新的Support Library 28.0.0-alpha1 release,设计库现在包含Material Button

您可以使用以下命令将此按钮添加到我们的布局文件中:

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

默认情况下,此类将使用主题的强调颜色作为按钮填充背景颜色,白色则使用按钮文本颜色。

您可以使用以下属性自定义按钮:

  • app:rippleColor:用于按钮效果效果的颜色
  • app:backgroundTint:用于将色调应用于按钮的背景。如果您想更改按钮的背景颜色,请使用此属性而不是背景。

  • app:strokeColor:用于按钮笔触的颜色

  • app:strokeWidth:用于按钮描边的宽度
  • app:cornerRadius:用于定义用于按钮角落的半径

答案 6 :(得分:11)

android.support.design.button.MaterialButton(Gabriele Mariotti提到的 )旁边,

还有一个名为com.google.android.material.button.MaterialButtonButton小部件,其样式不同,并且从AppCompatButton扩展而来:

style="@style/Widget.MaterialComponents.Button"
style="@style/Widget.MaterialComponents.Button.UnelevatedButton"
style="@style/Widget.MaterialComponents.Button.TextButton"
style="@style/Widget.MaterialComponents.Button.Icon"
style="@style/Widget.MaterialComponents.Button.TextButton.Icon"

填充的,提升的Button(默认)enter image description here

style="@style/Widget.MaterialComponents.Button"

未填充的Button enter image description here

style="@style/Widget.MaterialComponents.Button.UnelevatedButton"

文本Button enter image description here

style="@style/Widget.MaterialComponents.Button.TextButton"

图标Button enter image description here

style="@style/Widget.MaterialComponents.Button.Icon"
app:icon="@drawable/icon_24px" // Icons can be added from this

带有图标的文本Buttonenter image description here


阅读: https://material.io/develop/android/components/material-button/

  

用于创建新的“材质”按钮的便捷类。

     

此类为按钮中的按钮提供了更新的Material样式。   构造函数。小部件将显示正确的默认材质   样式而不使用样式标志。

答案 7 :(得分:6)

我尝试了很多答案&amp;第三方库,但没有一个保持边界和提高对棒棒糖前的影响,同时对棒棒糖产生连锁反应没有缺点。这是我的最终解决方案,结合了几个答案(由于灰度颜色深度,边框/凸起在gif上没有很好地渲染):

<强>棒棒糖

enter image description here

<强>预棒棒糖

enter image description here

<强>的build.gradle

compile 'com.android.support:cardview-v7:23.1.1'

<强> layout.xml

<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card"
    card_view:cardElevation="2dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    card_view:cardMaxElevation="8dp"
    android:layout_margin="6dp"
    >
    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="0dp"
        android:background="@drawable/btn_bg"
        android:text="My button"/>
</android.support.v7.widget.CardView>

<强>绘制-V21 / btn_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="?attr/colorControlHighlight">
    <item android:drawable="?attr/colorPrimary"/>
</ripple>

<强>抽拉/ btn_bg.xml

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

活动创建

    final CardView cardView = (CardView) findViewById(R.id.card);
    final Button button = (Button) findViewById(R.id.button);
    button.setOnTouchListener(new View.OnTouchListener() {
        ObjectAnimator o1 = ObjectAnimator.ofFloat(cardView, "cardElevation", 2, 8)
                .setDuration
                        (80);
        ObjectAnimator o2 = ObjectAnimator.ofFloat(cardView, "cardElevation", 8, 2)
                .setDuration
                        (80);

        @Override
        public boolean onTouch(View v, MotionEvent event) {

            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    o1.start();
                    break;
                case MotionEvent.ACTION_CANCEL:
                case MotionEvent.ACTION_UP:
                    o2.start();
                    break;
            }
            return false;
        }
    });

答案 8 :(得分:3)

1)您可以通过定义xml drawable来创建圆角按钮,您可以增加或减少半径以增加或减少按钮角的圆度。 将此xml drawable设置为按钮的背景。

<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:insetLeft="4dp"
    android:insetTop="6dp"
    android:insetRight="4dp"
    android:insetBottom="6dp">
    <ripple android:color="?attr/colorControlHighlight">
        <item>
            <shape android:shape="rectangle"
                android:tint="#0091ea">
                <corners android:radius="10dp" />
                <solid android:color="#1a237e" />
                <padding android:bottom="6dp" />
            </shape>
        </item>
    </ripple>
</inset>

rounded corner button

2)要在按钮状态之间更改默认阴影和阴影过渡动画,您需要定义选择器并使用android:stateListAnimator属性将其应用于按钮。有关完整按钮自定义参考:http://www.zoftino.com/android-button

答案 9 :(得分:1)

我刚刚创建了一个安卓库,可让您轻松修改按钮颜色和波纹颜色

https://github.com/xgc1986/RippleButton

<com.xgc1986.ripplebutton.widget.RippleButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/btn"
    android:text="Android button modified in layout"
    android:textColor="@android:color/white"
    app:buttonColor="@android:color/black"
    app:rippleColor="@android:color/white"/>

您不需要为每个想要不同颜色的按钮创建样式,允许您随机自定义颜色

答案 10 :(得分:0)

您可以通过向视图添加z轴为视图提供航空,并且可以为其提供默认阴影。此功能在L预览中提供,将在发布后提供。现在你可以简单地添加一个图像,给出这个按钮背景的外观

答案 11 :(得分:0)

// here is the custom button style
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <shape>
        <gradient
            android:angle="45"
            android:centerColor="@color/colorPrimary"
            android:startColor="@color/colorPrimaryDark"
            android:endColor="@color/colorAccent"
            >
        </gradient>
        <corners
            android:topLeftRadius="10dp"
            android:topRightRadius="10dp"
            android:bottomLeftRadius="10dp"
            android:bottomRightRadius="10dp"
            >
        </corners>
        <stroke
            android:width="2dp"
            android:color="@color/colorWhite"
            >
          </stroke>
      </shape>
       </item>

</selector>