距离上次写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并不能完美的去掉他哎。