material 按钮上的圆角
Rounded corners on material button
我正在按照 this 等问题中的提示创建按钮样式,就像 Material 设计中建议的那样。
但是,我需要更改圆角半径,但无法通过继承 Widget.AppCompat.Button.Colored
样式和设置半径参数来实现。
我怎样才能拥有相同的样式但有圆角?
更新:
下面 Gabriele Mariotti 的回答现在更好了。
旧答案:
你需要继承那种风格。
加入你的styles.xml:
<style name="AppTheme.RoundedCornerMaterialButton" parent="Widget.AppCompat.Button.Colored">
<item name="android:background">@drawable/rounded_shape</item>
</style>
添加文件drawable/rounded_shape.xml:
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<solid
android:color="@color/colorAccent" >
</solid>
<corners
android:radius="11dp" >
</corners>
</shape>
最后在您的布局中:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Test Text"
style="@style/AppTheme.RoundedCornerMaterialButton"/>
编辑:更新答案以使用主题颜色而不是硬编码。
另外一种简单的方法是将它包裹在cardView上,记得将cardView的layout_width和layout_height设置为wrap_content,按钮需要的所有边距也应该应用于 cardView
<android.support.v7.widget.CardView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:cardCornerRadius="8dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginBottom="40dp"
app:elevation="10dp">
<android.support.v7.widget.AppCompatButton
android:id="@+id/login_twitter"
android:tag="login_twitter"
android:layout_width="300dp"
android:layout_height="60dp"
android:paddingLeft="10dp"
android:foreground="?attr/selectableItemBackgroundBorderless"
android:textColor="@color/blue_grey_ligthen_5"
android:drawableLeft="@drawable/twitter"
android:background="@color/twitter"
android:text="@string/login_with_twitter" />
</android.support.v7.widget.CardView>
我会告诉你我的确切解决方案。在选择器标签内,您可以放置项目(按钮的功能)
选择器标签的第二项具有相反的行为。您可以添加尽可能多的选择器(按钮行为)
添加这个可绘制的 XML 作为按钮的背景 android:background="@drawable/this xml"
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#ffffff"> <!-- this is the ripple color(first touch color changes into this color) -->
<item>
<selector>
<item android:state_enabled="true">
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- default button color -->
<solid android:color="@color/colorPrimary"></solid>
<corners android:radius="151dp"></corners>
</shape>
</item>
<item> //first item was state enabled so this is automatically state disabled
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- button disabled color opposite behaviour -->
<solid android:color="#e9d204"></solid>
<corners android:radius="151dp"></corners>
</shape>
</item>
</selector>
</item>
<item>
<selector>
<item android:state_pressed="true">
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- button first touch of your finger color -->
<solid android:color="#1989fa"></solid>
<corners android:radius="151dp"></corners>
</shape>
</item>
</selector>
</item>
<item>
<selector>
<item android:state_hovered="true">
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- hovered with a note pencil -->
<solid android:color="#4affffff"></solid>
<corners android:radius="151dp"></corners>
</shape>
</item>
</selector>
</item>
</ripple>
与Material Components Library:.
将 the dependency 添加到您的 build.gradle
:
dependencies { implementation ‘com.google.android.material:material:1.3.0’ }
在这种情况下,您可以在布局文件中使用 MaterialButton
:
<com.google.android.material.button.MaterialButton
....
style="@style/Widget.MaterialComponents.Button"
app:cornerRadius=".."
app:strokeColor="@color/colorPrimary"/>
使用app:cornerRadius
属性改变圆角半径的大小。这将以指定的尺寸圆整角。
您还可以使用 shapeAppearanceOverlay
属性自定义边角。
<style name="MyButton" parent="Widget.MaterialComponents.Button.OutlinedButton">
<item name="shapeAppearanceOverlay">@style/MyShapeAppearance</item>
</style>
<style name="MyShapeAppearance">
<item name="cornerFamily">rounded</item>
<item name="cornerFamilyTopRight">cut</item>
<item name="cornerFamilyBottomRight">cut</item>
<item name="cornerSizeTopLeft">32dp</item>
<item name="cornerSizeBottomLeft">32dp</item>
</style>
官方文档是here and all the android specs here。
使用 Jetpack Compose 1.0.x
使用 shape
参数:
Button( onClick = { /* Do something! */ },
shape = RoundedCornerShape(8.dp)) {
Text("Button")
}
Button(modifier = Modifier.padding(16.dp),
onClick = { /* Do something! */ },
shape = RoundedCornerShape(
50, // topEndPercent
0, // topEndPercent
0, // bottomEndPercent
50. // bottomStartPercent
)
) {
Text("Button")
}
旧支持库:
有了新的 Support Library 28.0.0,设计库现在包含 Material Button
。
您可以将此按钮添加到我们的布局文件中:
<android.support.design.button.MaterialButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="XXXXX"
android:textSize="18sp"
android:backgroundTint="@color/colorPrimary"
app:icon="@drawable/ic_android_white_24dp" />
您可以使用此属性设置角半径:
app:cornerRadius
: 用于定义按钮角的半径
dependencies {
implementation 'com.android.support:design:28.0.0'
}
圆形 Material 波纹效果按钮
在 drawable 文件夹中创建一个文件 ripple.xml
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="?android:attr/colorControlHighlight">
<item android:id="@android:id/mask">
<shape android:shape="rectangle">
<solid android:color="@color/colorPrimary" />
<corners android:radius="20dp" />
</shape>
</item>
<item android:drawable="@drawable/rounded_shape" />
</ripple>
在 drawable 文件夹中创建文件 rounded_shape.xml
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<solid
android:color="@color/colorPrimary" >
</solid>
<corners
android:radius="20dp" >
</corners>
</shape>
在你的按钮上:
<Button
android:id="@+id/button1"
android:background="@drawable/ripple"
android:text="Login"/>
现在将 MaterialButton 用于圆形按钮,您可以用它做更多的事情。请关注link
并为圆角添加 app:cornerRadius="8dp"
并且不要忘记在 build.gradle
中添加 google material 库
implementation "com.google.android.material:material:1.1.0"
尝试下面的代码创建一个名为 circular_button.xml 的可绘制文件并插入下面的
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#008577" />
<corners android:bottomRightRadius="100dp"
android:bottomLeftRadius="100dp"
android:topRightRadius="100dp"
android:topLeftRadius="100dp"/>
</shape>
然后把按钮的背景改成这个drawable文件
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/circle_button"
android:text="Button"/>
如果你想要一个完整的圆形按钮,你可以使用下面的 drawable
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid
android:color="#008577"/>
<size
android:width="120dp"
android:height="120dp"/>
</shape>
如果您不想更改整个 app.You 的主题,可以专门为此视图使用 material 主题:
<com.google.android.material.button.MaterialButton
android:id="@+id/fooButon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:fontFamily="sans-serif"
android:padding="8dp"
==> android:theme="@style/Theme.MaterialComponents.Light"
app:backgroundTint="@color/base_white" />
我正在按照 this 等问题中的提示创建按钮样式,就像 Material 设计中建议的那样。
但是,我需要更改圆角半径,但无法通过继承 Widget.AppCompat.Button.Colored
样式和设置半径参数来实现。
我怎样才能拥有相同的样式但有圆角?
更新:
下面 Gabriele Mariotti 的回答现在更好了。
旧答案:
你需要继承那种风格。
加入你的styles.xml:
<style name="AppTheme.RoundedCornerMaterialButton" parent="Widget.AppCompat.Button.Colored">
<item name="android:background">@drawable/rounded_shape</item>
</style>
添加文件drawable/rounded_shape.xml:
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<solid
android:color="@color/colorAccent" >
</solid>
<corners
android:radius="11dp" >
</corners>
</shape>
最后在您的布局中:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Test Text"
style="@style/AppTheme.RoundedCornerMaterialButton"/>
编辑:更新答案以使用主题颜色而不是硬编码。
另外一种简单的方法是将它包裹在cardView上,记得将cardView的layout_width和layout_height设置为wrap_content,按钮需要的所有边距也应该应用于 cardView
<android.support.v7.widget.CardView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:cardCornerRadius="8dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginBottom="40dp"
app:elevation="10dp">
<android.support.v7.widget.AppCompatButton
android:id="@+id/login_twitter"
android:tag="login_twitter"
android:layout_width="300dp"
android:layout_height="60dp"
android:paddingLeft="10dp"
android:foreground="?attr/selectableItemBackgroundBorderless"
android:textColor="@color/blue_grey_ligthen_5"
android:drawableLeft="@drawable/twitter"
android:background="@color/twitter"
android:text="@string/login_with_twitter" />
</android.support.v7.widget.CardView>
我会告诉你我的确切解决方案。在选择器标签内,您可以放置项目(按钮的功能)
选择器标签的第二项具有相反的行为。您可以添加尽可能多的选择器(按钮行为) 添加这个可绘制的 XML 作为按钮的背景 android:background="@drawable/this xml"
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#ffffff"> <!-- this is the ripple color(first touch color changes into this color) -->
<item>
<selector>
<item android:state_enabled="true">
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- default button color -->
<solid android:color="@color/colorPrimary"></solid>
<corners android:radius="151dp"></corners>
</shape>
</item>
<item> //first item was state enabled so this is automatically state disabled
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- button disabled color opposite behaviour -->
<solid android:color="#e9d204"></solid>
<corners android:radius="151dp"></corners>
</shape>
</item>
</selector>
</item>
<item>
<selector>
<item android:state_pressed="true">
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- button first touch of your finger color -->
<solid android:color="#1989fa"></solid>
<corners android:radius="151dp"></corners>
</shape>
</item>
</selector>
</item>
<item>
<selector>
<item android:state_hovered="true">
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- hovered with a note pencil -->
<solid android:color="#4affffff"></solid>
<corners android:radius="151dp"></corners>
</shape>
</item>
</selector>
</item>
</ripple>
与Material Components Library:.
将 the dependency 添加到您的 build.gradle
:
dependencies { implementation ‘com.google.android.material:material:1.3.0’ }
在这种情况下,您可以在布局文件中使用 MaterialButton
:
<com.google.android.material.button.MaterialButton
....
style="@style/Widget.MaterialComponents.Button"
app:cornerRadius=".."
app:strokeColor="@color/colorPrimary"/>
使用app:cornerRadius
属性改变圆角半径的大小。这将以指定的尺寸圆整角。
您还可以使用 shapeAppearanceOverlay
属性自定义边角。
<style name="MyButton" parent="Widget.MaterialComponents.Button.OutlinedButton">
<item name="shapeAppearanceOverlay">@style/MyShapeAppearance</item>
</style>
<style name="MyShapeAppearance">
<item name="cornerFamily">rounded</item>
<item name="cornerFamilyTopRight">cut</item>
<item name="cornerFamilyBottomRight">cut</item>
<item name="cornerSizeTopLeft">32dp</item>
<item name="cornerSizeBottomLeft">32dp</item>
</style>
官方文档是here and all the android specs here。
使用 Jetpack Compose 1.0.x
使用 shape
参数:
Button( onClick = { /* Do something! */ },
shape = RoundedCornerShape(8.dp)) {
Text("Button")
}
Button(modifier = Modifier.padding(16.dp),
onClick = { /* Do something! */ },
shape = RoundedCornerShape(
50, // topEndPercent
0, // topEndPercent
0, // bottomEndPercent
50. // bottomStartPercent
)
) {
Text("Button")
}
旧支持库:
有了新的 Support Library 28.0.0,设计库现在包含 Material Button
。
您可以将此按钮添加到我们的布局文件中:
<android.support.design.button.MaterialButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="XXXXX"
android:textSize="18sp"
android:backgroundTint="@color/colorPrimary"
app:icon="@drawable/ic_android_white_24dp" />
您可以使用此属性设置角半径:
app:cornerRadius
: 用于定义按钮角的半径
dependencies {
implementation 'com.android.support:design:28.0.0'
}
圆形 Material 波纹效果按钮
在 drawable 文件夹中创建一个文件 ripple.xml
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="?android:attr/colorControlHighlight">
<item android:id="@android:id/mask">
<shape android:shape="rectangle">
<solid android:color="@color/colorPrimary" />
<corners android:radius="20dp" />
</shape>
</item>
<item android:drawable="@drawable/rounded_shape" />
</ripple>
在 drawable 文件夹中创建文件 rounded_shape.xml
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<solid
android:color="@color/colorPrimary" >
</solid>
<corners
android:radius="20dp" >
</corners>
</shape>
在你的按钮上:
<Button
android:id="@+id/button1"
android:background="@drawable/ripple"
android:text="Login"/>
现在将 MaterialButton 用于圆形按钮,您可以用它做更多的事情。请关注link
并为圆角添加 app:cornerRadius="8dp"
并且不要忘记在 build.gradle
中添加 google material 库implementation "com.google.android.material:material:1.1.0"
尝试下面的代码创建一个名为 circular_button.xml 的可绘制文件并插入下面的
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#008577" />
<corners android:bottomRightRadius="100dp"
android:bottomLeftRadius="100dp"
android:topRightRadius="100dp"
android:topLeftRadius="100dp"/>
</shape>
然后把按钮的背景改成这个drawable文件
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/circle_button"
android:text="Button"/>
如果你想要一个完整的圆形按钮,你可以使用下面的 drawable
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid
android:color="#008577"/>
<size
android:width="120dp"
android:height="120dp"/>
</shape>
如果您不想更改整个 app.You 的主题,可以专门为此视图使用 material 主题:
<com.google.android.material.button.MaterialButton
android:id="@+id/fooButon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:fontFamily="sans-serif"
android:padding="8dp"
==> android:theme="@style/Theme.MaterialComponents.Light"
app:backgroundTint="@color/base_white" />