作者簡介 原創(chuàng)微信公眾號郭霖 WeChat ID: guolin_blog
本篇來自Single Shu888的投稿,展示了Material Design常用控件的用法,進階部分基本都推薦了相關博文九妈。文章篇幅不短泰演,感興趣的話要花點時間閱讀了。
Single Shu888的博客地址:
http://blog.csdn.net/sw5131899
前言
Material Design 設計風格非常受歡迎搁凸,那么支持其效果的 Design Support Library(Android?2.1 ?API ?level 7及其以上)庫又有哪些控件呢媚值。主要包括SnackBar、Navigation View护糖、FloatActionbutton褥芒、CoordinatorLayout、CollapsingToolBarLayout等嫡良。我在Git上看見一個非常炫的效果:
把該項目的Git附上锰扶,覺得有用的自行下載看源碼:
https://github.com/frogermcs/InstaMaterial
現(xiàn)在來一一介紹Design系列控件。
SnackBar
SnackBar 是帶有動畫效果的快速提示欄寝受,它顯示在屏幕底部坷牛,是用來代替 Toast 的一個全新控件,它基本上繼承了 Toast 的屬性和方法很澄,用戶可以點擊按鈕執(zhí)行對應的操作京闰,Snackbar 支持滑動消失,如果沒設任何操作甩苛,那么到時間自動消失蹂楣。
SnackBar 的構(gòu)造:
SnackBar 的常用方法:
Snackbar 需要一個控件容器view用來容納,官方推薦使用 CoordinatorLayout 來確保 Snackbar 和其他組件的交互讯蒲,比如滑動取消 Snackbar痊土、Snackbar 出現(xiàn)時 FloatingActionButton 上移。舉一個簡單運用的例子:
這些運用都很簡單爱葵,就不更多的嚼舌根了施戴。有個花式使用SnackBar的連接,感興趣的可以去看看:
http://www.reibang.com/p/cd1e80e64311
TextInputLayout
TextInputLayout 主要作用是作為 EditText 的容器萌丈,從而為 EditText 默認生成一個浮動的 label赞哗,當用戶點擊了 EditText 之后,EditText 中設置的 Hint 字符串會自動移到 EditText 的左上角辆雾,使用非常簡單肪笋。這有個例子寫的不錯:
http://www.jcodecraeer.com/a/basictutorial/2015/0821/3338.html
getEditText()得到控件中包含的 EditText 控件
setError(CharSequence error)設置錯誤信息并顯示在 EditText 下方 應用場景:比如用戶輸錯了密碼或者用戶名等
setHint(CharSequence hint)設置提示信息
setErrorEnabled(boolean enabled)設置?setError(CharSequence error)?這個函數(shù)是否可用 記住哦:這個函數(shù)一定要在?setError(CharSequence error)?這個函數(shù)之后執(zhí)行哦!
部分示例xml
部分示例代碼
效果圖
TabLayout
TabLayout 控件用于應用中輕松的添加Tab分組功能,總共有兩種類型可選藤乙。
1. 固定的Tabs:對應的xml配置中的app:tabMode="fixed"
2. 可滑動的Tabs:對應xml配置中的app:tabMode="scrollable"
TabLayout猜揪,它就可以完成 TabPageIndicator 的效果,而且還是官方的坛梁,最好的是它可以兼容到2.2以上版本而姐,包括2.2。接下來就簡單使用一下划咐。
xml關鍵部分
適配器
用過 ViewPager 套 Fragment 的猿友都知道拴念,就不啰嗦了。getPageTitle 是獲取需要顯示的 tab標題褐缠。新建一個 空的fragmentBlankFragment政鼠。
那么準備工作差不多了,開始進入主題队魏,基本的介紹都加了注釋:
tabLayout.setupWithViewPager(viewPager,true); 這句代碼是關聯(lián) viewpager 和 tabLayout公般。后面的true是是否自動刷新 fragment 的布爾值,看源碼就知道了胡桨。
我們調(diào)用的第一個函數(shù)官帘,實質(zhì)是調(diào)用的第二個函數(shù)。這里需要注意的是需要先調(diào)用 viewpager 的 setAdaper 之后才能把 tabLayout 和 viewpager 關聯(lián)起來昧谊。給個效果圖:
NavigationView
以前做側(cè)邊欄的有?SlideMenu?三方庫遏佣,這里不詳細介紹了,想要了解的給個鏈接:
http://blog.csdn.net/luck_apple/article/details/9207811
現(xiàn)在有了 NavigationView 官方提供的揽浙,當然都漸漸使用這個了状婶。官網(wǎng)地址也給出來,有空的可以去瞅瞅:
http://www.google.com/design/spec/patterns/navigation-drawer.html
使用導航視圖需要傳入一組參數(shù)馅巷,一個可選的頭部布局膛虫,以及一個用于構(gòu)建導航選項的菜單,完成這些步驟以后只需給導航選項添加響應事件的監(jiān)聽器就可以了钓猬。
在使用 NavigationView 時需要提前準備好兩個xml文件稍刀,一個是頭布局,一個是menu布局敞曹。menu的一些屬性值是干嘛的账月,我相信有的猿友不是很清楚、下面簡單介紹一下澳迫。
menu屬性值介紹
元素(ELEMENTS):
必須的局齿。它必須是根節(jié)點,其中要包含?橄登、?元素抓歼。
的屬性:
xmlns:android
它定義了XML的命名空間讥此,必須是:http://schemas.android.com/apk/res/android
元素(ELEMENTS):
它定義一個菜單項,可以包含一個?元素 作為子菜單谣妻。它必須是?萄喳、元素 的子元素。
的屬性:
android:id
定義資源ID蹋半,它是個唯一值他巨,使用“@+id/name”格式可以給這個菜單項創(chuàng)建一個新的資源ID,“+”號指示要創(chuàng)建一個新的ID减江。
android:title
字符串資源闻蛀,它用字符串資源或原始的字符串來定義菜單的標題。
android:titleCondensed
字符串資源您市。它用字符串資源或原始的字符串來定義一個簡要的標題,以便在普通的標題太長時來使用役衡。
android:icon
可繪制資源茵休,它定義了一個菜單項所要使用的圖標。
android:onClick
方法名手蝎。在這個菜單項被點擊時榕莺,會調(diào)用這個方法。在Activity中棵介,這個方法必須用public關鍵字來聲明钉鸯,并且只接受一個MenuItem對象,這個對象指明了被點擊的菜單項邮辽。這個方法會優(yōu)先標準的回調(diào)方法:onOptionsItemSelected()唠雕。
警告:如果要使用ProGuard(或類似的工具)來混淆代碼,就要確保不要重名這個屬性所指定的方法吨述,因為這樣能夠破壞功能岩睁。
這個屬性在API級別11中被引入。
android:showAsAction
關鍵詞揣云。它定義這個項目作為操作欄中的操作項的顯示時機和方式捕儒。只用Activity包含了一個ActionBar對象時,菜單項才能夠作為操作項來顯示邓夕。這個屬性在API級別11中被引入刘莹,有效值如下:
android:actionViewLayout
它引用一個布局資源,這個布局要用于操作窗口焚刚。更多的信息請參照“操作欄”開發(fā)指南:
http://blog.csdn.net/fireofstar/article/details/7358393
這個屬性在API級別11中被引入点弯。
android:actionViewClass
類名。它定義了操作窗口要使用的View對象的完整的類名矿咕。例如蒲拉,“android.widget.SearchView”說明操作窗口要使用的SearchView類肃拜。
警告:如果要使用ProGuard(或類似的工具)來混淆代碼,就要確保不要重名這個屬性所指定的方法雌团,因為這樣能夠破壞功能燃领。
這個屬性在API級別11中被引入。
android:actionProviderClass
類名锦援,它是操作項目所使用的ActionProvider類的完整的類名猛蔽。例如,“android.widget.ShareActionProvider”說明要使用ShareActionProvider類灵寺。
警告:如果要使用ProGuard(或類似的工具)來混淆代碼曼库,就要確保不要重名這個屬性所指定的方法,因為這樣能夠破壞功能略板。?這個屬性在API級別14中被引入毁枯。
android:alphabeticShortcut
字符,定義一個字符快捷鍵
android:numericShortcut
數(shù)字值叮称,定義一個數(shù)字快捷鍵
android:checkable
布爾值种玛,如果菜單項是可以復選的,那么就設置為true瓤檐。
android:checked
布爾值赂韵,如果復選菜單項默認是被選擇的,那么就設置為true挠蛉。
android:visible
布爾值祭示,如果菜單項默認是可見的,那么就設置為true谴古。
android:enabled
布爾值质涛,如果菜單項目默認是可用的,那么就設置為true掰担。
android:menuCategory
關鍵詞蹂窖。它的值對應了定義菜單項優(yōu)先級的CATEGORE_*常量,有效值如下:
android:orderInCategory
整數(shù)值恩敌,它定義菜單項在菜單組中的重要性的順序瞬测。
元素(ELEMENTS):
它定義了一個菜單組(它是一個具有共同特征的菜單項的組合,如菜單項的可見性纠炮、可用性或可復選性)月趟。它要包含多個元素,而且必須是元素的子元素恢口。
的屬性
android:id
資源ID孝宗。它是資源的唯一標識。使用“@+id/name”格式給菜單項創(chuàng)建一個新的資源ID耕肩∫蚋荆“+”號指示應該給這個元素創(chuàng)建一個新的資源ID问潭。
android:checkableBehavior
關鍵詞。針對菜單組的可復選行為的類型婚被。有效值如下:
android:visible
布爾值狡忙,如果菜單組是可見的,就設置為true址芯。
android:enabled
布爾值灾茁,如果菜單組是可用的,就設置為true谷炸。
android:menuCategory
關鍵詞北专。它的值對應了Menu類的CATEGORY_*常量,定義了菜單組的優(yōu)先級旬陡。有效值如下:
android:orderInCategory
整數(shù)值拓颓,它定義了分類中菜單項目的默認順序。
差不多就這些了描孟,在res文件夾下創(chuàng)建一個名為 menu 的文件夾存放 menu的xml文件驶睦。取名為 draw_view.xml:
在創(chuàng)建一個頭布局,命名為nav_header.xml:
好了画拾,成功了一半,那么現(xiàn)在需要在 主xml文件 中布局使用 navigationView菜职,最外層是需要DrawerLayout的青抛。
這里我使用了一下百分比布局,防止有的產(chǎn)品經(jīng)理有側(cè)滑欄占屏幕的百分之多少多少之類的要求:
一些詳細的介紹都寫在了注釋里酬核,若還是有什么不懂的蜜另,可以參考這篇博客(介紹得比較詳細):
http://blog.csdn.net/lamp_zy/article/details/50126531
FloatingActionButton
浮動操作按鈕實在 Material Design 準則中新引入的組件。用于強調(diào)當前屏幕最重要嫡意,高頻率的一些操作举瑰。
FloatingActionButton?正常顯示的情況下有個填充的顏色,有個陰影蔬螟;點擊的時候會有一個 rippleColor此迅,并且陰影的范圍可以增大,那么問題來了:
這個填充色以及rippleColor如何自定義呢旧巾?
默認填充顏色取的是 theme 中的 colorAccent耸序,所以你可以在 style 中定義 colorAccent。
colorAccent 對應 EditText編輯時鲁猩、RadioButton選中坎怪、CheckBox等選中時的顏色。詳細請參考:
http://blog.csdn.net/lmj623565791/article/details/45303349
rippleColor 默認取的是theme中的colorControlHighlight廓握。
我們也可以直接用屬性定義這兩個的顏色:
app:backgroundTint="#ff87ffeb"app:rippleColor="#33728dff"
立體感有沒有什么屬性可以動態(tài)指定搅窿?
和立體感相關有兩個屬性嘁酿,elevation 和 pressedTranslationZ,前者用戶設置正常顯示的陰影大心杏Α闹司;后者是點擊時顯示的陰影大小。大家可以自己設置嘗試下殉了。
在5.x的設備上運行开仰,你會發(fā)現(xiàn)一些問題(測試系統(tǒng)5.0):
木有陰影
記得設置 app:borderWidth="0dp"。
按上述設置后薪铜,陰影出現(xiàn)了众弓,但是竟然有矩形的邊界(未設置margin時,可以看出)
需要設置一個margin的值隔箍。在5.0之前谓娃,會默認就有一個外邊距(不過并非是margin,只是效果相同)蜒滩。
so滨达,良好的實踐是:
添加屬性app:borderWidth="0dp"
對于5.x設置一個合理的margin
寫一個簡單的使用例子:
由于沒辦法運行模擬器,就上個圖片吧俯艰,app:rippleColor 這個是點擊顏色捡遍,android:backgroundTint 這個是顯示背景顏色。會有一個漸變的過程竹握,可以試試画株。也可以參考鴻神的一篇介紹:
http://blog.csdn.net/lmj623565791/article/details/46678867
CoordinatorLayout
CoordinatorLayout 是 Design 引入的一個功能強大的布局,本質(zhì)上是一個 增強的FrameLayout,它可以使得不同組件之間直接相互作用啦辐,并協(xié)調(diào)動畫效果谓传。我們可以定義 CoordinatorLayout 內(nèi)部的視圖組件如何相互作用并發(fā)生變化。
例如剛才的 FloatingActionButton 和 SnackBar芹关,為了實現(xiàn) SnackBar 出現(xiàn)時FAB能夠上移续挟,我們可以使用 CoordinatorLayout 為父容器。
然后在代碼中侥衬,把 Coordinator 給 SnackBar:
Snackbar.make(coordinatorLayout,"點擊了floatingActionButton",Snackbar.LENGTH_LONG).show();
這樣就實現(xiàn)了簡單的動畫聯(lián)動诗祸。這個是最簡單的使用,等一下學了 CollapsingToolbarLayout和AppbarLayout 配合起來更華麗轴总。
CollapsingToolbarLayout
完贬媒。。肘习。际乘。。漂佩。脖含。罪塔。。养葵。征堪。。关拒。佃蚜。。着绊。谐算。。归露。洲脂。。
文章原創(chuàng)作者GuoLin 書籍推薦
郭林大神原創(chuàng)android 書籍:《第一行代碼 android》