前言
基于上篇文章Android 5.0之后的各版本与日常开发相关的内容整理,本篇文章对Android5.0和6.0新增的控件做个简单的概述,都有哪些新增控件,能做什么样的效果,怎么简单地使用,更详细的用法可看其他的文章。
看这篇文章建议下载DViewSummary,可以看到示例代码。
简述
新增控件如下
1、CardView、RecyclerView、SwipeRefreshLayout、TabLayout、NavigationView、Snackbar、FloatingActionButton
2、TextInputLayout、TextInputEditText
3、CoordinatorLayout、AppBarLayout、CollapsingToolbarLayout、ToolBar
在整理学习时可以简单地把这些归为其他,与EditText相关,与和滚动效果相关,实际上并没有这样的分法,只是为了一眼看出哪些与哪些有关联。
控件 | 简述 |
---|---|
CardView | 5.0推出的带圆角和阴影的布局,继承自FrameLayout,在cardview-v7中。阴影效果不佳,不常用。 |
RecyclerView | 是用来代替ListView和GridView,在recyclerview-v7中。常用。 |
SwipeRefreshLayout | 下拉刷新控件,没有加载更多功能,在v4包中。 |
TabLayout | 选项卡,是一个用于放置水平Tab的布局,常见和viewpager、fragment搭配。常用,几乎每个app首页都能看到。 |
NavigationView | 导航视图,用于DrawerLayout抽屉布局中,侧拉拉出的那部分页面就是NavigationView,它提供一个规范,包含一个header和menu布局,在desgin包中。 |
Snackbar | 提示信息的展示,用来代替Toast,从底部滑出,主要区别是Snackbar可以滑动退出,也可以处理用户交互(点击)事件,在design包中。很少见到这效果。 |
FloatingActionButton | 一个悬浮的按钮,简称FAB,比较常见的是在要滚动的页面,浮现一个点击置顶的FAB,在design包中。 |
EditText相关
TextInputLayout继承自LinearLayout,TextInputEditText继承自AppCompatEditText,都在design包中。
控件 | 简述 |
---|---|
TextInputLayout | 主要是作为EditText的容器,它能做的功能有Hint字符串自动移到左上角,设置最大字符数及错误提示,设置错误提示文字,设置密码可见开关等。 |
TextInputEditText | 用来处理输入法在'extract'模式的时候,hint无法显示问题。用TextInputLayout时,如果用EditText虽然不至于报错,但会打印info建议我们替换成TextInputEditText。 |
和滚动效果相关
控件 | 简述 |
---|---|
CoordinatorLayout | CoordinatorLayout是一个布局管理器,主要用通过Behavior协调子View交互行为。 |
AppBarLayout | 是一种支持响应滚动手势的app bar布局,例如可以做折叠导航栏。 |
CollapsingToolbarLayout | 是专门用来实现子布局内不同元素响应滚动细节的布局,作为AppBarLayout的直接子布局。 |
ToolBar | 工具栏(标题栏),代替ActionBar,在appcompat-v7包中。 |
ConstraintLayout
ConstraintLayout 是在2016年Google的I/O大会上重点宣传的功能,Android Studio 2.2 也是那时候发布的,从 2.2 开始就支持ConstraintLayout,而从Android Studio 3.0开始,创建Project 默认布局也改成它了。其实按时间线来看,它应该算是Android 7.0出的功能,Android7.0就是2016年出的。最近ConstraintLayout2.0也出来了,这里不去管2.0,先了解ConstraintLayout是什么东西。
ConstraintLayout 继承自ViewGroup,好处两点:
1、方便可视化移动布局(就是直接拖动控件)
2、有效解决布局嵌套过多问题,用了约束的方式制定各个控件位置和关系,类似RelativeLayout,但比RelativeLayout强大。(功能是很强大,但还是要看情况使用)
知识点
1、相对定位——layout_constraintXXX_toYYYOf,如layout_constraintLeft_toRightOf是指在B控件的左边在A控件的右边。
2、角度定位,layout_constraintCircle 相关,以控件为圆心,设定转过的角度和距离,可以用这个实现一些圆行轨迹相关的View,比如圆形菜单。
3、margin和goneMargin区别在于goneMargin是控件为gone时才生效的,两者都是必须在布局里约束一个相对位置才生效,且margin>=0。
4、居中和偏移,如水平居中如下,竖直居中同理。
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
5、尺寸约束
1)官方推荐使用 0dp (MATCH_CONSTRAINT) 代替 match_parent,因为设置match_parent会导致约束布局失效,如果该方向上没有约束,使用match_parent也可以。
2)宽高比,当宽或高至少有一个尺寸被设置为0dp时,可以通过属性layout_constraintDimensionRatio设置宽高比。
6、链
在链的第一个控件,用 app:layout_constraintHorizontal_chainStyle = "spread"控制链的样式。
spread:展开元素,默认
spread_inside:展开元素,但端的两端贴近
packed:元素往中间缩在一起
7、辅助工具
Barrier:在多个控件的一侧建立一个屏障。
Group:把多个控件归为一组,方便隐藏或显示一组控件。
Placeholder:在Placeholder中可使用setContent()设置另一个控件的id,使这个控件移动到占位符的位置。
结语
复杂的布局再用ConstraintLayout,如果是简单的还是用LinearLayou或RelativeLayout,它们的测量更快。可以用它做一些有意思的布局,比如用角度定位做圆形菜单,宽高比也可以很方便处理适配布局变形问。
参考
约束布局ConstraintLayout看这一篇就够了
ToolBar
工具栏(标题栏),代替ActionBar,继承于ViewGroup,如果不用v7包的,那么minSdkVersion最小要21(Android 5.0)。它包含的可选元素有导航按钮、logo、标题和子标题、多个视图、动作菜单(action menu)。
常用
一般开发中都会要标题居中,可以在ToolBar中放置一个TextView来实现。如果需要在工具栏右边放置一些按钮,如分享按钮、购物车跳转按钮等,可以用结合menu文件来实现。如果要做更多菜单的弹窗,菜单弹窗的menuItem宽度无法限定,也可以考虑用PopWindow实现。
炫酷的效果
可以搭配AppBarLayout、CoordinatorLayout、
CollapsingToolbarLayout 来实现一些炫酷的折叠效果。它有app:layout_scrollFlags熟悉,有5中滑动属性,具体可看后面的AppBarLayout。
结语
用ToolBar做标题栏方便,但menu和menu之间的间距很难调整,更多弹窗的样式也不好定义。用v7包的toolbar,这样menu.xml设置showAsAction才会生效。
CardView、RecyclerView、SwipeRefreshLayout
CardView
5.0出的带圆角和阴影的布局,继承自FrameLayout,用法简单,有如下常用属性。
属性名 | 作用 |
---|---|
app:cardBackgroundColor | 设置背景 |
app:cardCornerRadius | 设置圆角 |
app:cardElevation | 设置z轴高度,来控制阴影大小 |
app:cardMaxElevation | 设置最大z轴高度 |
app:contentPadding | 设置内边距 |
app:cardPreventCornerOverlap | 是否裁剪边界以防止重叠 |
app:cardUseCompatPadding | 如果您需要将CardView与其他视图对齐,可能在21以下,可以将此标志设置为true,CardView将在21之后的平台上添加相同的填充值 |
RecyclerView
用来代替ListView和GridView,可以实现很多强大的功能。
SwipeRefreshLayout
是系统提供的下拉刷新控件,它不支持上拉加载,要做上拉加载,可以考虑用RecyclerView的滚动监听,判断当前可见Item是否是最后一个item,是则显示Adapter里的footer布局。
结语
RecyclerView常用,它的Adapter推荐用BaseRecyclerViewAdapterHelper来做;SwipeRefreshLayout几乎没用过,推荐用SmartRefreshLayout 来做下拉刷新上拉加载。CardView没用过,因为往往UI要的是只有下边有阴影,而它的阴影是下左右都有的,且没办法改变阴影的颜色,可能用来做圆角方便,虽然这也只是写一个drawable的事。
参考
MaterialDesign系列文章(九)CardView的使用及适配
SwipeRefreshLayout+Recyclerview实现下拉刷新和上拉自动加载
FloatingActionButton
FloatingActionButton(FAB)是 Android 5.0 新特性——Material Design中的一个控件,其实就是一个悬浮的按钮。
常用属性
属性名 | 作用 |
---|---|
android:src | FAB中显示的图标 |
android:backgroundTint | 正常的背景颜色 |
app:rippleColor | 按下时的背景颜色 |
android:elevation | 正常的阴影大小 |
app:pressedTranslationZ | 按下时的阴影大小 |
app:fabSize | FAB的大小,normal(56dp)或mini(40dp) |
app:borderWidth | 边框大小,最好设置成0dp否则会有边框 |
app:layout_anchor | 设置FAB的锚点,即以哪个控件为参照设置位置 |
app:layout_anchorGravity | FAB相对于锚点的位置 |
结语
比较少用,但使用场景还是有的,曾经在相亲类app的用户主页用到过,一个爱心icon的FAB,点击表示喜欢她。还有某些要滚动,有很长内容的详情页,提供一个FAB点击滚到顶部。
Snackbar
Snackbar 是 Android 5.0 新特性——Material Design 中的一个控件,用来代替 Toast ,Snackbar与Toast的主要区别是:Snackbar可以滑动退出,也可以处理用户交互(点击)事件。
不需要在xml文件布局,一般用CoordinatorLayout作为它的父容器,这样才能使某些功能政策,如滑动关闭,不音响FAB等,此外还可以在Snackbar中添加一个按钮,处理用户点击事件,可以监听显示隐藏状态等。
没用过,不知道具体应用场景,详情可看这篇文章,android Snackbar新控件解析
NavigationView
NavigationView是导航视图,它是搭配DrawerLayout抽屉布局使用的,侧拉拉出的那部分页面就是NavigationView。其实它只是一种布局格式,上面有header,下面有menu,看起来好看一些而已,平时使用也可以不用它,自己定义一个布局。
常用属性
属性名 | 作用 |
---|---|
android:layout_gravity | 侧滑从哪边划出(start:左,end:右) |
app:headerLayout | 头布局文件 |
app:menu | 菜单文件 |
结语
DrawerLayout、NavigationView、menu搭配,menu要实现好看的效果比较困难,详情可看看这两篇文章:
安卓NavigationView使用方法
DrawerLayout 和 NavigationView到底是什么?
TextInputLayout、TextInputEditText
TextInputLayout 继承 LinearLayout,主要是作为EditText的父容器,它只能有一个EditText,且它的属性也只对EditText生效,如果在它里面添加其他View,则只是addView()进去而已。常见的功能有Hint字符串自动移到左上角,设置最大字符数及错误提示,设置错误提示文字,设置密码是否可见等。
TextInputEditText 作为EditText的子类,是为TextInputLayout设计的一个子容器,输入法在'extract'模式的时候,使用TextInputEditText会显示提示。源码不多,就是处理Hint显示而已。如果用TextInputLayout时,用EditText虽然不至于报错,但会打印info建议我们替换成TextInputEditText。
常用属性
属性名 | 作用 |
---|---|
app:hint | 设置浮动提示语,在EditText或 til中选一个设置即可 |
app:hintEnabled | 设置是否开启浮动功能,默认为true |
app:hintAnimationEnabled | 设置是否开启浮动提示动画,默认为true |
app:errorEnabled | 设置是否开启错误提示 |
app:counterEnabled | 设置是否开启计数器 |
app:counterMaxLength | 设置计数器的最大长度,超过并不影响输入,但是计数字符串会变色 |
app:counterOverflowTextAppearance | 设置超出字符数后提示文字的颜色,默认为@color/colorAccent |
app:passwordToggleEnabled | 设置是否开启密码可见开关(EditText必须为password类型才起作用) |
app:passwordToggleDrawable | 设置密码可见/不可见开关的图标 |
app:boxBackgroundColor | til的背景色,如果用android:background设置背景色,那么boxCornerRadiusXXX等效果就失效了 |
app:boxBackgroundMode | 3种,filled、outline、none。其实Til和Et之间是有一个间距的,用来显示上移的hint,filled的时候,这个间距也在Box范围内;outline则是把间距取消了,hint会覆盖在Box上。 |
app:boxCornerRadiusTopStart | 背景的圆角,左上角 |
app:boxCornerRadiusTopEnd | 右上角 |
app:boxCornerRadiusBottomStart | 左下角 |
app:boxCornerRadiusBottomEnd | 右下角 |
结语
由属性可发现,遇到需要计数器、显示密码是否可见开关、EditText圆角的时候,使用TextInputLayout方便完成。
参考:
这应该是最够用的TextInputLayout了
TextInputLayout TextInputEditText
TabLayout
TabLayout是比较常用的控件,是一个用于放置水平Tab的布局,常和viewpager、fragment搭配使用。
常用属性
属性名 | 作用 |
---|---|
app:tabTextColor | tab文字颜色,未选中 |
app:tabSelectedTextColor | tab文字颜色,选中 |
app:tabIndicatorColor | 指示条颜色 |
app:tabIndicatorHeight | 指示条高度 |
app:tabMode | fixed、scrollable。fixed是指固定tab;scrollable是指tab可滑动,在tab数量超出屏幕范围的时候可看到效果。 |
app:tabGravity | center和fill;center是指居中显示,fill是指占满全屏。在app:tabMode=“fixed”才会生效。 |
用法
TabLayout经常和ViewPager使用,两者是通过TabLayout.setupWithViewPager(viewPager)绑定在一起的。实际上,是setupWithViewPager()方法底层调用PagerAdapter中的getPageTitle()方法来实现联系。
注意,setupWithViewPager 会执行 removeAllTabs,然后重新new Tab,所以要在关联之前不要去newTab,在关联之后,也不要去newTab,而是用getTabAt 方法来设置title,或者在PagerAdapter的getPageTitle()返回标题。
结语
TabLayout和ViewPager很常用,但我们经常遇到要修改指示条宽度的时候,比如要求指示条比文字短一点点,且各个Tab的文字长度不一样。这种情况如果打算修改TabLayout的指示条就比较难改了,网上有提供的反射方法去修改,效果却不理想,指示条变短,它的宽度变短,文字会变小。
如果要做很炫酷的效果,可用
FlycoTabLayout、SmartTabLayout
CoordinatorLayout
CoordinatorLayout (协调布局)继承于ViewGroup,它是一个超级强大Framelayout,是用来协调其子view之间动作的一个父view,而Behavior就是用来给CoordinatorLayout的子view们实现交互的,系统提供了一些behavior,也可以自定义behavior。
AppBarLayout
AppBarLayout 继承自LinearLayout,布局方向为垂直方向,它是在LinearLayou上加了一些材料设计的概念,当某个可滚动View的滚动手势发生变化时,其内部的子View实现何种动作。
简单例子
让Toolbar随着NestedScrollView滚动
步骤:
1、根布局:CoordinatorLayout (因为它才支持app:layout_behavior)
2、可折叠部分:AppBarLayout 包裹 ToolBar,ToolBar 设置了
app:layout_scrollFlags="scroll"
3、滚动部分:NestedScrollView 设置了app:layout_behavior="@string/appbar_scrolling_view_behavior",这是一个系统behavior,字面意思是为appbar设置滚动动作的一个behavior。
由此可看,我们要知道
1、app:layout_scrollFlags 是什么,它有哪些值。
2、app:layout_behavior是什么,它有哪些值。(系统提供了一些behavior,也可以自定义behavior。)
app:layout_scrollFlags
app:layout_scrollFlags 是每个控件都有的属性,它有5种滑动属性(还有一个snapMargins不知是什么效果,网上没找到这个的解释),实际上可以尝试组合看看效果,比如scroll | enterAlways | snap。
值 | 作用 |
---|---|
scroll | 值为scroll的View会跟随滚动事件一起发生移动。 |
scroll | enterAlways | 当任何时候ScrollView往下滚动时,该View优先滚动,全部滚动出来后,再滚动ScrollView。而不用考虑ScrollView是否滚动到最顶部。 |
scroll | exitUntilCollapsed | 当这个View要往上逐渐“消逝”时,会一直往上滑动,直到剩下的的高度达到它的最小高度后,再响应ScrollView的内部滑动事件。 |
scroll | enterAlways | enterAlwaysCollapsed | 是enterAlways的附加选项,要和enterAlways一起使用,否则没有效果,它是指View在往下“出现”的时候,首先是enterAlways效果,当View的高度达到最小高度时,View就暂时不去往下滚动,直到ScrollView滑动到顶部不再滑动* 时,View再继续往下滑动,直到滑到View的顶部结束。 |
scroll | snap | 设置吸附性效果,当你滚动TabLayout不足一半高度的时候就会回弹,高于一半的时候就会全部隐藏 |
CollapsingToolbarLayout
折叠工具栏布局。
CollapsingToolbarLayout是用来对Toolbar进行再次包装的ViewGroup,主要是用于实现折叠(其实就是看起来像伸缩~)的App Bar效果。它需要放在AppBarLayout布局里面,并且作为AppBarLayout的直接子View。
主要功能
值 | 作用 | 设值 |
---|---|---|
折叠Title(Collapsing title) | title随着布局内容变小而变小 | Collapsing的setTitle比Toolbar的优先级高 |
内容纱布(Content scrim) | 根据滚动的位置是否到达一个阀值,来决定是否对View“盖上纱布” | setContentScrim(Drawable),默认值为colorPrimary |
状态栏纱布(Status bar scrim) | 根据滚动位置是否到达一个阀值,来决定是否对状态栏“盖上纱布” | setStatusBarScrim(Drawable),默认值为colorPrimaryDark |
视差滚动子View(Parallax scrolling children) | 让View的滚动的速度比其他正常滚动的View速度稍微慢一点 | app:layout_collapseMode=“parallax” |
将子View位置固定(Pinned position children) | 子View可以选择是否在全局空间上固定位置 | app:layout_collapseMode=“pin” |
简单例子
看看折叠Title、设置app:layout_collapseMode=“parallax”
和app:layout_collapseMode=“pin”时的效果。
关键代码:
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="150dp">
<android.support.design.widget.CollapsingToolbarLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:title="CTitle"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="44dp"
android:background="@color/colorPrimaryDark"
app:title="Title"
app:layout_collapseMode="pin"
app:navigationIcon="@drawable/back_icon" >
</android.support.v7.widget.Toolbar>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
结语
1、Collapsing设置的title优先级比Toolbar高,且titleColor在Collapsing设置才有效。
2、CollapsingToolbarLayout 设置了app:layout_scrollFlags="scroll|exitUntilCollapsed", Toolbar的Height就是它的minHeight。
3、常用都是Toolbar 设置 app:layout_collapseMode="pin"固定。
4、在Collapsing下可以放入多个子View,如在Toolbar之前放入ImageView,可以实现图片收缩。
5、常见的滚动到一定高度,标题栏变色,可以通过设置Collapsing的app:contentScrim="xxx"来实现。
6、常见的图片置顶,可以设置状态栏为透明色,且将ImageView和所有它上面的父View都添加fitsSystemWindows属性,再设置Collapsing的app:statusBarScrim="@android:color/transparent"来实现。
注意,这种情况下可能会遇到Title只显示上面一半的问题,可以通过设置setSupportActionBar(toolbar)恢复正常,具体原因不知。
结尾
这篇文章,介绍了5.0、6.0的新增控件,对它们进行个初步的讲解,有兴趣的可以去结合Demo一同进行学习。
Github地址:DViewSummary