Android Material UI控件之MaterialButton

简介: Android Material UI控件之MaterialButton

效果图


20201013111905509.png

Android Material UI控件之MaterialButton



前言


作为Android的开发者,常用控件肯定少不了按钮控件,常规的按钮控件,只能满足基本需求,而日常开发中,都会有渐变按钮,圆形按钮,或者立体按钮,这些都需要自己的设置样式,就拿圆角按钮来说,可能你会这是一个shape文件,然后设置背景和圆角的大小,最后在按钮的background属性中设置好,就是一个圆角的按钮了。这样就显得有些麻烦了,因为要你时碰到一个花里胡哨的UI和搞事情的产品,你就完犊子了。你会创建很多这样的drawable文件,并且每一个你还要命名规范,改起来是很费劲的。而MaterialButton就很好的帮你解决这些问题。让你的UI开发变得轻松一些。是骡子是马,牵出来溜溜,下面进入正文:


正文


1. 添加依赖


在你的app下的build.gradle中的dependencies闭包中增加如下依赖,然后Sync同步一下,你就可以名正言顺的使用里面的组件了。


implementation 'com.google.android.material:material:1.2.0'


在用之前呢。我们最好来看看MaterialButton它里面的代码的大致情况。将项目工程切换到Project模式。然后展开最底部的External Libraries


20201012150929506.png


然后找到MaterialButton


2020101215110389.png


打开之后看下面这个图


20201012151215548.png


可以得出什么内容呢?首先它继承了AppCompatButton,同时实现了Checkable和Shapeable,从这里可以得出这个MaterialButton比AppCompatButton要强,其次具备选中的能力,也就是它抢了Checkbox的饭碗,同时具备背景可塑性,踢倒了Drawable的奶瓶。看上去很是嚣张,你记住一个原则任何一次的继承肯定是为了比之前更优秀强大才会产生。正所谓青出于蓝而胜于蓝,我可以一层一层来剥下去,MaterialButton继承AppCompatButton,AppCompatButton继承Button,Button继承TextView,TextView继承View,View就是所有视图的底层了。在Android中,你写自定义View,只有三个类型,那就是继承View、继承ViewGroup、继承已有控件(如:TextView、Button、RecyclerView)。我好像扯远了,MaterialButton的源码也就1000多行,感兴趣的可以去了解每一个用法,或者再去继承改造一次。


2. 基本使用


为了方便演示,我先建一个Empty Activity


20201012152542367.png


① 准备工作


在activity_main.xml中增加一个按钮,同时增加id


20201012153104426.png


进入MainActivity。


20201012153557449.png



因为现在不是一个控件的点击了,所以要根据id来区分不同的控件的点击,同时我也不想写多余的跳转代码。好了,下面进入MaterialButtonActivity,这才是今天的主角啊。


② 解决样式问题


在material_button.xml中增加一个按钮,如下图所示

20201012164420342.png


然后你直接运行,不管你是在模拟器还是真机上,都会崩溃。(PS : 这不是坑爹吗?玩到这一步你可能脏话已经在嘴边了。)但是我会让你咽下去的。冷静下来想一下,你会发现你的崩溃是在进入这个Activity的时候发生的。也就是说完全是这个MaterialButton的锅,而且你的xml也只是设置为宽高和文字而已,没理由会崩溃啊。到这个时候你会先怀疑自己、然后怀疑Google、最后怀疑人生,什么垃圾控件,玩个锤子啊,问题发生了当然是要解决的,一般这种崩溃都会有日志的。


20201012165315109.png


从上面的日志来看报错的原因在xml的第10行


20201012165405944.png


但是这不是具体的原因,我们再往下滑动寻找错误的根源。


20201012165601506.png


皇天不负苦心人,报错很明显就是这里了,你可能不是很理解这句话的意思。张麻子:师爷,翻译翻译(出自:《让子弹飞》)


2020101216572991.png


哦豁,原来是样式的问题,那就不是什么大问题了。那么怎么解决呢?方案有三:第一个是整个项目使用Material样式,第二个是当前Activity使用Material样式,第三个是这个控件使用Material样式。下面来实践一下,打开styles.xml。增加如下代码:


  <!--Material样式-->
    <style name="MaterialStyle" parent="Theme.MaterialComponents.Light.DarkActionBar"/>


然后打开AndroidManifest.xml


20201012171004240.png


我选择了第二种方式,使样式的作用域只对这个Activity生效,那么现在你再重新运行,我跟你说,不阔能报错。就是这么滴的自信。运行后的效果图如下:

