前言
基于上篇文章Android 5.0之后的各版本與日常開發(fā)相關(guān)的內(nèi)容整理,本篇文章對Android5.0和6.0新增的控件做個簡單的概述敷搪,都有哪些新增控件兴想,能做什么樣的效果,怎么簡單地使用赡勘,更詳細的用法可看其他的文章嫂便。
看這篇文章建議下載DViewSummary,可以看到示例代碼闸与。
簡述
新增控件如下
1毙替、CardView、RecyclerView践樱、SwipeRefreshLayout厂画、TabLayout、NavigationView拷邢、Snackbar袱院、FloatingActionButton
2、TextInputLayout瞭稼、TextInputEditText
3忽洛、CoordinatorLayout、AppBarLayout环肘、CollapsingToolbarLayout欲虚、ToolBar
在整理學習時可以簡單地把這些歸為其他,與EditText相關(guān)悔雹,與和滾動效果相關(guān)复哆,實際上并沒有這樣的分法,只是為了一眼看出哪些與哪些有關(guān)聯(lián)腌零。
控件 | 簡述 |
---|---|
CardView | 5.0推出的帶圓角和陰影的布局梯找,繼承自FrameLayout,在cardview-v7中莱没。陰影效果不佳初肉,不常用。 |
RecyclerView | 是用來代替ListView和GridView饰躲,在recyclerview-v7中牙咏。常用。 |
SwipeRefreshLayout | 下拉刷新控件嘹裂,沒有加載更多功能妄壶,在v4包中。 |
TabLayout | 選項卡寄狼,是一個用于放置水平Tab的布局丁寄,常見和viewpager氨淌、fragment搭配。常用伊磺,幾乎每個app首頁都能看到盛正。 |
NavigationView | 導航視圖,用于DrawerLayout抽屜布局中屑埋,側(cè)拉拉出的那部分頁面就是NavigationView豪筝,它提供一個規(guī)范,包含一個header和menu布局摘能,在desgin包中续崖。 |
Snackbar | 提示信息的展示,用來代替Toast团搞,從底部滑出严望,主要區(qū)別是Snackbar可以滑動退出,也可以處理用戶交互(點擊)事件逻恐,在design包中像吻。很少見到這效果。 |
FloatingActionButton | 一個懸浮的按鈕复隆,簡稱FAB萧豆,比較常見的是在要滾動的頁面,浮現(xiàn)一個點擊置頂?shù)腇AB昏名,在design包中。 |
EditText相關(guān)
TextInputLayout繼承自LinearLayout阵面,TextInputEditText繼承自AppCompatEditText轻局,都在design包中。
控件 | 簡述 |
---|---|
TextInputLayout | 主要是作為EditText的容器样刷,它能做的功能有Hint字符串自動移到左上角仑扑,設置最大字符數(shù)及錯誤提示,設置錯誤提示文字置鼻,設置密碼可見開關(guān)等镇饮。 |
TextInputEditText | 用來處理輸入法在'extract'模式的時候,hint無法顯示問題箕母。用TextInputLayout時储藐,如果用EditText雖然不至于報錯,但會打印info建議我們替換成TextInputEditText嘶是。 |
和滾動效果相關(guān)
控件 | 簡述 |
---|---|
CoordinatorLayout | CoordinatorLayout是一個布局管理器钙勃,主要用通過Behavior協(xié)調(diào)子View交互行為。 |
AppBarLayout | 是一種支持響應滾動手勢的app bar布局聂喇,例如可以做折疊導航欄辖源。 |
CollapsingToolbarLayout | 是專門用來實現(xiàn)子布局內(nèi)不同元素響應滾動細節(jié)的布局,作為AppBarLayout的直接子布局。 |
ToolBar | 工具欄(標題欄)克饶,代替ActionBar酝蜒,在appcompat-v7包中。 |
ConstraintLayout
ConstraintLayout 是在2016年Google的I/O大會上重點宣傳的功能矾湃,Android Studio 2.2 也是那時候發(fā)布的亡脑,從 2.2 開始就支持ConstraintLayout,而從Android Studio 3.0開始洲尊,創(chuàng)建Project 默認布局也改成它了远豺。其實按時間線來看,它應該算是Android 7.0出的功能坞嘀,Android7.0就是2016年出的躯护。最近ConstraintLayout2.0也出來了,這里不去管2.0丽涩,先了解ConstraintLayout是什么東西棺滞。
ConstraintLayout 繼承自ViewGroup,好處兩點:
1矢渊、方便可視化移動布局(就是直接拖動控件)
2继准、有效解決布局嵌套過多問題,用了約束的方式制定各個控件位置和關(guān)系矮男,類似RelativeLayout移必,但比RelativeLayout強大。(功能是很強大毡鉴,但還是要看情況使用)
知識點
1崔泵、相對定位——layout_constraintXXX_toYYYOf,如layout_constraintLeft_toRightOf是指在B控件的左邊在A控件的右邊猪瞬。
2憎瘸、角度定位,layout_constraintCircle 相關(guān)陈瘦,以控件為圓心幌甘,設定轉(zhuǎn)過的角度和距離,可以用這個實現(xiàn)一些圓行軌跡相關(guān)的View痊项,比如圓形菜單锅风。
3、margin和goneMargin區(qū)別在于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:在多個控件的一側(cè)建立一個屏障翅娶。
Group:把多個控件歸為一組文留,方便隱藏或顯示一組控件。
Placeholder:在Placeholder中可使用setContent()設置另一個控件的id竭沫,使這個控件移動到占位符的位置燥翅。
結(jié)語
復雜的布局再用ConstraintLayout,如果是簡單的還是用LinearLayou或RelativeLayout蜕提,它們的測量更快森书。可以用它做一些有意思的布局谎势,比如用角度定位做圓形菜單拄氯,寬高比也可以很方便處理適配布局變形問。
參考
約束布局ConstraintLayout看這一篇就夠了
ToolBar
工具欄(標題欄)它浅,代替ActionBar,繼承于ViewGroup镣煮,如果不用v7包的姐霍,那么minSdkVersion最小要21(Android 5.0)。它包含的可選元素有導航按鈕典唇、logo镊折、標題和子標題、多個視圖介衔、動作菜單(action menu)恨胚。
常用
一般開發(fā)中都會要標題居中,可以在ToolBar中放置一個TextView來實現(xiàn)炎咖。如果需要在工具欄右邊放置一些按鈕赃泡,如分享按鈕寒波、購物車跳轉(zhuǎn)按鈕等,可以用結(jié)合menu文件來實現(xiàn)升熊。如果要做更多菜單的彈窗俄烁,菜單彈窗的menuItem寬度無法限定,也可以考慮用PopWindow實現(xiàn)级野。
炫酷的效果
可以搭配AppBarLayout页屠、CoordinatorLayout、
CollapsingToolbarLayout 來實現(xiàn)一些炫酷的折疊效果蓖柔。它有app:layout_scrollFlags熟悉辰企,有5中滑動屬性,具體可看后面的AppBarLayout况鸣。
結(jié)語
用ToolBar做標題欄方便牢贸,但menu和menu之間的間距很難調(diào)整,更多彈窗的樣式也不好定義懒闷。用v7包的toolbar十减,這樣menu.xml設置showAsAction才會生效。
CardView愤估、RecyclerView帮辟、SwipeRefreshLayout
CardView
5.0出的帶圓角和陰影的布局,繼承自FrameLayout玩焰,用法簡單由驹,有如下常用屬性。
屬性名 | 作用 |
---|---|
app:cardBackgroundColor | 設置背景 |
app:cardCornerRadius | 設置圓角 |
app:cardElevation | 設置z軸高度昔园,來控制陰影大小 |
app:cardMaxElevation | 設置最大z軸高度 |
app:contentPadding | 設置內(nèi)邊距 |
app:cardPreventCornerOverlap | 是否裁剪邊界以防止重疊 |
app:cardUseCompatPadding | 如果您需要將CardView與其他視圖對齊蔓榄,可能在21以下,可以將此標志設置為true默刚,CardView將在21之后的平臺上添加相同的填充值 |
RecyclerView
用來代替ListView和GridView甥郑,可以實現(xiàn)很多強大的功能。
SwipeRefreshLayout
是系統(tǒng)提供的下拉刷新控件荤西,它不支持上拉加載澜搅,要做上拉加載,可以考慮用RecyclerView的滾動監(jiān)聽邪锌,判斷當前可見Item是否是最后一個item勉躺,是則顯示Adapter里的footer布局。
結(jié)語
RecyclerView常用觅丰,它的Adapter推薦用BaseRecyclerViewAdapterHelper來做饵溅;SwipeRefreshLayout幾乎沒用過,推薦用SmartRefreshLayout 來做下拉刷新上拉加載妇萄。CardView沒用過蜕企,因為往往UI要的是只有下邊有陰影咬荷,而它的陰影是下左右都有的,且沒辦法改變陰影的顏色糖赔,可能用來做圓角方便萍丐,雖然這也只是寫一個drawable的事。
參考
MaterialDesign系列文章(九)CardView的使用及適配
SwipeRefreshLayout+Recyclerview實現(xiàn)下拉刷新和上拉自動加載
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相對于錨點的位置 |
結(jié)語
比較少用,但使用場景還是有的弥臼,曾經(jīng)在相親類app的用戶主頁用到過宴咧,一個愛心icon的FAB,點擊表示喜歡她径缅。還有某些要滾動掺栅,有很長內(nèi)容的詳情頁,提供一個FAB點擊滾到頂部纳猪。
Snackbar
Snackbar 是 Android 5.0 新特性——Material Design 中的一個控件氧卧,用來代替 Toast ,Snackbar與Toast的主要區(qū)別是:Snackbar可以滑動退出氏堤,也可以處理用戶交互(點擊)事件沙绝。
不需要在xml文件布局,一般用CoordinatorLayout作為它的父容器鼠锈,這樣才能使某些功能政策闪檬,如滑動關(guān)閉,不音響FAB等购笆,此外還可以在Snackbar中添加一個按鈕粗悯,處理用戶點擊事件,可以監(jiān)聽顯示隱藏狀態(tài)等同欠。
沒用過样傍,不知道具體應用場景,詳情可看這篇文章行您,android Snackbar新控件解析
NavigationView
NavigationView是導航視圖,它是搭配DrawerLayout抽屜布局使用的剪廉,側(cè)拉拉出的那部分頁面就是NavigationView娃循。其實它只是一種布局格式,上面有header斗蒋,下面有menu捌斧,看起來好看一些而已笛质,平時使用也可以不用它,自己定義一個布局捞蚂。
常用屬性
屬性名 | 作用 |
---|---|
android:layout_gravity | 側(cè)滑從哪邊劃出(start:左妇押,end:右) |
app:headerLayout | 頭布局文件 |
app:menu | 菜單文件 |
結(jié)語
DrawerLayout、NavigationView姓迅、menu搭配敲霍,menu要實現(xiàn)好看的效果比較困難,詳情可看看這兩篇文章:
安卓NavigationView使用方法
DrawerLayout 和 NavigationView到底是什么丁存?
TextInputLayout肩杈、TextInputEditText
TextInputLayout 繼承 LinearLayout,主要是作為EditText的父容器解寝,它只能有一個EditText扩然,且它的屬性也只對EditText生效,如果在它里面添加其他View聋伦,則只是addView()進去而已夫偶。常見的功能有Hint字符串自動移到左上角,設置最大字符數(shù)及錯誤提示觉增,設置錯誤提示文字兵拢,設置密碼是否可見等。
TextInputEditText 作為EditText的子類抑片,是為TextInputLayout設計的一個子容器卵佛,輸入法在'extract'模式的時候,使用TextInputEditText會顯示提示敞斋。源碼不多截汪,就是處理Hint顯示而已。如果用TextInputLayout時植捎,用EditText雖然不至于報錯衙解,但會打印info建議我們替換成TextInputEditText。
常用屬性
屬性名 | 作用 |
---|---|
app:hint | 設置浮動提示語焰枢,在EditText或 til中選一個設置即可 |
app:hintEnabled | 設置是否開啟浮動功能蚓峦,默認為true |
app:hintAnimationEnabled | 設置是否開啟浮動提示動畫,默認為true |
app:errorEnabled | 設置是否開啟錯誤提示 |
app:counterEnabled | 設置是否開啟計數(shù)器 |
app:counterMaxLength | 設置計數(shù)器的最大長度济锄,超過并不影響輸入暑椰,但是計數(shù)字符串會變色 |
app:counterOverflowTextAppearance | 設置超出字符數(shù)后提示文字的顏色,默認為@color/colorAccent |
app:passwordToggleEnabled | 設置是否開啟密碼可見開關(guān)(EditText必須為password類型才起作用) |
app:passwordToggleDrawable | 設置密碼可見/不可見開關(guān)的圖標 |
app:boxBackgroundColor | til的背景色荐绝,如果用android:background設置背景色一汽,那么boxCornerRadiusXXX等效果就失效了 |
app:boxBackgroundMode | 3種,filled低滩、outline召夹、none岩喷。其實Til和Et之間是有一個間距的,用來顯示上移的hint监憎,filled的時候纱意,這個間距也在Box范圍內(nèi);outline則是把間距取消了鲸阔,hint會覆蓋在Box上偷霉。 |
app:boxCornerRadiusTopStart | 背景的圓角,左上角 |
app:boxCornerRadiusTopEnd | 右上角 |
app:boxCornerRadiusBottomStart | 左下角 |
app:boxCornerRadiusBottomEnd | 右下角 |
結(jié)語
由屬性可發(fā)現(xiàn)隶债,遇到需要計數(shù)器腾它、顯示密碼是否可見開關(guān)、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數(shù)量超出屏幕范圍的時候可看到效果琼蚯。 |
app:tabGravity | center和fill酬凳;center是指居中顯示,fill是指占滿全屏遭庶。在app:tabMode=“fixed”才會生效宁仔。 |
用法
TabLayout經(jīng)常和ViewPager使用,兩者是通過TabLayout.setupWithViewPager(viewPager)綁定在一起的峦睡。實際上翎苫,是setupWithViewPager()方法底層調(diào)用PagerAdapter中的getPageTitle()方法來實現(xiàn)聯(lián)系。
注意榨了,setupWithViewPager 會執(zhí)行 removeAllTabs煎谍,然后重新new Tab,所以要在關(guān)聯(lián)之前不要去newTab龙屉,在關(guān)聯(lián)之后呐粘,也不要去newTab,而是用getTabAt 方法來設置title,或者在PagerAdapter的getPageTitle()返回標題事哭。
結(jié)語
TabLayout和ViewPager很常用,但我們經(jīng)常遇到要修改指示條寬度的時候瓜富,比如要求指示條比文字短一點點鳍咱,且各個Tab的文字長度不一樣。這種情況如果打算修改TabLayout的指示條就比較難改了与柑,網(wǎng)上有提供的反射方法去修改谤辜,效果卻不理想,指示條變短价捧,它的寬度變短丑念,文字會變小。
如果要做很炫酷的效果结蟋,可用
FlycoTabLayout脯倚、SmartTabLayout
CoordinatorLayout
CoordinatorLayout (協(xié)調(diào)布局)繼承于ViewGroup,它是一個超級強大Framelayout嵌屎,是用來協(xié)調(diào)其子view之間動作的一個父view推正,而Behavior就是用來給CoordinatorLayout的子view們實現(xiàn)交互的,系統(tǒng)提供了一些behavior宝惰,也可以自定義behavior植榕。
AppBarLayout
AppBarLayout 繼承自LinearLayout,布局方向為垂直方向尼夺,它是在LinearLayou上加了一些材料設計的概念尊残,當某個可滾動View的滾動手勢發(fā)生變化時,其內(nèi)部的子View實現(xiàn)何種動作淤堵。
簡單例子
讓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",這是一個系統(tǒng)behavior庙睡,字面意思是為appbar設置滾動動作的一個behavior事富。
由此可看,我們要知道
1乘陪、app:layout_scrollFlags 是什么统台,它有哪些值。
2啡邑、app:layout_behavior是什么贱勃,它有哪些值。(系統(tǒng)提供了一些behavior,也可以自定義behavior贵扰。)
app:layout_scrollFlags
app:layout_scrollFlags 是每個控件都有的屬性仇穗,它有5種滑動屬性(還有一個snapMargins不知是什么效果,網(wǎng)上沒找到這個的解釋)戚绕,實際上可以嘗試組合看看效果纹坐,比如scroll | enterAlways | snap。
值 | 作用 |
---|---|
scroll | 值為scroll的View會跟隨滾動事件一起發(fā)生移動舞丛。 |
scroll | enterAlways | 當任何時候ScrollView往下滾動時耘子,該View優(yōu)先滾動,全部滾動出來后球切,再滾動ScrollView谷誓。而不用考慮ScrollView是否滾動到最頂部。 |
scroll | exitUntilCollapsed | 當這個View要往上逐漸“消逝”時吨凑,會一直往上滑動捍歪,直到剩下的的高度達到它的最小高度后,再響應ScrollView的內(nèi)部滑動事件鸵钝。 |
scroll | enterAlways | enterAlwaysCollapsed | 是enterAlways的附加選項茸习,要和enterAlways一起使用感挥,否則沒有效果践剂,它是指View在往下“出現(xiàn)”的時候圣蝎,首先是enterAlways效果,當View的高度達到最小高度時痕届,View就暫時不去往下滾動韧献,直到ScrollView滑動到頂部不再滑動* 時,View再繼續(xù)往下滑動研叫,直到滑到View的頂部結(jié)束锤窑。 |
scroll | snap | 設置吸附性效果,當你滾動TabLayout不足一半高度的時候就會回彈嚷炉,高于一半的時候就會全部隱藏 |
CollapsingToolbarLayout
折疊工具欄布局渊啰。
CollapsingToolbarLayout是用來對Toolbar進行再次包裝的ViewGroup,主要是用于實現(xiàn)折疊(其實就是看起來像伸縮~)的App Bar效果申屹。它需要放在AppBarLayout布局里面绘证,并且作為AppBarLayout的直接子View。
主要功能
值 | 作用 | 設值 |
---|---|---|
折疊Title(Collapsing title) | title隨著布局內(nèi)容變小而變小 | Collapsing的setTitle比Toolbar的優(yōu)先級高 |
內(nèi)容紗布(Content scrim) | 根據(jù)滾動的位置是否到達一個閥值哗讥,來決定是否對View“蓋上紗布” | setContentScrim(Drawable)嚷那,默認值為colorPrimary |
狀態(tài)欄紗布(Status bar scrim) | 根據(jù)滾動位置是否到達一個閥值,來決定是否對狀態(tài)欄“蓋上紗布” | 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”時的效果腐泻。
關(guān)鍵代碼:
<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>
結(jié)語
1、Collapsing設置的title優(yōu)先級比Toolbar高队询,且titleColor在Collapsing設置才有效派桩。
2、CollapsingToolbarLayout 設置了app:layout_scrollFlags="scroll|exitUntilCollapsed"蚌斩, Toolbar的Height就是它的minHeight窄坦。
3、常用都是Toolbar 設置 app:layout_collapseMode="pin"固定凳寺。
4、在Collapsing下可以放入多個子View彤侍,如在Toolbar之前放入ImageView肠缨,可以實現(xiàn)圖片收縮。
5盏阶、常見的滾動到一定高度晒奕,標題欄變色,可以通過設置Collapsing的app:contentScrim="xxx"來實現(xiàn)名斟。
6脑慧、常見的圖片置頂,可以設置狀態(tài)欄為透明色砰盐,且將ImageView和所有它上面的父View都添加fitsSystemWindows屬性闷袒,再設置Collapsing的app:statusBarScrim="@android:color/transparent"來實現(xiàn)。
注意岩梳,這種情況下可能會遇到Title只顯示上面一半的問題囊骤,可以通過設置setSupportActionBar(toolbar)恢復正常,具體原因不知冀值。
結(jié)尾
這篇文章也物,介紹了5.0、6.0的新增控件列疗,對它們進行個初步的講解滑蚯,有興趣的可以去結(jié)合Demo一同進行學習。
Github地址:DViewSummary