如何从棒棒糖按钮中删除 border/shadow

How to remove border/shadow from lollipop buttons

api < 21 的按钮看起来不错。但是,+21 版本会创建下图所示的边框或阴影。如何在不更改孔主题但设置样式变量的情况下摆脱它?

这张彩色图片可能更清楚。按钮周围有某种边框。

我的按钮样式是这样定义的:

<style name="buttonTransparent" parent="Base.TextAppearance.AppCompat.Button">
        <item name="android:background">#00000000</item>
        <item name="android:textColor">@drawable/button_text_blue</item>
        <item name="android:textSize">18dp</item>
        <item name="android:textAllCaps">false</item>
        <item name="android:minHeight">45dp</item>
    </style>

<style name="buttonLargeWhite" parent="buttonTransparent">
        <item name="android:background">#FFF</item>
        <item name="android:layout_marginTop">10dp</item>
    </style>

我建议您通过将高程设置为空来完全移除阴影。由于您已经拥有 XML 样式(添加它以普遍使用它),或者您可以将此属性添加到您的 XML 视图定义

android:elevation="0dp"

Lollipop 有一个叫做 stateListAnimator 的讨厌的小功能,它处理按钮上的高度,这会导致阴影。

删除 stateListAnimator 以消除阴影。

您有多种选择:

Java:

button.setStateListAnimator(null);

科特林:

button.stateListAnimator = null

或在您的布局 xml 中:

<Button
...
android:stateListAnimator="@null" 
....
/> 

我使用的最好和最简单的方法是将样式属性设置为 Button

<Button
...
style="?android:attr/borderlessButtonStyle"
....
/> 

以后可能有人需要。

您可以利用一种没有边框的样式。

申请

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

到您的项目删除边框

我通过在 Resources\values\styles.xml 中设置 android:stateListAnimator="@null" 全局 修复了此问题 :

<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <style name="AppTheme" parent="AppTheme.Base">
    </style>
    <style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:buttonStyle">@style/NoShadowButton</item>
    </style>
    <style name="NoShadowButton" parent="android:style/Widget.Button">
        <item name="android:stateListAnimator">@null</item>
    </style>
</resources>

瞧,阴影永远消失了:)

在xml中我们可以使用

android:stateListAnimator="@null"

问题

  1. 从Androidv21开始,所有按钮默认添加边框。

    <!-- Bordered ink button -->
    <style name="Widget.Material.Button">
         <item name="background">@drawable/btn_default_material</item>
         <item name="textAppearance">?attr/textAppearanceButton</item>
         <item name="minHeight">48dip</item>
         <item name="minWidth">88dip</item>
         <item name="stateListAnimator">@anim/button_state_list_anim_material</item>
         <item name="focusable">true</item>
         <item name="clickable">true</item>
         <item name="gravity">center_vertical|center_horizontal</item>
    </style>
    
    • 属性“stateListAnimator”是导致问题的原因。

解决方案

  1. 在我们的应用程序主题中,设置按钮样式以删除默认边框(Android支持库本身为其提供样式)。

    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
         <!-- From Android-v21 - Border has been added by default, hence we are removing it. -->
         <item name="android:buttonStyle">@style/Widget.AppCompat.Button.Borderless</item>
    </style>
    

"shadow" 效果已添加到 Lollipop Appcompat 主题

在 res/values-v21/styles.xml 中添加以下行以删除默认阴影

主题级别:

<item name="android:buttonStyle">@style/Widget.AppCompat.Button.Borderless</item>

xml布局:

android:stateListAnimator="@null"

Java:

setStateListAnimator(null);

科特林:

stateListAnimator = null

android 中的按钮有 statelistAnimator 属性 所以通过声明它为 null 我们可以删除按钮的边框

android:stateListAnimator="@null"

如果您想在 Kotlin 中以编程方式执行此操作,您可以这样做

button.stateListAnimator = null