20201012171351286.png

3. 基操勿六


① 圆角按钮


其实这个按钮的属性就那么多一搜一大把,光看是没有用的,重在实践,用的多了,就刻在你的脑子里面了,甩都甩不掉。下面来看圆角按钮怎么玩。在material_button.xml中增加一个按钮


20201012171844726.png


通过设置cornerRadius的属性达到圆角的效果。运行一下:


20201012172027298.png


立竿见影。一行代码让你少些一个样式文件,嗨不嗨皮。两个字舒服。现在是默认的颜色,你肯定会使用其他的颜色,然后要设置背景,注意,这里不再使用background来设置,而是通过backgroundTint来设置


app:backgroundTint="@color/colorPrimaryDark"

20201012172508782.png

20201012172519303.png


 纯色背景可以这样解决,你可能会想到渐变背景按钮,这个说实话,渐变色你得自己写一个drawable才行,然后设置到background,然后你会发现会有问题,我一度认为这是google的bug,因为渐变色设置成功了,圆角没了。所以我得出一个结论,那就是当你的按钮又要圆角又要渐变时,你最好使用普通的按钮来实现,因为你已经自己写了一个drawable了,所以MaterialButton也就没有用的必要了。做程序员不要钻牛角尖,该跑路时要跑路。


② 双圆角按钮


 你可能还有别的想法,你可能想这个按钮左上角和右下角是圆角,其他的是直角,这样行不行呢?肯定行啊,兄嘚。


先在styles.xml增加一个样式,代码如下:


  <!--双圆角按钮样式-->
    <style name="DoubleFilletButtonStyle">
        <item name="cornerFamilyTopLeft">rounded</item>
        <item name="cornerFamilyBottomRight">rounded</item>
        <item name="cornerSizeTopLeft">25dp</item>
        <item name="cornerSizeBottomRight">25dp</item>
    </style>


如果你看过我之前写ShapeableImageView的文章,你就会觉得很熟悉了。下面回到material_button.xml,再增加一个按钮,然后增加样式。如下图所示:


20201012174715904.png


然后运行一下:


20201012174747143.png


当然还有更多的玩法,可以自己去设置。


③ 边框按钮


现在colors.xml中增加两个颜色


  <color name="white">#FFF</color>
    <color name="black">#000</color>


然后回到material_button.xml,再增加一个按钮,如下图所示:


20201012175550847.png


这里说明一下,为什么我加了一个padding=“1dp”。因为这个描边是内外描边,如果不加这个1dp的填充,会出现上下按钮最边缘出描边宽度一半的切割,我之前在低版本的Android手机上就是这样写的,不过在Android11中好像修复了这个问题,我不设置padding="1dp"也可以正常描边了,运行一下:


20201012175855475.png


刚才是有圆角的,再来看没有圆角的。


20201012180942364.png


20201012180955988.png

④ 圆形按钮


20201012181548613.png


MaterialButton具有默认的内边距,可以通过insetLeft、insetTop、insetRight、insetBottom来改变默认的填充值,如果不设置就是默认的6dp的填充,基本上来说就是上下内填充默认为6dp,运行一下:

20201012181819660.png


增加如下代码再运行一下


    app:strokeWidth="4dp"
        app:cornerRadius="60dp"

20201013092904654.png

⑤ 图标按钮


既然是带图标按钮,那么首先要有图标才行啊。如果你不想从网络上下载其他的图标再放到AS中的话,就可以试一下Material提供的图标,你没有看错,人家不光给你提供新控件。还提供了大部分开发过程中常用的图标,不过图标是Material风格的,下面来看看怎么在AS中使用这种图标。


在插件安装那里。输入Android material回车搜索。如下图,两个你都可以安装也可以选其一。


20201013094237860.png


我安装的是Material Design Icon Generator,安装之后需要重启AS,插件才会生效哦!重启之后,可以通过File → New →Material Design Icon Generator 或者使用快捷键Ctrl + Alt + D。如果你按了快捷键没有生效,就说明的电脑上有其他应用抢占了这个快捷键,起码QQ和微信不会抢占这个快捷键。


2020101309481773.png


使用快捷键之后你可以看到这样一个页面。


20201013095132238.png


为了方面使用,我简单说明一下,


Icon 对应的右边图标,这是一个下拉列表里面有很多图标,而且是命名很规范的。先熟悉有哪些再决定怎么使用。


Color 表示这个图标的颜色,如果下拉框里面没有你满意的颜色,你可以通过右边的输入框来手动设置颜色,很方便。


