按钮 drawableStart 在背景之外绘制 border/corners

Button drawableStart draws outside of background border/corners

我想制作一个带有 drawableStart(无填充)的圆形按钮。

我将这个添加到按钮背景中:

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

    <solid android:color="#CC232323"/>

    <corners android:radius="50sp"/>

</shape>

按钮是:

<Button
       android:id="@+id/btn_play"
       android:layout_width="match_parent"
       android:layout_height="50sp"
       android:layout_marginStart="25sp"
       android:layout_marginEnd="25sp"
       android:layout_weight="1"
       android:background="@drawable/btn_bg"
       android:drawableStart="@drawable/icon_layer_list"
       android:text="@string/sample_text"
       android:textAlignment="textStart"
       android:textAllCaps="false"
       android:textColor="@color/colorWhite" />

图层列表是:

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

    <item
        android:drawable="@drawable/background_design"
        android:height="50sp"
        android:width="50sp"
    />

</layer-list>

角确实在按钮上起作用,但 drawableStart 不受它们的影响,所以我得到一个按钮,一侧是圆形边框,另一侧是 drawableStart 的方形边框。

视图(或您的情况下的按钮)始终为矩形。当您应用带圆角的背景时,它只是背景图像变圆,而不是视图本身。如果你需要在drawableStart中有圆角,你需要在你为drawableStart设置的drawable中有圆角。

我找到了一个简单易行的解决方案,它的想法是用 CardView 包裹按钮并将其 cardCornersRadius 设置为所需的半径。

像这样:

<androidx.cardview.widget.CardView
      android:layout_width="150dp"
      android:layout_height="150dp"
      app:cardCornerRadius="250dp"
      android:layout_gravity="center">

        <Button
          android:id="@+id/btn_play"
          android:layout_width="match_parent"
          android:layout_height="50sp"
          android:layout_marginStart="25sp"
          android:layout_marginEnd="25sp"
          android:layout_weight="1"
          android:background="@drawable/btn_bg"
          android:drawableStart="@drawable/icon_layer_list"
          android:text="@string/sample_text"
          android:textAlignment="textStart"
          android:textAllCaps="false"
          android:textColor="@color/colorWhite"/>

   </androidx.cardview.widget.CardView>

毫无疑问,这是我找到的最简单的方法,可以让视图在边框内运行,CardView 不会让按钮或其中的任何东西绘制到边框之外/角落.

有关 CardView 的更多信息(它的属性、依赖性等...),请转到 This link。