第十一章介紹的是云端服務(wù)器搭建方面的知識(shí),暫且略過刑桑,本章主要介紹的是Android5.X新特性氯质。
本章介紹了許多Material Design的概念,在此不做記錄。
另外本章記錄了許多新特性里包括了許多動(dòng)畫特效祠斧,大家可以自行谷歌百度查看效果闻察。
1.Palette
Palette用來提取顏色,使用它能從Bitmap中提取色調(diào)琢锋,從而修改當(dāng)前主題的顏色辕漂。
Android內(nèi)置了幾種提取色調(diào)的種類如下:
- Vibrant(充滿活力的)
- Vibrant dark(充滿活力的暗)
- Vibrant light(充滿活力的亮)
- Muted(柔和的)
- Muted dark(柔和的暗)
- Muted light(柔和的亮)
使用Palette需要先在Android studio中添加相關(guān)的依賴:com.android.support:palette-v7:xx.x.x引用∥獬可以通過傳遞一個(gè)Bitmap對(duì)象給Palette钉嘹,書中寫是用它的Palette.generate()
靜態(tài)方法或者Palette.generateAsync()
方法來創(chuàng)建一個(gè)Palette。然而這兩個(gè)方法已經(jīng)過時(shí)了鲸阻,改用建造者模式來創(chuàng)建對(duì)象了跋涣。
代碼:
Palette.from(bitmap).generate(new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(Palette palette) {
//通過Palette來獲取對(duì)應(yīng)的色調(diào)
Palette.Swatch vibrant=palette.getDarkVibrantSwatch();
//將顏色設(shè)置給相應(yīng)的組件
btn.setBackgroundColor(vibrant.getRgb());
}
});
2.視圖與陰影
Android的View通常具有X和Y兩個(gè)屬性,在5.X中谷歌新增了一個(gè)Z屬性來控制對(duì)應(yīng)垂直方向上的高度變化鸟悴。它由elevation
和translationZ
兩部分組成陈辱,elevation
是靜態(tài)的成員,translationZ
可以在代碼中使用來實(shí)現(xiàn)動(dòng)畫效果细诸。Z=elevation+translationZ
沛贪。
- 在XML中使用
elevation
來定義Z的高度:android:elevation="XXdp"
- 在代碼中通過
translationZ
:view.setTranslationZ(XXX)
或者使用動(dòng)畫view.animate().translationZ(100)
3.Tinting和Clipping
- Tinting(著色):
在XML中配置好tine和tintMode就可以實(shí)現(xiàn)對(duì)圖片的著色,它通過修改圖形的Alpha遮罩來修改圖像的顏色震贵,從而達(dá)到重新著色的目的
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@drawable/icon"
android:tint="@color/blue"
/>
- Clipping(裁剪):
Clipping可以讓我們改變一個(gè)視圖的外形利赋,首先我們需要使用ViewOutlineProvider
修改outline然后再通過設(shè)置setOutlineProvider
將outline作用給視圖。
代碼:
//寬高100的textview
ViewOutlineProvider vop=new ViewOutlineProvider(){
@Override
public void getOutline(View view,Outline outline){
//修改outline為特定形狀
outline.setRoundRect(0,0,textView.getWidth(),textView.getHeight(),30);
}
};
textView.setOutlineProvider(vop);
//設(shè)置完以后將會(huì)看到一個(gè)圓角的矩形
4.列表和卡片
RecyclerView:
個(gè)人感覺是一個(gè)升級(jí)版的ListView猩系,在其Adapter內(nèi)已經(jīng)封裝好一個(gè)ViewHolder媚送,并且可以通過不同的LayoutManager來直接實(shí)現(xiàn)類似GridView或者是瀑布流的樣式。但是RecyclerView并沒有header蝙眶、footer以及點(diǎn)擊事件季希,這些如果有需求則需要自己來實(shí)現(xiàn)褪那。RecyclerView介紹以及RecyclerView添加header幽纷、footer方案感覺比書中的介紹的要詳細(xì)式塌,在此就不多做記錄!CardView:
CardView也是一種容器布局友浸,只是它提供了卡片這樣的一種形式峰尝,開發(fā)者可以定義卡片大小與視角高度,并設(shè)置圓角的角度收恢,如果要作為列表來使用最好配合RecyclerView而不是ListView武学,否則一些屬性會(huì)失效。
CardView通過cardBackgroundColor
來設(shè)置背景色伦意,通過cardCornerRadius
來設(shè)置圓角角度火窒,這兩個(gè)是自定義的屬性需添加res-auto才能使用。
5.Activity過渡動(dòng)畫
Android5.X提供了三種Transition類型驮肉。
- 進(jìn)入:一個(gè)進(jìn)入的過渡動(dòng)畫決定Activity中的所有的視圖怎么進(jìn)入屏幕熏矿。
- 退出:一個(gè)退出的過渡動(dòng)畫決定了一個(gè)Activity中的所有視圖怎么退出屏幕。
- 共享元素:一個(gè)共享元素過渡動(dòng)畫決定了兩個(gè)Activities之間的過渡离钝,怎么共享它們的視圖票编。
其中進(jìn)入和退出包括:
- explode(分解):從屏幕中間進(jìn)或者出,移動(dòng)視圖卵渴。
- slide(滑動(dòng)):從屏幕邊緣進(jìn)或者出慧域,移動(dòng)視圖。
- fade(淡出):通過改變屏幕上視圖的不透明度達(dá)到添加或者移除視圖浪读。
共享元素包括:
- changeBounds:改變目標(biāo)視圖的布局邊界
- changeClipBounds:裁剪目標(biāo)視圖邊界
- changeTransform:改變目標(biāo)視圖的縮放比例和旋轉(zhuǎn)角度
- changeImageTransform:改變目標(biāo)圖片的大小和縮放比例
進(jìn)入和退出的代碼:
//ActivityA中:
startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
//ActivityB中:
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
//進(jìn)入B的動(dòng)畫
getWindow().setEnterTransition(new Explode());
//退出B的動(dòng)畫
getWindow().setExitTransition(new Explode());
其實(shí)這和以前的overridePendingtransition()
差不多昔榴,并且這個(gè)方法并不兼容5.0以下。
共享元素代碼:
首先需要在ActivityA中的布局文件中設(shè)置共享元素碘橘,給它增加相應(yīng)的屬性:
android:transitionName="XXX"
同時(shí)在Activity2中藥實(shí)現(xiàn)共享效果的元素也增加相同的屬性论泛,代碼同上,并且保證命名相同蛹屿。
如果只要一個(gè)共享元素屁奏,那么Activity1中只需要使用如下代碼:
//使用的代碼就是在前面普通動(dòng)畫的基礎(chǔ)上增加了共享的View和前面取的名字。
startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this,view,"share").toBundle());
如果有多個(gè)元素需要共享错负,那么可以通過Pair.create()
來創(chuàng)建多個(gè)共享元素:
startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this,Pair.create(view,"share"),Pair.create(fab,"fab")).toBundle());
6.Ripple效果
Ripple即點(diǎn)擊后的波紋效果坟瓢。可以通過如下代碼進(jìn)行設(shè)置:
//波紋有邊界
android:background="?android:attr/selectableItemBackground"
//波紋超出邊界
android:background="?android:attr/selectableItemBackgroundBorderless"
7.Circular Reveal
這個(gè)動(dòng)畫效果在谷歌IO大會(huì)的演示視頻中出現(xiàn)了很多次犹撒,具體表現(xiàn)為一個(gè)View以圓形的形式展開折联、揭示出來。通過ViewAnimationUtils.createCircularReveal()
方法可以創(chuàng)建一個(gè)Reveal動(dòng)畫识颊,其中需傳入幾個(gè)參數(shù):
- centerX 動(dòng)畫開始的中心點(diǎn)X
- centerY 動(dòng)畫開始的中心點(diǎn)Y
- startRadius 動(dòng)畫開始半徑
- endRadius 動(dòng)畫結(jié)束半徑
8.Toolbar
Toolbar與Actionbar最大的區(qū)別就是它更加自由可控诚镰。要使用Toolbar必須引入支持appcompat-v7奕坟,并設(shè)置主題為NoActionBar。其菜單的配置與Actionbar基本類似清笨,通過setSupportActionBar(toolbar)
方法可以用Toolbar模擬出Actionbar的效果月杉。
9.Notification
在Android5.X上谷歌改進(jìn)了通知欄,優(yōu)化了Notification抠艾,長(zhǎng)按Notification時(shí)會(huì)顯示出消息來源苛萎。Notification會(huì)有一個(gè)從白色到灰色的動(dòng)畫切換效果,最終顯示發(fā)出這個(gè)Notification的調(diào)用者检号,同時(shí)在鎖屏狀態(tài)下我們也可以看見Notification通知了腌歉。
- 基本的Notification
通過Notification.Builder創(chuàng)建一個(gè)Notification的builder:
Notification.Builder builder=new Notification.Builder(this);
接下來需要提供一個(gè)延遲的Intent即PendingIntent:
//點(diǎn)擊Notification之后就會(huì)觸發(fā)PendingIntent事件,打開瀏覽器開始瀏覽網(wǎng)頁(yè)齐苛。
Intent intent=new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.sina.com"));
PendingIntent pendingIntent=PendingIntent.getActivity(this,0,intent,0);
Notification還可以添加各種屬性:
builder.setSmallIcon(R.drawable.ic_launcher);
builder.setContentIntent(pendingIntent);
builder.setAutoCancel(true);
builder.setContentTitle("test");
.....
Android系統(tǒng)通過NotificationManager系統(tǒng)服務(wù)來幫助我們管理Notification:
//調(diào)用notify方法時(shí)需傳入一個(gè)ID翘盖,用來區(qū)分不同的App的Notificaiton。
NotificationManager nM=(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
nM.notify(NOTIFICATION_ID_BASIC),builder.build());
- 折疊式Notification
折疊式Notification也是一種自定義視圖的Notification凹蜂,常用于顯示長(zhǎng)文本馍驯。它擁有兩個(gè)視圖,一個(gè)是普通狀態(tài)下的視圖狀態(tài)炊甲,另一個(gè)是展開狀態(tài)下的視圖狀態(tài)泥彤。需要RemoteViews來幫助創(chuàng)建一個(gè)自定義Notification。
//正常狀態(tài)視圖
notification.contentView=contentView;
//展開狀態(tài)視圖
notificaiton.bigContentView=expandedView;
懸掛式Notification
懸掛式Notification是Android5.0新增加的方式卿啡,可以在屏幕上方產(chǎn)生Notification切不會(huì)打斷用戶從操作吟吝,主要通過setFullScreenIntent,可以很輕松地將一個(gè)Notification變成一個(gè)懸掛式Notification颈娜。-
顯示等級(jí)的Notification
分為3個(gè)等級(jí):- VISIBILITY_PRIVATE:表明只有當(dāng)沒有鎖屏的時(shí)候會(huì)顯示剑逃。
- VISIBILITY_PUBLIC:表明在任何情況下都會(huì)顯示。
- VISIBILITY_SECRET:表明在pin官辽、password等安全鎖和沒有鎖屏的情況下才能夠顯示蛹磺。
代碼中具體通過builder的setVisibility()