《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文件

<?xml version="1.0" encoding="utf-8"?>
< ripple
xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@android:color/holo_blue_dark">
<item> // 这个item中包含你的drawable资源即可<shapeandroid:shape="oval"><solid android:color="@android:color/holo_orange_dark" /></shape>
</item>
< /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"></item> // 如果不要这个行, 则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中:

<?xml version="1.0" encoding="utf-8"?>
< selector xmlns:android="http://schemas.android.com/apk/res/android">
<item  android:state_enabled="true"  android:state_pressed="true">  <set android:ordering="together">  <objectAnimator  android:duration="@android:integer/config_shortAnimTime"  android:propertyName="scaleX"  android:valueTo="0.99"  android:valueType="floatType" />  <objectAnimator  android:duration="@android:integer/config_shortAnimTime"  android:propertyName="scaleY"  android:valueTo="0.99"  android:valueType="floatType" />  </set>
</item>
<item>  <set android:ordering="together">  <objectAnimator  android:duration="@android:integer/config_shortAnimTime"  android:propertyName="scaleX"  android:valueTo="1.01"  android:valueType="floatType" />  <objectAnimator  android:duration="@android:integer/config_shortAnimTime"  android:propertyName="scaleY"  android:valueTo="1.01"  android:valueType="floatType" />  </set>
</item>
< /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 xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity" ><itemandroid:id="@+id/ab_search"android:orderInCategory="80"android:title="action_search"app:actionViewClass="android.support.v7.widget.SearchView"app:showAsAction="ifRoom"/>
<itemandroid:id="@+id/action_share"android:orderInCategory="90"android:title="action_share"app:actionProviderClass="android.support.v7.widget.ShareActionProvider"app:showAsAction="ifRoom"/>
<itemandroid:id="@+id/action_settings"android:orderInCategory="100"android:title="action_settings"app:showAsAction="never"/>< /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:<?xml version="1.0" encoding="utf-8"?>< 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"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/textView"android:textColor="#ff43aebe"android:gravity="center" /><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/imageView"android:src="@drawable/robot" />< /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"><RelativeLayoutandroid:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="I am now expanded"android:textColor="#ff43aebe"android:layout_gravity="center_vertical"android:layout_alignParentTop="false"android:layout_alignParentLeft="true"android:layout_toLeftOf="@+id/imageView"android:gravity="center"android:layout_centerVertical="true" /><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/robot_expanded"android:layout_gravity="right|top"android:layout_alignParentTop="true"android:layout_alignParentRight="true"android:id="@+id/imageView" />
</RelativeLayout>< /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();

增加了设置Notification的category接口,category用来确定Notification显示的位置,参数就是各种category的类型
builer.setCategory(Notification.CATEGORY_MESSAGE);

《Android群英传》读书笔记---10.2(终篇)相关推荐

  1. android 群英传笔记,Android 群英传读书笔记1

    Android中每个控件都会在界面上占据一块矩形的区域,在Android中控件被分为两种,①VIew ②ViewGroup  ViewGroup可以包含多个View 或者Viewgroup 这样在界面 ...

  2. Android群英传读书笔记——第十二章:Android 5.X新特性详解

    第十二章目录 12.1 Android5.X UI设计初步 12.1.1 材料的形态模拟 12.1.2 更加真实的动画 12.1.3 大色块的使用 12.2 Material Design主题 12. ...

  3. Android群英传读书笔记——Android开发工具

    2.1  Android Studio配置 2.1.1  配置JDK (1)系统变量→新建 JAVA_HOME 变量 . 变量值填写jdk的安装目录(本人是 E:\Java\jdk1.7.0) (2) ...

  4. Android群英传读书笔记-2D绘图基础

    系统通过 Canvas 为我们提供了一些基础的绘图 API : canvas.drawPoint(float x, float y, @NonNull Paint paint); 作用:绘制点. 参数 ...

  5. 《Android群英传》---读书笔记4

    <Android群英传>-读书笔记4 标签: android中级 读书笔记 Android绘图机制与处理技巧 Android屏幕相关知识 略 2D绘图基础 系统通过提供的Canvans对象 ...

  6. Android群英传神兵利器读书笔记——第三章:Android Studio奇技淫巧

    Android群英传神兵利器读书笔记--第三章:Android Studio奇技淫巧 这篇文章篇幅较长,可以使用版权声明下面的目录,找到感兴趣的进行阅读 目录 3.1 Android Studio使用 ...

  7. Android群英传神兵利器读书笔记——第一章:程序员小窝——搭建高效的开发环境

    Android群英传神兵利器读书笔记--第一章:程序员小窝--搭建高效的开发环境 目录 1.1 搭建高效的开发环境之操作系统 1.2 搭建开发环境之高效配置 基本环境配置 基本开发工具 1.3 搭建程 ...

  8. 《Android群英传 神兵利器》读书笔记

    <Android群英传 神兵利器> - Android开发的工具使用 这是一本Android开发的工具书,里面的提到的工具基本上是每个Android开发者必备的技能,买这本书的起因是看到有 ...

  9. 《Android群英传》---读书笔记6

    <Android群英传>-读书笔记6 标签: android中级 读书笔记 Android 5.X SVG矢量动画机制 SVG:课可伸缩矢量图形:使用XML格式定义图形:图像在放大或改变尺 ...

最新文章

  1. mysql常见增量恢复方式_MySQL 全备份与增量备份 全恢复与增量恢复
  2. 什么是好的图神经网络?
  3. linux下安装nginx、python、django
  4. gitosis使用笔记
  5. 取消管理员取得所有权_win7管理员取得所有权批处理 - 卡饭网
  6. 数据挖掘之离群点检测
  7. (三)用docker-compose部署postgres+ postgis
  8. 合集| 21 篇技术文章,带你从零入门 K8s
  9. mysql环境搭载后老出错_使用Docker在window10下搭建SWOFT开发环境,mysql连接错误
  10. mysql从myisam_将MySQL从MyISAM转换成InnoDB错误和解决办法
  11. mysql5.7.1.16出现[Err] 1146 - Table 'performance_schema.session_status' doesn't exist的解决办法
  12. java服务端集成极光消息推送--详细开发步骤
  13. Mac系统中桌面图片和用户头像图片的路径
  14. 海外仓ERP系统功能怎么样?
  15. ffmpeg-0.6.3开源编码解码库,从linux下移植到windows vs2005,全部开源。
  16. bvp解算器是什么_几种飞控的姿态解算算法
  17. android 存储空间监控,浅谈 Android 内存监控(中)
  18. c语言基础知识孙小红,基于J2EE的C语言在线学习系统的设计与实现
  19. 年薪百万是社会认同,更是自身价值体现
  20. C++ Gotchas: Avoiding Common Problems in Coding and Design

热门文章

  1. 自然语言处理在eBay的技术实践
  2. 性能优化:Android App启动速度优化
  3. 香港主机托管:什么是主机服务器托管?
  4. RT-Thread—STM32—enc28j60
  5. 一文读懂 IVD 体外诊断试剂产品和未来发展
  6. java操作XMLType的几种方法
  7. C语言面试题大汇总之华为面试题 Eddy整理
  8. 解决dns被污染的问题
  9. 谷歌 不支持 activeX插件
  10. SQL Server插入或修改数据是中文乱码的问题