日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高...

發(fā)布時(shí)間:2024/8/26 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

第十一章 搭建云端服務(wù)器

該章主要介紹了移動(dòng)后端服務(wù)的概念以及Bmob的使用,比較簡單,所以略過不總結(jié)。

第十三章 Android實(shí)例提高

該章主要介紹了拼圖游戲和2048的小項(xiàng)目實(shí)例,主要是代碼,所以略過不總結(jié)。

第十二章 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的方式自定義顏色風(fēng)格,對(duì)應(yīng)的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來提取顏色,從而讓主題能夠動(dòng)態(tài)適應(yīng)當(dāng)前頁面的色調(diào),做到整個(gè)app顏色基調(diào)和諧統(tǒng)一,使用的時(shí)候要引入依賴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);
// 創(chuàng)建Palette對(duì)象
Palette.generateAsync(bitmap,
new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(Palette palette) {
// 通過Palette來獲取對(duì)應(yīng)的色調(diào) //getDarkMutedSwatch,getDarkVibrantSwatch,getLightVibrantSwatch,getMutedSwatch
Palette.Swatch vibrant = palette.getDarkVibrantSwatch();
// 將顏色設(shè)置給相應(yīng)的組件
getActionBar().setBackgroundDrawable(new ColorDrawable(vibrant.getRgb()));
getWindow().setStatusBarColor(vibrant.getRgb());
}
});

?

顯示效果如下面右圖所示
?

(3)陰影效果
View增加了Z屬性,對(duì)應(yīng)垂直方向上的高度變化,Z由elevation和translationZ兩部分組成(Z=elevation+translationZ),它們都是5.X引入的新屬性。elevation是靜態(tài)的成員,translationZ可以在代碼中用來實(shí)現(xiàn)動(dòng)畫效果。
布局屬性:android:elevation="xxxdp"

(4)Tinting(著色)和Clipping(裁剪)
tinting的使用就是配置tint和tintMode就可以了,tint通過修改圖像的alpha遮罩來修改圖像的顏色,從而達(dá)到重新著色的目的。
clipping可以改變一個(gè)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復(fù)用機(jī)制,還可以直接把ViewHolder的實(shí)現(xiàn)封裝起來,開發(fā)者只要是實(shí)現(xiàn)ViewHolder就行了,RecyclerView會(huì)自動(dòng)回收復(fù)用每一個(gè)item。RecyclerView還引入了LayoutManager來幫助開發(fā)者方便地創(chuàng)建不同的布局,例如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);
}

// 通過接口回調(diào)來實(shí)現(xiàn)RecyclerView的點(diǎn)擊事件
@Override
public void onClick(View v) {
if (itemClickListener != null) {
itemClickListener.onItemClick(v, getPosition());
}
}
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
// 將布局轉(zhuǎn)化為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中視圖與數(shù)據(jù)的關(guān)聯(lián)
viewHolder.textView.setText(mData.get(i));
}

@Override
public int getItemCount() {
return mData.size();
}
}

?

CardView也是一種容器內(nèi)布局,只是它提供了卡片樣的形式。在XML布局文件中使用CardView的時(shí)候還需要引入其命名空間xmlns:cardview=http://schemas.android.com/apk/res-auto。

(6)Activity過渡動(dòng)畫
以前Activity過渡動(dòng)畫是通過overridePendingTransition(int inAnim, int outAnim)來實(shí)現(xiàn)的,效果差強(qiáng)人意。
現(xiàn)在Android 5.X提供了三種Transition類型:
進(jìn)入和退出動(dòng)畫:兩者又包括了explode(分解)、slide(滑動(dòng))和fade(淡出)三種效果;
使用方式:假設(shè)Activity從A跳轉(zhuǎn)到B,那么將A中原來的startActivity改為如下代碼:

startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle());

?

然后在B的onCreate方法中添加如下代碼:

//首先聲明需要開啟Activity過渡動(dòng)畫
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
//然后設(shè)置當(dāng)前Activity的進(jìn)入和退出動(dòng)畫
getWindow().setEnterTransition(new Fade());
getWindow().setExitTransition(new Fade());

?

