在 v21 中设置 AppCompatButton 的样式,使其没有阴影且圆角半径为零

Posted

技术标签:

【中文标题】在 v21 中设置 AppCompatButton 的样式,使其没有阴影且圆角半径为零【英文标题】:Styling a AppCompatButton in v21 to have no shadow and corner radius of zero 【发布时间】:2016-04-19 13:54:28 【问题描述】:

我在 XML 布局中定义了一个 AppCompatButton,并为它设置了一个主题,如下所示:

android:theme="@style/CustomAccentOverlay"

我已经设置:

android:stateListAnimator="@null"

去除阴影。我有两个问题。

按钮的高度减去阴影的高度,即使没有显示阴影。我应该以其他方式移除阴影,还是如何解决这个问题?

按钮有圆角,我希望角是尖的。我不能在按钮上设置背景,因为我想保持标准的涟漪效果,如果我设置背景,它就会消失(至少我不知道如果我设置背景如何保持它)。我试过设置

<item name="android:bottomLeftRadius">0dp</item>

以及 CustomAccentOverlay 主题的所有其他角落及其相应的样式,但它不起作用。如何在我的按钮上将角半径设置为零?

谢谢 索伦

【问题讨论】:

你能贴一张你想显示的按钮的图片吗? 【参考方案1】:

对按钮使用以下代码。

<android.support.v7.widget.AppCompatButton
android:layout_
android:layout_
android:text="Button"
android:stateListAnimator="@null"
android:elevation="0dp"
android:background="@android:color/darker_gray"
android:foreground="?attr/selectableItemBackground"
/>

我将解释属性。

    android:elevation="0dp" 和 android:stateListAnimator="@null"。按钮没有阴影。

    机器人:背景。将所需的颜色设置为背景。它会去除圆角。

    android:foreground="?attr/selectableItemBackground" 。按下按钮时会产生涟漪效果。

更新 1:

View 的 android:foreground 属性似乎从 API 23 开始工作。对于以下 API,请在 drawable-v21 文件夹中创建一个带有波纹的可绘制对象,并将其设置为按钮的背景,

<ripple
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:ignore="NewApi"
    android:color="@color/ripple_color">

    <item android:drawable="@color/normal_state_button_background_color"/>

</ripple>

对于 Lollipop 之前的版本,在 drawable 文件夹中创建一个带有选择器的 drawable 并具有相同的名称。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/pressed_color"
          android:state_pressed="true" />
    <item android:drawable="@drawable/focused_color"
          android:state_focused="true" />
    <item android:drawable="@drawable/normal_color" />
</selector>

【讨论】:

你能在棉花糖设备上试试吗? 非常感谢@DineshBob,太棒了!【参考方案2】:

第一个问题:如何去除按钮的阴影?

答案如下: 只需将此属性添加到您的按钮

android:stateListAnimator="@null"

第二个问题:如何让按钮的角尖而不失标准的波纹效果。 这是答案:但首先你必须制作两个同名的drawble文件,但一个用于api 21以下,一个用于api> 21,因为波纹仅适用于api> 21。所以现在我正在展示如何创建它。仔细阅读以下文字

右键单击drawble文件夹并选择新建和“Drawble资源文件”并点击下一步然后将drawble命名为您喜欢的任何名称并按ok。然后再次右键单击drawble文件夹并选择新建和“Drawble资源文件”和点击下一步并将drawble命名为您之前命名的drawble文件夹,但这次在底部您可以看到一个名为“可用限定符”的部分。转到此部分,在最底部您可以看到“版本”,单击它并然后你可以在右边看到一个箭头图标,点击它然后在“Platform api level”中添加21,然后按ok。现在如果你展开drawble文件夹,你可以看到你创建的drawble文件的两个文件。一次用于api低于 21 次,上一次为 21 次。打开您创建的 drawble 文件,并确保您打开最后有“(v21)”的文件。现在从那里删除所有内容并添加以下代码

<?xml version="1.0" encoding="utf-8"?>
<ripple android:color="?attr/colorControlHighlight" xmlns:android="http://schemas.android.com/apk/res/android">

<item>
    <shape>
        <corners android:radius="0dp"/>
        <solid android:color="#D6D7D7"/>
    </shape>
</item>

</ripple>

并将此属性添加到您的按钮

android:background="@drawable/youdrawblefilethatyouhavecreated"

现在,如果您运行您的应用程序,您会看到没有阴影,并且您的按钮有尖角,如果您单击,波纹就会出现。

最后,你的按钮看起来像这样

<android.support.v7.widget.AppCompatButton
    android:layout_
    android:layout_
    android:text="New Button 1"
    android:background="@drawable/yourcreatddrawblefile"
    android:stateListAnimator="@null"/>

希望对您有所帮助!

【讨论】:

【参考方案3】:

听起来您确实想使用可点击的 TextView 而不是 Button。 TextView 默认没有阴影并且有尖角,你可以给它附加一个点击监听器。请记住,Button 只是一个带有许多视觉插件的精美 TextView,听起来您想删除很多。

如果你想保持TextView上的波纹并定义你自己的背景,设置android:foreground="?attr/selectableItemBackground"

编辑:即使另一个答案被标记为已接受,我仍然认为 OP 应该使用带有点击侦听器的 TextView 并将涟漪效果应用于此而不是使用 Button。以这种方式可点击的 TextView 正是 Google I/O 应用程序实现其所有符合 Material Design 规范的平面按钮的方式。

【讨论】:

你是对的,使用棒棒糖前的后备(如您上面所说的方式)创建自定义波纹可绘制是我所做的。在这一点上,我仍然会推荐 TextView 而不是 Button,但是您处理波纹的方式是正确的。【参考方案4】:

使用此代码

 <android.support.v7.widget.AppCompatButton
    android:layout_
    android:layout_
    android:background="@color/colorAccent"
    android:text="@string/button" />

【讨论】:

以上是关于在 v21 中设置 AppCompatButton 的样式,使其没有阴影且圆角半径为零的主要内容,如果未能解决你的问题,请参考以下文章

AppCompatButton backgroundTint API < 21

自定义 AppCompatButton drawableLeft?

markdown AppCompatButton具有Ripple效果和Touch on Touch

IllegalStateException:在父或祖先上下文类 android.support.v7.widget.AppCompatButton 中找不到方法 insert(View)

状态栏颜色在 v21 中不会改变

在xib中设置accessibilityIdentifier nil时,必须从用户定义的运行时属性中设置