Theme 很明显这是主题样式,只能选择下拉框里面的主题样式。


Size 图标大小,里面只有四种大小,18dp、24dp、36dp、48dp。默认为24dp。因为在设计这种图的时候就只有这种标准的尺寸,注意它们都是2的倍数,在实际开发中也要遵循这个原则,这是设计的原则,不遵守也没关系。


Name 表示图标的名称,与下面的你图标的类型有关系,比如你选择Vector就是 .xml格式,选择Image就是 .png格式。那么你可能会问这两种格式有什么区别,区别就在于,.png没有代码,.xml是有代码的,它通过path路径来画图标,你不了解就不会看的很明白。


Res Directory 表示图标存放目录,通常是mipmap或者drawable。根据图标的类型来,xml放在drawable,png放在mipmap。


Image和Vector 默认是Vector,因为虽然你不一定能看到这些图标的绘制路径代码,但是它可以减少你的图片大小,进而减少你的应用大小,也相当于一个小优化,而至于Image,里面有五种类型的图标尺寸,是为了方便你做屏幕适配的。一般来说不会出现每一个图标都要设置五种分辨率情况,因为这会造成资源浪费,所以常规的是使用xhdpi或者xxhdpi就可以了,但是如果你想进一步减少图标的内存,那么还是推荐你使用Vector。


我想我已经解释的够清楚了,你也知道怎么使用这个插件来生成图标了,下面我们在mipmap-xhdpi下来生成一个白色的png格式图标。如下图所示:


20201013101826108.png


点击Generate,会出现一个提示框告诉你构建成功。


20201013101614173.png

20201013101843892.png


你会发现它自己新建了一个文件夹,我觉得这是一个bug,但是无所谓,反正图标有了就可以了,把图标复制粘贴到mipmap.xml下之后删除这个drawable-xhdpi文件夹。下面就使用图标按钮,在material_button.xml中增加按钮,如下图所示


20201013102501168.png


运行一下:


20201013102521114.png


现在你可以看到图标出现在文字的的左边。那么如果要让它在右边呢?通过iconGravity属性就可以实现了


20201013102654563.png


这里设置一个end的属性值,你可以看到预览里面图标已经在右边了,那么再运行一下:


20201013102816304.png


没骗你吧。不过这样感觉还是不太好看,我想让图标和文字再近一点,很简单你只要把end改成textEnd就可以了,改完之后再运行一下:


20201013103013563.png


感觉完美,Google的设计师和程序员果然不是盖的,这个时候我又想到了一句话,那就是距离产生美,你想一下如果这个图标紧挨着文字会好看吗?除非你瞎了,要么你就是杠精!显然目前这样还不是终极目标。现在我们都知道这个图标是.png的白色图标,如果我现在要改变这个图标的颜色,现在我既不想重新弄一个图标,又不想通过代码来改变这个颜色。怎么搞,当然有办法搞,还有一个iconTint的属性,这是一个图标色调的属性值,可以对已有的图标进行二次着色,最终以这个颜色为准,不设置则默认为icon的值。不知道你有没有理解这句话,没有理解也没有关系,实践出真知。


2020101310370841.png


下面运行一下,让白的变成黑的。


20201013103740662.png


就是这么的神奇,你以为现在就够神奇了吗?还没有完呢?

下面介绍iconTintMode属性,你可以理解为着色模式,这个说起来就有一些复杂了,不过没关系,我们只有知道详细的用法之后才能使用的得心应手,很多东西你不是不会,你只是不熟,熟能生巧。


20201013104034425.png


说实话翻译出来的结果不尽如人意,所以还是以效果为准来实践。

设置为screen,然后运行


20201013104315705.png


设置为src_over,然后运行


20201013104349571.png


设置为add,然后运行


20201013104423241.png


设置为multiply,然后运行


20201013104500856.png


设置为src_atop,然后运行


20201013104541739.png


设置为src_in,然后运行


20201013104618387.png


好像并没有对我们的使用增加一些神奇的效果,原来是一个鸡肋,不过。“哪怕是一条内裤、一张卫生纸,都有它们的用处”(出自:《国产凌凌漆》)


⑥ 圆角图标按钮

20201013110132617.png


运行如下图所示:


20201013110115833.png


当你点击的时候又会淡白色的水波纹效果。如果你要问我什么是水波纹效果的话,请看下图:


2020101311065733.gif


