自定义圆形按钮

问题描述 投票:0回答:12

我想创建自定义按钮,并且需要它是圆形的。如何创建圆形按钮? 我认为使用draw9patch不可能做到这一点。

我也不知道如何制作自定义按钮!

你有什么建议吗?

android android-button
12个回答
380
投票

像这样使用xml可绘制:

将以下内容另存为

round_button.xml
文件夹中
drawable

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="false">
        <shape android:shape="oval">
            <solid android:color="#fa09ad"/>
        </shape>
    </item>
    <item android:state_pressed="true">
        <shape android:shape="oval">
            <solid android:color="#c20586"/>
        </shape>
    </item>
</selector>

Android Material Effect: 虽然

FloatingActionButton
是一个更好的选择,但如果您想使用 xml 选择器来执行此操作,请在
drawable-v21
中创建一个文件夹
res
并在其中保存另一个
round_button.xml
并使用以下 xml

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="#c20586">
    <item>
        <shape android:shape="oval">
            <solid android:color="#fa09ad"/>
        </shape>
    </item>
</ripple>

并在 xml 中将其设置为

Button
的背景,如下所示:

<Button
android:layout_width="50dp"
android:layout_height="50dp"
android:background="@drawable/round_button"
android:gravity="center_vertical|center_horizontal"
android:text="hello"
android:textColor="#fff" />

重要:

  1. 如果您希望它显示所有这些状态(启用、禁用、突出显示等),您将使用选择器,如此处所述
  2. 您必须保留这两个文件才能使可绘制对象向后兼容。否则,你会在以前的 Android 版本中遇到奇怪的异常。

69
投票

Markushi 编写了一个具有惊人效果的圆形按钮小部件。点击这里

enter image description here


35
投票

通过官方 Material Components 库,您可以使用

MaterialButton
应用
Widget.MaterialComponents.Button.Icon
样式。

类似:

   <com.google.android.material.button.MaterialButton
            android:layout_width="48dp"
            android:layout_height="48dp"
            style="@style/Widget.MaterialComponents.Button.Icon"
            app:icon="@drawable/ic_add"
            app:iconSize="24dp"
            app:iconPadding="0dp"
            android:insetLeft="0dp"
            android:insetTop="0dp"
            android:insetRight="0dp"
            android:insetBottom="0dp"
            app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.MyApp.Button.Rounded"
            />

目前需要

app:iconPadding="0dp"
android:insetLeft
android:insetTop
android:insetRight
android:insetBottom
属性使图标在按钮上居中,避免额外的填充空间。

使用

app:shapeAppearanceOverlay
属性获得圆角。在这种情况下,您将得到一个圆圈。

  <style name="ShapeAppearanceOverlay.MyApp.Button.Rounded" parent="">
    <item name="cornerFamily">rounded</item>
    <item name="cornerSize">50%</item>
  </style>

最终结果:

enter image description here


使用 jetpack compose,您可以使用:

    Button(
        onClick = { /* Do something! */ },
        modifier = Modifier.width(48.dp).height(48.dp),
        shape = CircleShape
    ) {
        Icon(Icons.Filled.Add, "")
    }

enter image description here


23
投票

AngryTool 用于自定义 Android 按钮

您可以使用此工具网站制作任何类型的自定义 Android 按钮... 我用这个工具网站制作带有圆角的圆形和方形按钮。 访问它也许我会帮助你


8
投票

对于 FAB 外观的按钮,此样式位于

MaterialButton

<com.google.android.material.button.MaterialButton
    style="@style/Widget.MaterialComponents.ExtendedFloatingActionButton"
    app:cornerRadius="28dp"
    android:layout_width="56dp"
    android:layout_height="56dp"
    android:text="1" />

结果:

enter image description here

如果更改尺寸,请小心使用按钮尺寸的一半,如

app:cornerRadius


7
投票

您可以使用AndroidX材质库中的MaterialButton

<com.google.android.material.button.MaterialButton
     android:layout_width="75dp"
     android:layout_height="75dp"
     android:layout_margin="10dp"
     android:insetLeft="0dp"
     android:insetTop="0dp"
     android:insetRight="0dp"
     android:insetBottom="0dp"
     app:cornerRadius="50dp"
     app:icon="@drawable/ic_camera"
     app:iconGravity="textStart"
     app:iconPadding="0dp"
     app:iconSize="35dp" />

就会是这样的

Button preview


2
投票

如果你想使用 VectorDrawable 和 ConstraintLayout

<FrameLayout
            android:id="@+id/ok_button"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:foreground="?attr/selectableItemBackgroundBorderless"
            android:background="@drawable/circle_button">
                <android.support.constraint.ConstraintLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">
                    <ImageView
                        android:id="@+id/icon_of_button"
                        android:layout_width="32dp"
                        android:layout_height="32dp"
                        app:layout_constraintBottom_toBottomOf="parent"
                        app:layout_constraintTop_toTopOf="parent"
                        app:layout_constraintRight_toRightOf="parent"
                        app:layout_constraintLeft_toLeftOf="parent"
                        app:srcCompat="@drawable/ic_thumbs_up"/>
                    <TextView
                        android:id="@+id/text_of_button"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        app:layout_constraintTop_toBottomOf="@+id/icon_of_button"
                        app:layout_constraintRight_toRightOf="parent"
                        app:layout_constraintLeft_toLeftOf="parent"
                        android:layout_marginTop="5dp"
                        android:textColor="@android:color/white"
                        android:text="ok"
                        />
                </android.support.constraint.ConstraintLayout>
            </FrameLayout>

圆形背景:circle_button.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="1000dp" />
<solid android:color="#41ba7a" />
<stroke
    android:width="2dip"
    android:color="#03ae3c" />
