【问题标题】:Gradient color using MaterialButton and shapeAppearance使用 MaterialButton 和 shapeAppearance 渐变颜色
【发布时间】:2020-11-20 11:53:22
【问题描述】:

我想制作一个像这样的Button

我尝试使用 styleshapeAppearance

<style name="ShapeAppearance.Button" parent="ShapeAppearance.MaterialComponents">
    <item name="cornerFamily">rounded</item>
    <item name="cornerSizeTopLeft">@dimen/button_corner_radius</item>
    <item name="cornerSizeTopRight">5dp</item>
    <item name="cornerSizeBottomRight">@dimen/button_corner_radius</item>
    <item name="cornerSizeBottomLeft">5dp</item>
</style>

<dimen name="button_corner_radius">40dp</dimen>

我像这样在我的 MaterialButton 中应用样式:

app:shapeAppearance="@style/ShapeAppearance.Button" 

结果是:

现在,我尝试放置一个线性渐变:

  • #DF2D48 @ 0.0
  • #D72D46 @ 0.2
  • #AF223B @ 0.5
  • #AC2139 @ 1.0

例如:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient
        android:startColor="#DF2D48"
        android:centerColor="#D72D46"
        android:endColor="#AC2139"
        android:angle="360" />
</shape>

我在我的 Shape 样式中应用它:

<item name="android:background">@drawable/test</item>

但结果是一样的。为什么?

【问题讨论】:

    标签: android android-button android-styles material-components-android material-components


    【解决方案1】:

    使用材质按钮的渐变色:

    材质按钮: 要使用具有 MaterialButton 背景色调属性的自定义可绘制背景,请参考代码: app:backgroundTint="@null"

     <com.google.android.material.button.MaterialButton
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:clickable="true"
                    android:focusable="true"
                    android:text="@string/button_enabled"
    
                    app:backgroundTint="@null"
                    android:background="@drawable/gradient_1"
                   />
    

    带形状的渐变: res/drawable/gradient_1.xml

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
        <gradient
            android:angle="0"
            android:endColor="#DD8E54E9"
            android:startColor="#CC225AE0" />
            <corners android:topLeftRadius="18dp"
                android:bottomRightRadius="18dp"
                android:topRightRadius="5dp"
                android:bottomLeftRadius="5dp"
                />
            <stroke
                android:width="6dp"
                android:color="#007879E8" />
    </shape>
    

    【讨论】:

    • &lt;com.google.android.material.button.MaterialButton 测试过,它变成了 dark 但这成功了:&lt;androidx.appcompat.widget.AppCompatButton
    • 对我来说,它适用于以下版本:我正在使用:材料:1.3.0-alpha02 主题:
    【解决方案2】:

    关于MaterialButton

    • 它使用 MaterialShapeDrawable 来应用 shapeAppearance(形状和笔划)。
      目前 (1.3.0) MaterialShapeDrawable 不支持渐变背景。

    • 它只支持从1.2.0-alpha06 开始的android:background 属性。但是使用 android:background MaterialButton 删除默认的 MaterialShapeDrawable 背景和 shapeAppearance应用。

    • 如果您使用的是 MaterialComponents 主题&lt;Button /&gt;&lt;com.google.android.material.button.MaterialButton /&gt; 之间没有区别,因为 MaterialComponentsViewInflaterButton 替换为MaterialButton 在运行时。

    您有 2 个解决方案:

    • 使用带有自定义圆角和渐变颜色的自定义形状并将其应用为android:backgroundMaterialButton

    • 使用自定义形状并将其应用于AppCompatButton

    MaterialButton

        <com.google.android.material.button.MaterialButton
            app:backgroundTint="@null"
            android:background="@drawable/gradient_shape"
            />
    

    确保取消 backgroundTintapp:backgroundTint="@null"app:backgroundTint="@empty"),以避免自定义背景不着色。
    注意:至少需要版本1.2.0-alpha06

    AppCompatButton

      <androidx.appcompat.widget.AppCompatButton
          android:background="@drawable/gradient_shape"/>
    

    形状像:

    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
        <gradient
            android:angle="0"
            android:endColor="...."
            android:startColor="...." />
    
        <corners android:topLeftRadius="40dp"
            android:bottomRightRadius="40dp"
            android:topRightRadius="5dp"
            android:bottomLeftRadius="5dp"
            />
    
    </shape>
    

    【讨论】:

      【解决方案3】:

      问题是因为我尝试为 MaterialButton 设置背景,但这是不可能的。

      最后,我使用了具有这种背景的经典按钮:

      <shape xmlns:tools="http://schemas.android.com/tools"
          xmlns:android="http://schemas.android.com/apk/res/android"
          tools:ignore="ExtraText"
          android:shape="rectangle">
      
          <gradient
              android:startColor="#D72D46"
              android:centerColor="#AF223B"
              android:endColor="#AC2139"
              android:angle="360" />
      
          <corners
              android:bottomRightRadius="40dp"
              android:bottomLeftRadius="5dp"
              android:topLeftRadius="40dp"
              android:topRightRadius="5dp" />
      
      </shape>
      

      【讨论】:

      • 要在MaterialButton 中使用android:background 属性,您至少需要发布1.2.0-alpha06
      • 我试过了,但是这个解决方案忽略了“app:shapeAppearance”
      • 是的,这是一个预期的结果。使用android:background MaterialButton 不使用MaterialShapeDrawableshapeAppearance。另请注意,Button 会自动膨胀为MaterialButton
      猜你喜欢
      • 2021-05-16
      • 2012-07-10
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 2011-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多