共享元素過渡動(dòng)畫:一個(gè)共享元素過渡動(dòng)畫決定兩個(gè)Activity之間的過渡怎么共享它們的視圖,包括了
changeBounds:改變目標(biāo)視圖的布局邊界;
changeClipBounds:裁剪目標(biāo)視圖的邊界;
changeTransform:改變目標(biāo)視圖的縮放比例和旋轉(zhuǎn)角度;
changeImageTransform:改變目標(biāo)圖片的大小和縮放比例。
使用方式:假設(shè)Activity從A跳轉(zhuǎn)到B,那么將A中原來的startActivity改為如下代碼:

//單個(gè)共享元素的調(diào)用方式
startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this, view, "share").toBundle());
//多個(gè)共享元素的調(diào)用方式
startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this,
Pair.create(view, "share"),
Pair.create(fab, "fab")).toBundle());

?

然后在B的onCreate方法中添加如下代碼:

//聲明需要開啟Activity過渡動(dòng)畫
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);

?

其次還要在Activity A和B的布局文件中為共享元素組件添加android:transitionName="xxx"屬性。

(7)MD動(dòng)畫效果
Ripple效果
水波紋效果有兩種:波紋有邊界和波紋無邊界。前者是指波紋被限制在控件的邊界,后者指波紋不會(huì)限制在控件邊界中,會(huì)呈圓形發(fā)放出去。
除了使用xml文件自定義ripple效果之外,還可以通過下面的代碼來快速實(shí)現(xiàn)ripple效果

//波紋有邊界
android:background="?android:attr/selectableItemBackground"
//波紋無邊界
android:background="?android:attr/selectableItemBackgroundBorderless"

?

Circular Reveal效果
圓形顯現(xiàn)效果:通過ViewAnimationUtils.createCircularReveal方法可以創(chuàng)建一個(gè)RevealAnimator動(dòng)畫,代碼如下,其中centerX/centerY表示動(dòng)畫開始的位置,startRadius和endRadius分別表示動(dòng)畫的起始半徑和結(jié)束半徑。

public static Animator createCircularReveal(View view,
int centerX, int centerY, float startRadius, float endRadius) {
return new RevealAnimator(view, centerX, centerY, startRadius, endRadius);
}

?

下面是一個(gè)例子,該例子會(huì)呈現(xiàn)出圖片從一個(gè)點(diǎn)以圓形的方式放大到圖片大小的動(dòng)畫效果:

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的狀態(tài)切換動(dòng)畫
在Android 5.X中,可以使用動(dòng)畫來作為視圖改變的效果,有兩種方式來實(shí)現(xiàn)該動(dòng)畫:StateListAnimator和animated-selector。
StateListAnimator是將動(dòng)畫效果(objectAnimator)配置到原來的selector的item中來實(shí)現(xiàn)的,看下面的例子:

//定義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設(shè)置給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是一個(gè)狀態(tài)改變的動(dòng)畫效果selector,MD中很多控件設(shè)計(jì)用到了animated-selector,例如check-box,下面便是一個(gè)類似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以前灰常詳細(xì)地介紹過,此處略過不總結(jié),點(diǎn)擊這里查看。

(9)Notification
Android 5.x改進(jìn)了通知欄,優(yōu)化了Notification,現(xiàn)在共有三種類型的Notification:
基本Notification:最基本的通知,只有icon,text,時(shí)間等信息
折疊式Notification:可以折疊的通知,有兩種顯示狀態(tài):一種普通狀態(tài),另一種是展開狀態(tài)
懸掛式Notification:在屏幕上方顯示通知,且不會(huì)打斷用戶操作

三種類型的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);// 設(shè)置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來發(fā)出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來創(chuàng)建自定義的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來創(chuàng)建自定義的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());
}

?

顯示效果如下:

??

通知的顯示等級(jí)
Android 5.x將通知分為了三個(gè)等級(jí):
VISIBILITY_PRIVATE:表明只有當(dāng)沒有鎖屏的時(shí)候才會(huì)顯示;
VISIBILITY_PUBLIC:表明任何情況下都會(huì)顯示;
VISIBILITY_SECRET:表明在pin、password等安全鎖和沒有鎖屏的情況下才會(huì)顯示;
設(shè)置等級(jí)的方式是builder.setVisibility(Notification.VISIBILITY_PRIVATE);

OK,本節(jié)結(jié)束,謝謝閱讀。

轉(zhuǎn)載于:https://www.cnblogs.com/dongweiq/p/5029103.html

總結(jié)

以上是生活随笔為你收集整理的《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。