android中级|《Android群英传》读书笔记---10.2(终篇)

《Android群英传》读书笔记—10.2 标签(): android中级 读书笔记
Activity过渡动画 曾经的 Android在Activity之间进行跳转的时候,只是非常生硬的切换,即使通过overridePendingtransition(int inId,int outId)这个方法来给Activity增加一些切换动画,效果也不太好。在Android 5.X中,为转场效果增加了丰富的的动画效果
Android 5.X提供了三种Transition类型
进入
退出
共享元素:一个共享元素过渡动画决定两个Activity之间的过渡,怎么共享它们的视图
其中,进入和退出效果包括:
explode(分解)—从屏幕中间进或者出,移动视图
slide(滑动)—从屏幕边缘进或者出,移动视图
fade(淡出)—通过改变屏幕上视图的不透明度达到添加或者移除视图
共享元素包括:
changeBounds—改变目标视图的布局边界
changeClipBounds—-裁剪目标视图边界
changeTransform—改变目标视图的缩放比例和旋转角度
changeImageTransform—改变目标图片的大小和缩放比例
进入和退出动画的使用方法: 1将ActivityA中将startActivity(intent)方法改为:startActiviy(intent,AcitivityOptions.makeSceneTransitionAnimation(this).toBundle());
2在ActivityB中设置:getWindow().requesetFeature(Window.FEATURE_CONTENT_TRANSITIONS); 或者在样式文件中设置< item name=”android.windowContentTransitions”>true< /item>
3 接下来设置进入ActivityB的具体动画效果
getWindow.setEnterTransition(new Expolde());
getWindow.setEnterTransition(new Slide());
getWindow.setEnterTransition(new Fade());
或者通过以下代码设置离开ActiviyB的动画效果
getWindow.setExitTransition(new Explode());
getWindow.setExitTransition(new Slide());
getWindow.setExitTransition(new Fade());
使用共享元素动画 1 在Activity1的布局文件中给共享元素增加属性
android:transitionName=”XXX”
2同时在Activity2的布局文件中,给要实现共享效果的元素也增加同样的属性
android:transitionName=”XXX”
注意:一定要保证命名相同,这样系统才能找到共享元素
3在Activity1使用如下代码:
startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this,view,”share”).toBundle());
使用的参数就是在前面普通动画的基础上增加了共享的View的前面取的名字
(如果有多个共享的元素,可以通过Pair.create()来创建多个共享元素:
startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this,Pair.create(view,”share”),Pair.create(fab,”fab”)).toBundle());

12.8 Material Design动画效果
12.8.1 Ripple效果 即点击后的波纹效果
可以通过以下代码设置波纹背景
//波纹有边界:
android:background=”?android:attr/selectableItemBackground”
//波纹无边界
android:background=”?android:attr/selectableItemBackgroundBorderless”
同样也可以在XML文件中直接创建一个具有Ripple效果的XML文件

< ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="@android:color/holo_blue_dark"> // 这个item中包含你的drawable资源即可 < /ripple>

或者
< ?xml version="1.0" encoding="utf-8"?> < ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="#ffff0000"> < item android:drawable="@color/blue"> // 如果不要这个行, 则ripple效果溢出 < /ripple>

12.8.2 Circular Reveal 效果表现为一个View以圆形的形式展开,揭示出来
通过ViewAnimationUtils.createCircularReveal()方法可以创建一个RevealAnimator动画
12.8.3 View state changes Animation 在5.X 中,系统提供了视图状态改变来设置一个视图状态切换动画
StateListAnimator StateListAnimator作为视图改变时的动画效果,通常会使用Selector来进行设置,在以前设置Selector的时候,通常是修改背景来达到反馈的效果。现在,在5.X中,可以使用动画来作为视图改变的效果
在XML中定义一个StateListAnimator,并添加到Selector中:
< selector xmlns:android="http://schemas.android.com/apk/res/android"> < /selector>