注意到了吗?其实一般的Button也有这个点击的效果,但是如果要修改这个水波纹的颜色会麻烦一些,需要通过样式来设置才行,但是MaterialButton可以直接修改这个水波纹的颜色。比如我这里改成绿色。通过rippleColor属性,如下图所示


20201013110943872.png


如下图所示:


20201013111114544.gif


是不是很拉风。

4. 总结


好了到这里MaterialButton基本上的用法就差不多了,也满足你用基本需求了,你要是还想加一些花里胡哨的骚操作可以再对这个MaterialButton进行进一步继承封装。OK,就到这里了。最后注意一点,在低版本的Andoid设备上可能不会生效哦!


相关文章
|
9天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
9天前
|
API C# 开发者
基于Material Design风格开源、免费的WinForms UI控件库
基于Material Design风格开源、免费的WinForms UI控件库!
|
2月前
|
XML Android开发 UED
💥Android UI设计新风尚!掌握Material Design精髓,让你的界面颜值爆表!🎨
随着移动应用市场的蓬勃发展,用户对界面设计的要求日益提高。为此,掌握由Google推出的Material Design设计语言成为提升应用颜值和用户体验的关键。本文将带你深入了解Material Design的核心原则,如真实感、统一性和创新性,并通过丰富的组件库及示例代码,助你轻松打造美观且一致的应用界面。无论是色彩搭配还是动画效果,Material Design都能为你的Android应用增添无限魅力。
65 1
|
1月前
|
XML 存储 Java
浅谈Android的TextView控件
浅谈Android的TextView控件
31 0
|
2月前
|
XML 编解码 Android开发
安卓开发中的自定义视图控件
【9月更文挑战第14天】在安卓开发中,自定义视图控件是一种高级技巧,它可以让开发者根据项目需求创建出独特的用户界面元素。本文将通过一个简单示例,引导你了解如何在安卓项目中实现自定义视图控件,包括创建自定义控件类、处理绘制逻辑以及响应用户交互。无论你是初学者还是有经验的开发者,这篇文章都会为你提供有价值的见解和技巧。
46 3
|
3月前
|
前端开发 开发者 开发框架
JSF与Bootstrap,打造梦幻响应式网页!让你的应用跨设备,让用户爱不释手!
【8月更文挑战第31天】在现代Web应用开发中,响应式设计至关重要,以确保不同设备上的良好用户体验。本文探讨了JSF(JavaServer Faces)与Bootstrap框架的结合使用,展示了如何构建响应式网页。JSF是一个基于Java的Web应用框架,提供丰富的UI组件和表单处理功能;而Bootstrap则是一个基于HTML、CSS和JavaScript的前端框架,专注于实现响应式设计。通过结合两者的优势,开发者能够更便捷地创建自适应布局,提升Web应用体验。然而,这种组合也有其局限性,如JSF组件库较小和较高的学习成本等,因此在选择开发框架时需综合考虑具体需求和应用场景。
50 0
|
3月前
|
前端开发 开发者 C#
深度解析 Uno Platform 中的 MVVM 模式:从理论到实践的全方位指南,助你轻松掌握通过 C# 与 XAML 构建高效可维护的跨平台应用秘籍
【8月更文挑战第31天】本文详细介绍如何在优秀的跨平台 UI 框架 Uno Platform 中实施 MVVM(Model-View-ViewModel)模式,通过一个简单的待办事项列表应用演示其实现过程。MVVM 模式有助于分离视图层与业务逻辑层,提升代码组织性、易测性和可维护性。Uno Platform 的数据绑定机制使视图与模型间的同步变得高效简便。文章通过构造 `TodoListViewModel` 类及其相关视图,展示了如何解耦视图与模型,实现动态数据绑定及命令处理,从而提高代码质量和开发效率。通过这一模式,开发者能更轻松地构建复杂的跨平台应用。
54 0
|
3月前
|
前端开发 JavaScript 开发者
Angular Material 超厉害!与传统自定义 UI 大对比,构建美观一致 UI 的绝佳选择!
【8月更文挑战第31天】在前端开发中,构建美观一致的用户界面至关重要。Angular Material 是一个基于 Material Design 规范的强大 UI 组件库,提供丰富的预定义组件和设计指南。本文通过对比 Angular Material 和传统自定义 UI,展示了前者在设计理念、组件丰富度、响应式设计及主题定制方面的显著优势。
56 0
|
XML Android开发 数据格式
Android MaterialButton使用详解,告别shape、selector
Android MaterialButton使用详解,告别shape、selector
388 0
Android MaterialButton使用详解,告别shape、selector
|
3天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。