<padding
    android:bottom="4dp"
    android:left="4dp"
    android:right="4dp"
    android:top="4dp" />
</shape>

2
投票

不幸的是,使用 XML 可绘制对象并覆盖背景意味着您必须显式设置颜色,而不能使用应用程序样式颜色。

我没有为每个行为硬编码按钮颜色,而是选择硬编码圆角半径,这感觉稍微不那么老套,并保留所有默认按钮行为(按下时改变颜色和其他视觉效果)并默认使用应用程序样式颜色:

  1. android:layout_height
    android:layout_width
    设置为相同的值

  2. app:cornerRadius
    设置为高度/宽度的一半

    (实际上,任何大于或等于高度/宽度一半的东西都有效,因此为了避免每次更新高度/宽度时都必须更改半径,您可以将其设置为非常高的值,例如

     1000dp
    ,如果这种行为发生变化,它可能会崩溃。)

  3. android:insetBottom
    android:insetTop
    设置为
    0dp
    以获得完美的圆

例如:

<Button
    android:insetBottom="0dp"
    android:insetTop="0dp"
    android:layout_height="150dp"
    android:layout_width="150dp"
    app:cornerRadius="75dp"
    />

1
投票

这里是简单的执行方法,在drawable.xml中创建一个drawable资源文件。说出 round_button.xml,然后粘贴以下代码。

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

    <item>
       <shape
           android:shape="oval">

           <solid
               android:color="@color/button_start_gradient_color"/>
       </shape>
    </item>
    <item
        android:drawable="@drawable/microphone"/>
</layer-list>

注意:- 使用您自己的颜色和可绘制资源,因为我已经使用了@drawable/micphone

结果如下 [1]:https://i.sstatic.net/QyhdJ.png


1
投票

如果您想使用 ImageButton,请使用以下命令。它将创建带有材质波纹的圆形 ImageButton。

<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_settings_6"
android:background="?selectableItemBackgroundBorderless"
android:padding="10dp"
/>

0
投票

在drawable文件夹中创建一个新的矢量资源。

您也可以导入 PNG 图像,并在线将文件转换为 SVG,网址为 https://image.online-convert.com/convert-to-svg。分辨率越高,转换效果越好。

接下来,从该 SVG 文件创建一个新的矢量资源。

这是您可以使用的示例矢量圆形图像。将代码复制到drawables文件夹中的xml文件中。

ic_check.xml:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportHeight="256"
    android:viewportWidth="256">
    <path
        android:fillColor="#2962FF"
        android:pathData="M111,1.7c-7.2,1.1 -22.2,4.8 -27.9,7 -33.2,12.5 -61.3,40.3 -74.1,73.3 -8.7,22.6 -10.5,55.3 -4.4,78 10.9,40 39.7,72.4 77.4,87 22.6,8.7 55.3,10.5 78,4.4 45.3,-12.3 79.1,-46.1 91.4,-91.4 2.9,-10.7 3.9,-21.9 3.3,-37.4 -0.7,-21.2 -4.6,-35.9 -14,-54.1 -18.2,-35 -54,-60.5 -93.4,-66.4 -6.7,-1 -30.7,-1.3 -36.3,-0.4zM145,23.1c21.8,3.3 46.5,16.5 61.1,32.8 20.4,22.6 30.1,51.2 27.7,81.1 -3.5,44.4 -35.9,82.7 -79.6,94 -21.6,5.6 -46.6,3.7 -67.8,-5.1 -10.4,-4.3 -24.7,-14.1 -33.4,-22.9 -41.6,-41.5 -41.6,-108.4 0,-150 24.3,-24.3 57.6,-35.1 92,-29.9z"
        android:strokeColor="#00000000" />
    <path
        android:fillColor="#2962FF"
        android:pathData="M148.4,113c-24.6,26 -43.3,44.9 -44,44.6 -0.7,-0.3 -8.5,-6.1 -17.3,-13 -8.9,-6.9 -16.5,-12.6 -17,-12.6 -1.4,-0 -25.6,19 -25.8,20.3 -0.3,1.4 62.7,50.2 64.8,50.2 1.7,-0 108.4,-112.3 108.4,-114.1 0,-1.3 -23.8,-20.4 -25.4,-20.4 -0.6,-0 -20.2,20.3 -43.7,45z"
        android:strokeColor="#00000000" />
</vector>

在您的按钮中使用此图像:

<ImageButton
    android:id="@+id/btn_level1"
    android:layout_width="36dp"
    android:layout_height="36dp"
    android:background="@drawable/ic_check"
/>

您的按钮将是一个圆形按钮。

enter image description here


0
投票
    <Button
                android:id="@+id/button"
                android:layout_width="60dp"
                android:layout_height="60dp"
                android:layout_alignParentEnd="true"
                android:layout_alignParentBottom="true"
                android:layout_marginEnd="16dp"
                android:layout_marginBottom="16dp"
                android:background="@drawable/round_button_background"
                android:contentDescription="round_button_description"
                android:drawableTop="@android:drawable/ic_dialog_dialer"
                android:drawableTint="@android:color/white"
                android:gravity="center"
                android:padding="12dp"/>
    
    
    and open res folder and put this round_button_background.xml inside the drwabale -
    
    
    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="oval">
        <solid android:color="@color/colorPrimary" />
        <size
            android:width="60dp"
            android:height="60dp" />
    </shape>


and this is colors put this inside the colors.xml - 

  <color name="colorPrimary">#03A9F3</color>
<color name="white">#ffffffff</color>
© www.soinside.com 2019 - 2024. All rights reserved.