在一般的XML布局中,使用anroid:stateListAnimator属性来增加动画反馈效果
< Button android:layout_width="0dp" android:layout_height="wrap_content" android:background="#ff0000" android:stateListAnimator="@anim/btn_selector_animator" android:text="运动" android:textColor="#ffffff" android:textSize="32sp" />

同样在代码中也可以调用AnimationInflater.loadStateListAnimator()方法,并且通过View.setStateListAnimator()方法分配动画到视图上
####animated-selector
animated-selector同样是一个状态改变的动画效果Selector
###12.9 Toolbar
Toolbar与Actionbar最大的区别就是Toolbar更加自由,可控。要使用Toolbar必须引入appcompat-v7支持,并设置主题为NoActionBar
在代码中可以通过以下代码添加Toolbar显示的标题和图标
mToolbar = (Toolbar) findViewById(R.id.toolbar); mToolbar.setLogo(R.drawable.ic_launcher); // 标题的文字需在setSupportActionBar之前,不然会无效 mToolbar.setTitle("主标题"); mToolbar.setSubtitle("副标题");

菜单配置与Actionbar基本类似
< /menu>

通过setSupportActionBar()方法,可以用Toolbar模拟出Actionbar的效果
setSupportActionBar(mToolbar);

###12.10 Notification
在5.X中,当长按Notification的时候,会显示消息的来源
同时,在5.X 设备上,锁屏状态下我们也可以看见Notification通知了
####基本的Notification
1 通过调用Notification.Builder创建一个Notification的builder:
Notification.Builder builder=new Notification.Builder(this);

2 使用builder对象增加各种属性:
builder.setSmallIcon();
builder.setContentIntent(pendingIntent);
builder.setAutoCancel(true);
builder.setLargeIcon();
builder.setContentTitle();
builder.setContentText();
builder.setSubText();
3通过NotificationManager系统服务来帮助我们管理Notification,并且调用notify方法来发出Notification
NotificationManager notificationManager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE); notificationManager.notify(ID,builder.build());

此外Notification还可以配置LED和震动选项
折叠式Notification 折叠式Notification也是一种自定义视图的Notification,常常用于显示长文本。它拥有两个视图,一个是普通状态下的视图,一个是展开状态下的视图。在Notification中,使用RemoteViews来帮助我们创建一个自定义的Notification,
RemoteViews contentView=new RemoteViews(getPackageName(),R.layout.notification); contentView.setTextViewText(R.id.textView,"show me when collapased");

通过以下代码,可以将一个视图指定为Notification正常状态下的视图
notification.contentView=contentView;

指定为展开时的视图
notification.bigContentView=expandedView

完整代码如下
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);

其中Notification的布局文件如下:
###notification.xml:< LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_horizontal">< /LinearLayout>###notification_expanded.xml:< ?xml version="1.0" encoding="utf-8"?>< LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="right|top"> < /LinearLayout>

####12.10.3 悬挂式Notification
可以在屏幕上方产生Notification且不会打断用户的操作,
代码示例:
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());

通过setFullScreenIntent,可以很轻松的将一个Notification变成悬挂式
12.10.4 显示等级的Notification Android 5.X将Notification分成三个等级
VISIBILITY_PRIVATE—表明只有当没有锁屏的时候会显示
VISIBILITY_PUBLIC—表明在任何情况下都会显示
VISIBILITY_SECRET—表明在pin,password等安全锁和没有锁屏情况下才能够显示
设置Notification的等级非常简单,借用builder对象即可
builder.setVisibility(Notification.VISIBILITY_PUBLIC);
这就是大多数Android 5.X的Notification的大部分改进
此外,5.X还增加了其他改动,例如:
增加了设置Notification背景颜色的接口:
builder.setColor();
【android中级|《Android群英传》读书笔记---10.2(终篇)】增加了设置Notification的category接口,category用来确定Notification显示的位置,参数就是各种category的类型
builer.setCategory(Notification.CATEGORY_MESSAGE);

    推荐阅读