《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高...
第十一章 搭建云端服務器
該章主要介紹了移動后端服務的概念以及Bmob的使用,比較簡單,所以略過不總結。
第十三章 Android實例提高
該章主要介紹了拼圖游戲和2048的小項目實例,主要是代碼,所以略過不總結。
第十二章 Android 5.X新特性詳解
1.Material Design
(1)MD主題:“擬物扁平化”
| @android:style/Theme.Material @android:style/Theme.Material.Light @android:style/Theme.Material.Light.DarkActionBar |
?
(2)Color Palette 和 Palette
Color Palette顏色主題,可以通過自定義style的方式自定義顏色風格,對應的name值如下面左圖所示
| <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style> |
?
使用Palette來提取顏色,從而讓主題能夠動態適應當前頁面的色調,做到整個app顏色基調和諧統一,使用的時候要引入依賴com.android.ssupport:palette-v7:x.y.z引用。提取顏色的種類:Vibrant(充滿活力的),Vibrant dark, Vibrant light, Muted(柔和的), Muted dark, Muted light。
| Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test); // 創建Palette對象 Palette.generateAsync(bitmap, new Palette.PaletteAsyncListener() { @Override public void onGenerated(Palette palette) { // 通過Palette來獲取對應的色調 //getDarkMutedSwatch,getDarkVibrantSwatch,getLightVibrantSwatch,getMutedSwatch Palette.Swatch vibrant = palette.getDarkVibrantSwatch(); // 將顏色設置給相應的組件 getActionBar().setBackgroundDrawable(new ColorDrawable(vibrant.getRgb())); getWindow().setStatusBarColor(vibrant.getRgb()); } }); |
?
顯示效果如下面右圖所示
?
(3)陰影效果
View增加了Z屬性,對應垂直方向上的高度變化,Z由elevation和translationZ兩部分組成(Z=elevation+translationZ),它們都是5.X引入的新屬性。elevation是靜態的成員,translationZ可以在代碼中用來實現動畫效果。
布局屬性:android:elevation="xxxdp"
(4)Tinting(著色)和Clipping(裁剪)
tinting的使用就是配置tint和tintMode就可以了,tint通過修改圖像的alpha遮罩來修改圖像的顏色,從而達到重新著色的目的。
clipping可以改變一個view的外形,要使用它,首先需要使用ViewOutlineProvider來修改outline,然后再通過setOutlineProvider將outline作用給view。
(5)列表和卡片
RecyclerView和CardView是support-v7包中新添加的組件,使用它們需要引用依賴com.android.support:recyclerview-v7:x.y.z和com.android.support:cardview-v7:x.y.z。
RecyclerView也具有ListView一樣的item復用機制,還可以直接把ViewHolder的實現封裝起來,開發者只要是實現ViewHolder就行了,RecyclerView會自動回收復用每一個item。RecyclerView還引入了LayoutManager來幫助開發者方便地創建不同的布局,例如LinearLayoutManager、GridLayoutManager等,此外,為RecyclerView編寫Adapter的代碼也更加方便了。
| public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> { private List<String> mData; public RecyclerAdapter(List<String> data) { mData = data; } public OnItemClickListener itemClickListener; public void setOnItemClickListener(OnItemClickListener itemClickListener) { this.itemClickListener = itemClickListener; } public interface OnItemClickListener { void onItemClick(View view, int position); } public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { public TextView textView; public ViewHolder(View itemView) { super(itemView); textView = (TextView) itemView; textView.setOnClickListener(this); } // 通過接口回調來實現RecyclerView的點擊事件 @Override public void onClick(View v) { if (itemClickListener != null) { itemClickListener.onItemClick(v, getPosition()); } } } @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { // 將布局轉化為View并傳遞給RecyclerView封裝好的ViewHolder View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.rc_item, viewGroup, false); return new ViewHolder(v); } @Override public void onBindViewHolder(ViewHolder viewHolder, int i) { // 建立起ViewHolder中視圖與數據的關聯 viewHolder.textView.setText(mData.get(i)); } @Override public int getItemCount() { return mData.size(); } } |
?
CardView也是一種容器內布局,只是它提供了卡片樣的形式。在XML布局文件中使用CardView的時候還需要引入其命名空間xmlns:cardview=http://schemas.android.com/apk/res-auto。
(6)Activity過渡動畫
以前Activity過渡動畫是通過overridePendingTransition(int inAnim, int outAnim)來實現的,效果差強人意。
現在Android 5.X提供了三種Transition類型:
進入和退出動畫:兩者又包括了explode(分解)、slide(滑動)和fade(淡出)三種效果;
使用方式:假設Activity從A跳轉到B,那么將A中原來的startActivity改為如下代碼:
| startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle()); |
?
然后在B的onCreate方法中添加如下代碼:
| //首先聲明需要開啟Activity過渡動畫 getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS); //然后設置當前Activity的進入和退出動畫 getWindow().setEnterTransition(new Fade()); getWindow().setExitTransition(new Fade()); |
?
共享元素過渡動畫:一個共享元素過渡動畫決定兩個Activity之間的過渡怎么共享它們的視圖,包括了
changeBounds:改變目標視圖的布局邊界;
changeClipBounds:裁剪目標視圖的邊界;
changeTransform:改變目標視圖的縮放比例和旋轉角度;
changeImageTransform:改變目標圖片的大小和縮放比例。
使用方式:假設Activity從A跳轉到B,那么將A中原來的startActivity改為如下代碼:
| //單個共享元素的調用方式 startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this, view, "share").toBundle()); //多個共享元素的調用方式 startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this, Pair.create(view, "share"), Pair.create(fab, "fab")).toBundle()); |
?
然后在B的onCreate方法中添加如下代碼:
| //聲明需要開啟Activity過渡動畫 getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS); |
?
其次還要在Activity A和B的布局文件中為共享元素組件添加android:transitionName="xxx"屬性。
(7)MD動畫效果
Ripple效果
水波紋效果有兩種:波紋有邊界和波紋無邊界。前者是指波紋被限制在控件的邊界,后者指波紋不會限制在控件邊界中,會呈圓形發放出去。
除了使用xml文件自定義ripple效果之外,還可以通過下面的代碼來快速實現ripple效果
| //波紋有邊界 android:background="?android:attr/selectableItemBackground" //波紋無邊界 android:background="?android:attr/selectableItemBackgroundBorderless" |
?
Circular Reveal效果
圓形顯現效果:通過ViewAnimationUtils.createCircularReveal方法可以創建一個RevealAnimator動畫,代碼如下,其中centerX/centerY表示動畫開始的位置,startRadius和endRadius分別表示動畫的起始半徑和結束半徑。
| public static Animator createCircularReveal(View view, int centerX, int centerY, float startRadius, float endRadius) { return new RevealAnimator(view, centerX, centerY, startRadius, endRadius); } |
?
下面是一個例子,該例子會呈現出圖片從一個點以圓形的方式放大到圖片大小的動畫效果:
| final ImageView imageView = (ImageView) findViewById(R.id.imageview); imageView.setOnClickListener(new View.OnClickListener() { @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override public void onClick(View v) { Animator animator = ViewAnimationUtils.createCircularReveal(imageView, imageView.getWidth() / 2, imageView.getHeight() / 2, 0, imageView.getWidth()); animator.setDuration(2000); animator.setInterpolator(new AccelerateDecelerateInterpolator()); animator.start(); } }); |
?
view的狀態切換動畫
在Android 5.X中,可以使用動畫來作為視圖改變的效果,有兩種方式來實現該動畫:StateListAnimator和animated-selector。
StateListAnimator是將動畫效果(objectAnimator)配置到原來的selector的item中來實現的,看下面的例子:
| //定義StateListAnimator <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_checked="true"> <set> <objectAnimator android:propertyName="rotationX" android:duration="@android:integer/config_shortAnimTime" android:valueTo="360" android:valueType="floatType"/> </set> </item> <item android:state_checked="false"> <set> <objectAnimator android:propertyName="rotationX" android:duration="@android:integer/config_shortAnimTime" android:valueTo="0" android:valueType="floatType"/> </set> </item> </selector> //將StateListAnimator設置給checkbox <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="state list animator" android:stateListAnimator="@drawable/anim_change"/> |
?
animated-selector是一個狀態改變的動畫效果selector,MD中很多控件設計用到了animated-selector,例如check-box,下面便是一個類似check-box效果的例子:
| <animated-selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/state_on" android:state_checked="true"> <bitmap android:src="@drawable/ic_done_anim_030" /> </item> <item android:id="@+id/state_off"> <bitmap android:src="@drawable/ic_plus_anim_030" /> </item> <transition android:fromId="@+id/state_on" android:toId="@+id/state_off"> <animation-list> <item android:duration="16"> <bitmap android:src="@drawable/ic_plus_anim_000" /> </item> ... <item android:duration="16"> <bitmap android:src="@drawable/ic_plus_anim_030" /> </item> </animation-list> </transition> <transition android:fromId="@+id/state_off" android:toId="@+id/state_on"> <animation-list> <item android:duration="16"> <bitmap android:src="@drawable/ic_done_anim_000" /> </item> ... <item android:duration="16"> <bitmap android:src="@drawable/ic_done_anim_030" /> </item> </animation-list> </transition> </animated-selector> |
?
(8)Toolbar
Toolbar和ActionBar以前灰常詳細地介紹過,此處略過不總結,點擊這里查看。
(9)Notification
Android 5.x改進了通知欄,優化了Notification,現在共有三種類型的Notification:
基本Notification:最基本的通知,只有icon,text,時間等信息
折疊式Notification:可以折疊的通知,有兩種顯示狀態:一種普通狀態,另一種是展開狀態
懸掛式Notification:在屏幕上方顯示通知,且不會打斷用戶操作
三種類型的notification的使用如下所示:
| public void basicNotify(View view) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.baidu.com")); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0); Notification.Builder builder = new Notification.Builder(this); builder.setSmallIcon(R.drawable.ic_launcher);// 設置Notification的各種屬性 builder.setContentIntent(pendingIntent); builder.setAutoCancel(true); builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher)); builder.setContentTitle("Basic Notifications"); builder.setContentText("I am a basic notification"); builder.setSubText("it is really basic"); // 通過NotificationManager來發出Notification NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); notificationManager.notify(NOTIFICATION_ID_BASIC, builder.build()); } public void collapsedNotify(View view) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.sina.com")); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0); Notification.Builder builder = new Notification.Builder(this); builder.setSmallIcon(R.drawable.ic_launcher); builder.setContentIntent(pendingIntent); builder.setAutoCancel(true); builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher)); // 通過RemoteViews來創建自定義的Notification視圖 RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.notification); contentView.setTextViewText(R.id.textView, "show me when collapsed"); Notification notification = builder.build(); notification.contentView = contentView; // 通過RemoteViews來創建自定義的Notification視圖 RemoteViews expandedView = new RemoteViews(getPackageName(), R.layout.notification_expanded); notification.bigContentView = expandedView; NotificationManager nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); nm.notify(NOTIFICATION_ID_COLLAPSE, notification); } public void headsupNotify(View view) { Notification.Builder builder = new Notification.Builder(this) .setSmallIcon(R.drawable.ic_launcher) .setPriority(Notification.PRIORITY_DEFAULT) .setCategory(Notification.CATEGORY_MESSAGE) .setContentTitle("Headsup Notification") .setContentText("I am a Headsup notification."); Intent push = new Intent(); push.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); push.setClass(this, MainActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, push, PendingIntent.FLAG_CANCEL_CURRENT); builder.setContentText("Heads-Up Notification on Android 5.0").setFullScreenIntent(pendingIntent, true); NotificationManager nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); nm.notify(NOTIFICATION_ID_HEADSUP, builder.build()); } |
?
顯示效果如下:
??
通知的顯示等級
Android 5.x將通知分為了三個等級:
VISIBILITY_PRIVATE:表明只有當沒有鎖屏的時候才會顯示;
VISIBILITY_PUBLIC:表明任何情況下都會顯示;
VISIBILITY_SECRET:表明在pin、password等安全鎖和沒有鎖屏的情況下才會顯示;
設置等級的方式是builder.setVisibility(Notification.VISIBILITY_PRIVATE);
OK,本節結束,謝謝閱讀。
轉載于:https://www.cnblogs.com/dongweiq/p/5029103.html
總結
以上是生活随笔為你收集整理的《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OC Foundation框架—字符串
- 下一篇: UIApplication,UIWind