Material Design---1 MD簡介
Material Design從Android5.0開始引入的,是一種全新的設(shè)計語言(翻譯為“原材料設(shè)計”),其實(shí)是谷歌提倡的一種設(shè)計風(fēng)格、理念、原則。
擬物設(shè)計和扁平化設(shè)計一種結(jié)合體驗。還吸取了最新一些科技理念。
國內(nèi)有對應(yīng)的翻譯網(wǎng)站可以了解MD風(fēng)格的概念和設(shè)計原則,當(dāng)然英語能力比較好的可以直接到官網(wǎng)查看MD風(fēng)格的相關(guān)介紹,MD風(fēng)格主要通過z軸來增加控件的層次感,而在App中則具體展現(xiàn)為控件周邊加對應(yīng)的陰影效果。對于開發(fā)人員來說,不需要過多的關(guān)注MD風(fēng)格的界面設(shè)計、頁面跳轉(zhuǎn)、動畫效果和交互設(shè)計,只需要對其進(jìn)行良好的實(shí)現(xiàn)即可。再真正開始聊Material Design之前,先說點(diǎn)別的,首先先說下Support庫。
Android Support相關(guān)
谷歌開放以及收集了一些最新的開源的項目(很多是自己開發(fā)的),匯集到最新的support兼容支持包以及最新的5.X API里面。其實(shí)在support包中有很多有用并且常用的類,下面對其進(jìn)行大致的介紹:
- android-support-v4:最低會兼容到1.6;常見使用的類有ViewPager,NestedScrollView,LruCache,ViewDragHelper,CircleImageView,ColorUtils,RoundedBitmapDrawable等,這只是列舉了一小部分,其實(shí)我們常寫的好多東西,谷歌已經(jīng)幫我們封裝好了,最簡單的拿圓形頭像來說,Google早就為我們準(zhǔn)備好了,作為面向?qū)ο蟮拈_發(fā)者,為啥還要再自己寫呢。
- android-support-v7:最低兼容到Android 2.1的(個別的控件只兼容到3.0),常見的使用的類有appcompat、CardView、gridlayout、mediarouter、palette、preference、recyclerView等,這些控件值得我們研究一下。
這里可以查看官方對support支持庫的介紹,在使用時,最好將Andoird SDK,工具以及Support包都更新到最新。
style中控制全局樣式
一般我們新建好項目以后,默認(rèn)使用的就是Support-v7中的AppCompatActivity
,而且,在style文件中,也會默認(rèn)創(chuàng)建對應(yīng)的Theme:
這里的主題主要是給你的整體應(yīng)用定一個基調(diào),比如字體的顏色、主色調(diào),次主色調(diào),狀態(tài)欄顏色,導(dǎo)航欄顏色,各個控件的眼色等等。使用appcompat項目,主要也是為了解決android碎片化開發(fā)、的問題,讓我們app編譯出來在各種高低版本之間、不同的廠商生產(chǎn)的ROM之間顯示出來的效果UI控件等有較一致的體驗。關(guān)于整體基調(diào)的設(shè)定如下:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
colorPrimary
:主色
colorPrimaryDark
:主色--深色,一般可以用于狀態(tài)欄顏色
colorAccent
:代表各個空間的基調(diào)顏色--CheckBox、RadioButton、ProgressBar等等
android:textColor
:當(dāng)前所有的文本顏色
navigationBarColor
:底部導(dǎo)航
這個可以做5.0以上的沉浸式效果
下面這張圖是從google官網(wǎng)copy下來,可以參考一下:

不同的Android版本會加載不同的value文件夾,一般會找據(jù)當(dāng)前版本號最近的value文件夾,比如:Android5.0(版本號為21)會優(yōu)先加載value-21下的style.xml文件。
Android SDK更新有幾個重要的版本分別為:4.0(版本號14)、4.4(版本號19)、5.0(版本號21)。所以一般項目中進(jìn)行兼容性開發(fā),可直接新建value-14,value-19,value-21即可。
Support-v7包中常用控件簡介
在Support-v7包中有一系列用于兼容低版本的控件,可以配合appcompat的主題達(dá)到各個版本中的UI體驗一致性。
-
android.support.v7.app.AlertDialog
該控件的使用與android包下的AlertDialog使用方法相同,但是此控件會兼容5.0以下的效果。 -
SwipeRefreshLayout
該控件是用于下拉刷新的一個控件,幾乎可以包裹一個任何可以滾動的內(nèi)容(ListView GridView ScrollView RecyclerView),可以自動識別垂直滾動手勢。使用起來非常方便。(需要包裹可滾動的內(nèi)容使用)。用法如下:
第一步,在xml中,包裹一個可滑動的控件,如RecyclerView
<android.support.v4.widget.SwipeRefreshLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</android.support.v4.widget.SwipeRefreshLayout>
第二步,設(shè)置刷新動畫的觸發(fā)回調(diào)
//設(shè)置下拉出現(xiàn)小圓圈是否是縮放出現(xiàn),出現(xiàn)的位置,最大的下拉位置
mySwipeRefreshLayout.setProgressViewOffset(true, 50, 200);
//設(shè)置下拉圓圈的大小,兩個值 LARGE, DEFAULT
mySwipeRefreshLayout.setSize(SwipeRefreshLayout.LARGE);
// 設(shè)置下拉圓圈上的顏色,藍(lán)色、綠色、橙色、紅色
mySwipeRefreshLayout.setColorSchemeResources(
android.R.color.holo_blue_bright,
android.R.color.holo_green_light,
android.R.color.holo_orange_light,
android.R.color.holo_red_light);
// 通過 setEnabled(false) 禁用下拉刷新
mySwipeRefreshLayout.setEnabled(false);
// 設(shè)定下拉圓圈的背景
mSwipeLayout.setProgressBackgroundColor(R.color.red);
/*
* 設(shè)置手勢下拉刷新的監(jiān)聽
*/
mySwipeRefreshLayout.setOnRefreshListener(
new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
// 刷新動畫開始后回調(diào)到此方法
}
}
);
通過 setRefreshing(false) 和 setRefreshing(true) 來手動調(diào)用刷新的動畫。用法其實(shí)很簡單,當(dāng)然還有其他的Api,官方文檔中寫的很詳細(xì),本文中參考了這位同學(xué)的開源項目,同時該同學(xué)也對其進(jìn)行了源碼解析,大家可以參考。
-
PopupWindow/ListPopupWindow/PopupMenu
這里只簡單說一下ListPopupWindow的使用:
//初始化ListPopupWindow
ListPopupWindow listPopupWindow = new ListPopupWindow(this);
// 給listPopupWindow添加Adapter,填充數(shù)據(jù)
listPopupWindow.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,
new String[]{"test1","test2","test3"}));
// 設(shè)置錨點(diǎn),即顯示的位置
listPopupWindow.setAnchorView(view);
// 給每一個條目添加點(diǎn)擊事件
listPopupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(MainActivity.this, view.getId()+ " " + i, Toast.LENGTH_SHORT).show();
}
});
// 調(diào)用show方法
listPopupWindow.show();
這個控件在項目中還是很好用的,使用方便,PopupWindow的顯示有高度,可以看出有陰影效果
-
android.support.v7.widget.LinearLayoutCompat
給包裹在里面的所有子控件添加間隔線
<android.support.v7.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="match_parent"
app:divider="@drawable/abc_list_divider_mtrl_alpha" // 自定義屬性,添加分割線
app:showDividers="beginning|middle" // 分割線位置顯示
android:orientation="vertical" > - Appcompat打頭的控件,如下圖:
兼容控件
上圖為一系列兼容控件,不做過多的贅述,詳細(xì)的內(nèi)容可以看官方文檔.