Material Design于2014年的Google I/O 大会上推出,是由谷歌的设计工程师们基于传统优秀的设计原则,结合丰富的创意和科学技术所发明的一套全新的界面设计语言。在2015年的Google I/O 大会上推出了一个Design Support库,这个库将Material Design中最具代表性的一些控件和效果进行了封装,使得开发者在即使不了解Material Design的情况下也能非常轻松的将自己的应用Material化。
(1)CardView(卡片布局)
(2)Toolbar(标题栏)
(3)DrawerLayout(滑动菜单)
(4)NavigationView(滑动菜单界面)
(5)FloatingActionButton(悬浮按钮)
(6)Snackbar(提示工具)
(7)CoordinatorLayout(布局)
(8)AppBarLayout
(9)SwipeRefershLayout(下拉刷新)
(10)CollapsingToolbarLayout(可折叠标题栏)
一、CardView(卡片式布局)
Android 5.0 版本新增加了CardView,CardView继承自FrameLayout类,并且可以设置圆角和阴影,使得控件具有立体性,也可以包含其他的布局容器和控件,CardView是用于实现卡片式布局效果的重要控件。
android.support.v7.widget.CardView
CardView具有如下几个重要属性:
- card_view:cardCornerRadius,设置圆角的半径。
- card_view:cardElevation,设置阴影的半径。
- CardView_cardBackgroundColor,设置背景色。
- CardView_cardElevation,设置Z轴阴影。
- CardView_cardMaxElevation,设置Z轴最大高度值。
- CardView_cardUseCompatPadding,是否使用CompadPadding。
- CardView_cardPreventCornerOverlap,是否使用PreventCornerOverlap。
- CardView_contentPadding,内容的padding。
- CardView_contentPaddingLeft,内容的左padding。
- CardView_contentPaddingTop,内容的上padding。
- CardView_contentPaddingRight,内容的右padding。
- CardView_contentPaddingBottom,内容的下padding。
CardViewDemo代码地址——Github地址:https://github.com/ambition-hb/CardViewDemo
项目示例图如下:
二、Toolbar(标题栏)
由于ActionBar设计的原因,被限定只能位于活动的顶部,从而不能实现一些Material Design的效果,因此官方已经不建议使用ActionBar了。而ToolBar的强大之处在于不仅继承了ActionBar的所有功能,而且灵活性很高,可以随处放置,可以配合其他控件来完成一些Material Design的效果。
android.support.v7.widget.Toolbar
我们可以添加有一些Action按钮来让Toolbar丰富一些,首先将图片资源放置到drawable中,然后右击res目录→New→Directory,创建一个menu文件夹。然后右击menu文件夹→New→Menu resource file,创建一个toolbar.xml文件。我们通过< item >标签来定义action按钮,android:id用于指定按钮的id,android:icon用于指定按钮的图标,android:title用于指定按钮的文字。接着使用app:showAsAction来指定按钮的显示位置,showAction主要有以下几种值可选:①always表示永远显示在toolbar中,如果屏幕空间不够则不显式;②ifRoom表示屏幕控件足够的情况下显示在Toolbar中,不够的话就显示在菜单中;③never表示永远显示在菜单中。(注意:Toolbar中的action按钮只会显示图标,菜单中的action按钮只会显示文字。)
ToolbarDemo代码地址——Github地址:https://github.com/ambition-hb/ToolbarDemo
项目示例图如下:
三、DrawerLayout(滑动菜单)
滑动菜单就是将一些菜单选项隐藏起来,而不是放置在主屏幕上,然后可以通过滑动的方式将菜单显示出来。这种方式既节省了屏幕空间,又实现了非常好的动画效果。Google提供了DrawerLayout控件来实现这个功能。
DrawerLayout是一个布局,在布局中允许放入两个直接子控件,第一个子控件是主屏幕中显示的内容,第二个子控件是滑动菜单中显示的内容。在第二个子控件中,layout_gravity这个属性是必须指定的,因为我们需要告诉DrawerLayout滑动菜单在屏幕的左边还是右边,指定left表示滑动菜单在左边,指定right表示滑动菜单在右边。而指定start表示会根据系统语言进行判断,如果系统语言是从左往右,比如英语、汉语,滑动菜单就在左边,如果系统语言是从右往左,比如阿拉伯语,滑动菜单就在右边。
Materail Design建议的做法是在Toolbar的最左边加入一个导航按钮,点击了按钮也会将滑动菜单的内容展示出来。这样就相当于给用户提供了两种打开滑动菜单的方式,防止一些用户不知道屏幕左侧是可以拖动的。
android.support.v4.widget.DrawerLayout
DrawerLayoutDemo代码地址——Github地址:https://github.com/ambition-hb/DrawerLayoutDemo
项目示例图如下:
四、NavigationView(滑动菜单界面)
NavigationView是Design Support库中提供的一个控件,它不仅是严格按照Material Design的要求来设计的,而且还可以将滑动菜单页面的实现变得非常简单。
android.support.design.widget.NavigationView
NavigationViewDemo代码地址——Github地址:https://github.com/ambition-hb/NavigationViewDemo
项目示例图如下:
五、FloatingActionButton(悬浮按钮)
FloatingActionButton是Design Support库中提供的一个控件,这个控件可以帮助我们轻松的实现悬浮按钮的效果,它默认会使用colorAccent来作为按钮的颜色,还可以通过给按钮指定一个图标来表明这个按钮的作用是什么。
android.support.design.widget.FloatingActionButton
通过app:elevation属性来给FloatingActionButton设定一个高度值(悬浮高度),高度值越大,投影的范围也越大,但是投影效果越淡,高度值越小,但是投影效果越浓。
FloatingActionButtonDemo代码地址——Github地址:https://github.com/ambition-hb/FloatingActionButtonDemo
项目示例图如下:
六、Snackbar(提示工具)
Snackbar并不是Toast的替代品,它们两者之间有着不同的应用场景。Toast的作用是告诉用户现在发生了什么,用户只能被动的接收这个事情,因为没有什么办法能让用户进行选择。而Scackbar则在这方面进行了扩展,它允许在提示当中加入一个可交互按钮,当用户点击按钮的时候可以执行一些额外的逻辑操作。
可以调用Snackbar的make()方法来创建一个Snackbar对象,make()方法的第一个参数需要传入一个view,只要是当前界面布局的任意一个view都可以,Snackbar会使用这个View来自动查找最外层的布局,用于展示Snackbar。第二个参数就是Snackbar中显示的内容,第三个参数是Snackbar显示的时长(与Toast类似)。
可以调用setAction()方法来设置Snackbar的动作,从而让Snackbar可以和用户进行交互。
SnackbarDemo代码地址——Github地址:https://github.com/ambition-hb/SnackbarDemo
项目示例图如下:
七、CoordinatorLayout(布局)
CoordinatorLayout是一个加强版的FrameLayout,在普通情况下的作用和FrameLayout基本一致,但是,CoordinatorLayout可以监听其所有子控件的各种事情,然后自动帮助我们做出最为合理的响应。比如:如果出现控件相互遮挡,CoordinatorLayout会帮助我们自动调整。
八、AppBarLayout
AppBarLayout实际上是一个垂直方向上的LinearLayout,他在内部做了很多滚动事件的封装,可以有效的解决控件遮挡问题(比如:RecyclerView遮挡Toolbar的问题)。
使用AppBarLayout的前提是它的根布局必须是CoordinatorLayout。换句话说,AppBarLayout必须是CoordinatorLayout的子布局。
当AppBarLayout接收到滚动事件的时候,它内部的子控件其实是可以指定如何去影响这些事件的,通过app:layout_scrollFlags属性就能实现。比如,我们在AppBarLayout中嵌套Toolbar,在Toolbar中添加一个app:layout_scrollFlags属性,并将属性的值指定为scroll|enterAlways|snap,其中,①scroll表示当RecyclerView向上滚动的时候,Toolbar会跟着一起向上滚动并实现隐藏;②enterAlways表示RecyclerView向下滚动的时候,Toolbar会跟着一起向下滚动并重新显示;③snap表示Toolbar还没有完全隐藏或显示的时候,会根据当前滚动的距离,自动选择是隐藏还是显示。此外,还有其他属性:④enterAlwaysCollapsed是对enterAlways的补充,当Scrolling View 向下滑动的时候,滑动View(也就是设置了enterAlwaysCollapsed 的View)下滑至折叠的高度,当Scrolling View 到达滑动范围的结束值的时候,滑动View剩下的部分开始滑动。这个折叠的高度是通过View的minimum height (最小高度)指定的。(要配合scroll|enterAlways 一起使用);⑤exitUntilCollapsed表示当Scrolling View 滑出屏幕时(也就是向上滑动时),滑动View先响应滑动事件,滑动至折叠高度,也就是通过minimum height 设置的最小高度后,就固定不动了,再把滑动事件交给 Scrolling view 继续滑动。
android.support.design.widget.AppBarLayout
AppBarLayoutDemo代码地址——Github地址:https://github.com/ambition-hb/AppBarLayoutDemo
项目示例图如下:
九、SwipeRefershLayout(下拉刷新)
SwipeRefershLayout是用于实现下拉刷新功能的核心类,是由support-v4库提供的。我们把想要实现下拉刷新功能的控件放置到SwipeRefershLayout中,就可以迅速让这个控件支持下拉刷新。
android.support.v4.widget.SwipeRefershLayout
SwipeRefershLayoutDemo代码地址——Github地址:https://github.com/ambition-hb/SwipeRefershLayoutDemo
项目示例图如下:
十、CollapsingToolbarLayout(可折叠标题栏)
CollapsingToolbarLayout可以让Toolbar的效果变得更加丰富,CollapsingToolbarLayout是不能独立存在的,它在设计的时候就被限定只能作为AppBarLayout的直接子布局来使用。而AppBarLayout又必须是CoordinatorLayout的子布局。
在布局CollapsingToolbarLayout中,除了id、layout_width、layout_height这几个属性外,还引入了(1)android:theme属性来指定一个主题;(2)app:contentScrim属性来指定CollapsingToolbarLayout在趋于折叠状态以及折叠之后的背景色,CollapsingToolbarLayout在折叠之后就是一个普通的Toolbar;(3)app:layout_scrollFlags属性来设置滑动的效果,其中,①scroll表示当RecyclerView向上滚动的时候,Toolbar会跟着一起向上滚动并实现隐藏;②enterAlways表示RecyclerView向下滚动的时候,Toolbar会跟着一起向下滚动并重新显示;③snap表示Toolbar还没有完全隐藏或显示的时候,会根据当前滚动的距离,自动选择是隐藏还是显示。此外,还有其他属性:④enterAlwaysCollapsed是对enterAlways的补充,当Scrolling View 向下滑动的时候,滑动View(也就是设置了enterAlwaysCollapsed 的View)下滑至折叠的高度,当Scrolling View 到达滑动范围的结束值的时候,滑动View剩下的部分开始滑动。这个折叠的高度是通过View的minimum height (最小高度)指定的。(要配合scroll|enterAlways 一起使用);⑤exitUntilCollapsed表示当Scrolling View 滑出屏幕时(也就是向上滑动时),滑动View先响应滑动事件,滑动至折叠高度,也就是通过minimum height 设置的最小高度后,就固定不动了,再把滑动事件交给 Scrolling view 继续滑动。
我们在CollapsingToolbarLayout中定义了一个ImageView和一个Toolbar,表示这个标题栏是由普通的标题栏加上图片组合而成的。在其中设置app:layout_collapseMode属性来指定当前控件在CollapsingToolbarLayout折叠过程中的折叠模式,有两种固定的模式:①pin,表示在折叠的过程中位置始终保持不变;②parallax,表示会在折叠的过程中产生一定的错位偏移。
android.support.design.widget.CollapsingToolbarLayout
CollapsingToolbarLayoutDemo代码地址——Github地址:https://github.com/ambition-hb/CollapsingToolbarLayoutDemo
项目示例图如下: