距离上次写Material组件的文章已经过去了好多年😄,最近在写Flutter又接触到了Material,已经升级了许多,这次就用新的组件来试试吧~
Button组件大家都非常熟悉了,如果画一个带圆角,边框的按钮,通常我们是画一个ShapeDrawable并把它设置到Button的android:background
属性中就可以了,写写shape xml
文件有时还是烦的,这里首先推荐一个三方库BackgroundLibrary可以很方便的通过属性设置的方式实现圆角,边框以及各种状态效果的Background,使用非常简单,有兴趣的同学直接参考文档即可。
MaterialButton继承AppCompatButton
,在原来Button的基础上做了一些扩展,如圆角、描边、前置和后置icon(icon支持设置Size、Tint、Padding、Gravity等),还支持按压水波纹并且设置color,新增属性如下。
属性 | 描述 |
---|---|
app:backgroundTint | 背景着色 |
app:backgroundTintMode | 着色模式 |
app:strokeColor | 描边颜色 |
app:strokeWidth | 描边宽度 |
app:cornerRadius | 圆角大小 |
app:rippleColor | 按压水波纹颜色 |
app:icon | 图标icon |
app:iconSize | 图标大小 |
app:iconGravity | 图标重心 |
app:iconTint | 图标着色 |
app:iconTintMode | 图标着色模式 |
app:iconPadding | 图标和文本之间的间距 |
app:backgroundTint
tint着色
的使用其实是一个非常巧妙的用法,尤其是在给图片给颜色上面,这样可以多个地方共用同一个图片资源,减少包的体积。
-
MaterialButton是不受android:background控制的,
官方建议我们设置app:backgroundHint
来进行背景的更改。1.2版本以前,MaterialButton只能通过app:backgroundTint属性设置背景色,该属性接收color state list。不能通过android:background设置自定义drawable。
1.2版本后,官方已修复此问题。如果未设置自定义背景,则 MaterialShapeDrawable 仍将用作默认背景。也就是说,如果按钮背景是纯色,可以通过app:backgroundTint指定;如果按钮背景是渐变色,则需要自己定义drawable,然后通过android:background设置。 -
MaterialButton设置background和backgroundTint是互斥的。
如果要使用android:background设置背景,则需要将backgroundTint设置为@empty,否则background不会生效。
如果你想要给MaterialButton设置圆角和描边则必须用app:backgroundTint
来设置背景色,用background设置将导致圆角和描边失效。 -
背景不能撑满存在间距问题:
AppCompatButton如果设置了android:background会覆盖上下左右的间距,MaterialButton则不会;
MaterialButton设置了app:backgroundHint左右是没有间距的,而上下默认有6dp边距,这是MD的设计规范,可以通过insetxxx来进行修改。AppCompatButton设置了app:backgroundHint是上下左右都有间距留了4个dp的占位。
如果想要取消背景间距设置insetTop和insetBottom为0dp
-
android:text为数字或者字母被加粗问题
这个问题其实并不是MaterialButton,安卓原生的Button也会有这样的问题,解决方案:设置 android:textAppearance=?android:attr/textAppearanceLarge
-
去掉阴影
MD组件默认都是自带阴影的,MaterialButton也不例外。但是有时候我们并不想要按钮有阴影,那么这时候可以指定style为
style="@style/Widget.MaterialComponents.Button.UnelevatedButton"
,这样就能去掉阴影,让视图看起来扁平化。
app:icon
在使用MaterialButton之前,要给Button按钮的文字旁边设置一个Icon,我们通常是设置android:drawableLeft等给上下左右设置图标,可是这个东西有个问题,一是图标大小,颜色不能随心所欲的设置,修改起来比较麻烦,二是图标和文字之间默认有个间距,这个间距的调整也比较麻烦,但是如果用MaterialButton这些问题通通都不是问题了,只需要跟使用属性一样进行设置就可以了,虽然默认文字和图标之间也有一定的间距,但是我们可以通过设置app:iconPadding为0dp来取消,但是如果是android:drawableLeft貌似设置android:drawablePadding并不能完美的去掉他哎。