在 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)