Android 5.0新特性
一、用户体验方面:
首先,在感官界面设计上,我们彻底迎来了Android系统的扁平化时代,新的系统不仅使用了新的配色,此外,谷歌全面改善了原来乏味的通知中心,让原生系统也拥有了像第三方插件那样强大的功能。另外,多任务系统也加入了更多的卡片式风格,同时还有大量的其它新特性,包括64位编译器(ART模式)和增强电池续航能力。
1、Material Design (发音: [mə'tɪrɪəl] [dɪ'zaɪn])
Material Design翻译过来就是材料设计,是google对于android设备显示界面的主要更新,也可以说是一种新的设计语言。它使android UI更加扁平化,同时, Android L的界面会拥有类似物理表面和边缘的视觉效果——这一切很大程度上得益于Android L动态阴影的加入以及动画的加强。
2、全新的通知中心设计
谷歌在Android Lollipop中加入了全新风格的通知系统。改进后的通知系统会优先显示对用户来说比较重要的信息,而将不太紧急的内容隐藏起来。用户只需要向下滑动就可以查看全部的通知内容。
新的通知系统另外一个很酷的新功能是在锁屏界面也可以直接查看通知消息了。不仅如此,用户还可以直接在锁屏的情况下就行回复或进入应用。另外,如果在操作手机的过程中有电话进入,也不会进行全画面切换,而是同样以弹出通知的方式告知用户。
3、支持64位ART虚拟机
Android Runtime简称ART,我们在android4.4的时候就有ART模式,但是国内大部分厂商都把这一模式给“阉割”了,依然使用的是Dalvik虚拟机。但是到了android L之后,我们的android系统默认的就是ART模式,它和Dalvik虚拟机的的区别:
Dalvik虚拟机是要依靠一个编译器来实现与应用程序的沟通。应程序每次运行时,都需要将程序内的代码即使转变为机器码才能运行,这无形中多附加了一道手续,这就造成了耗电相对较快、占用内存大、即使是旗舰机用久了也会卡顿严重的现象。
相比较而言ART模式就很好的解决了这个问题,通过在安装应用程序时,自动对程序进行代码预读取编译,让程序直接编译成机器语言,免去了Dalvik模式要时时转换代码,实现高效率、省电、占用更低的系统内存、手机运行流畅。但凡事总有正反两面,ART在解决了该问题的同时,同时也有如:会占用略高一些的存储空间、安装程序时要相比普通Dalvik模式要长一些时间来实现预编译。
ART处理应用程序执行的方式完全不同于Dalvik,运行起来更有效率、耗电更少、占的内存也更低。
对64位处理器的支持也让ART虚拟机如鱼得水,开发者可以针对64位架构核心开发应用程序。同时Android L支持更大的寄存器,支持新的指令集,提升了内存寻址空间,未来Android智能手机将支持4GB以上的内存。
并且ART模式中,google优化了gc,将他的暂停此时由2次编程了1次,并且在gc回收垃圾的时候可以多核并发处理。
4、全新的“最近应用程序”
除了界面风格设计的改变之外,新的最近应用界面还借鉴了Chrome浏览器的理念,采用单独的标签展示方式。更重要的是,谷歌已经向开发者开放了API,所以第三方开发人员可以利用这个改进为特定的应用增加全新的功能。
二、开发者:
1、抽屉布局(DrawerLayout)
该对象在我们的support.v4包中,以后大家在做侧滑菜单的时候可以使用这个布局,在布局中可以设置左右两个侧滑菜单,同时,它还可以结合ActionBarDrawerToggle(带动画的一个按钮)使用:
使用DrawerLayout:
ActionBarDrawerToggle:随着侧滑菜单的画出有一个旋转的动画,同时,点击它侧滑菜单也会出来,使用它必须要有:
这句代码让它在ActionBar上显示出来。
2、涟漪动画、揭示动画、转场动画
涟漪动画(Touch feedback):也叫“触摸反馈”
当用户与用户界面进行交互时,Material Design中的触摸反馈在触摸点上提供了一种瞬时视觉确认。按钮的默认触摸反馈动画使用新的RippleDrawable类,它使用涟漪(波纹)效应在不同状态间转换。
在大多数情况下,你应该在你的布局XML文件中使用如下的方法去指定视图的背景:
?android:attr/selectableItemBackground (有界波纹)
?android:attr/selectableItemBackgroundBorderless (无界波纹)
注意:selectableItemBackgroundBorderless是API级别21上的新属性。
效果如下:(自己点进去看效果)
https://img-my.csdn.net/uploads/201412/07/1417881700_6000.gif-thumb.jpg
在我们的布局里面这样设置:
或者,你可以定义一个RippleDrawable作为波纹元素的XML资源:
rippledrawable.xml
<?xml version="1.0" encoding="utf-8"?> |
揭示动画(Circular Reveal):也叫“循环显示”
首先我们要弄清楚,Circular Reveal是一个Android L新增的动画效果。
使用方法:
应用 ViewAnimationUtils.createCircularReveal() 方法可以去创建一个RevealAnimator动画。
ViewAnimationUtils.createCircularReveal源码如下:
public static Animator createCircularReveal(View view, int centerX, int centerY, float startRadius, float endRadius) { return new RevealAnimator(view, centerX, centerY, startRadius, endRadius); } |
源码非常简单,就是通过createCircularReveal方法根据5个参数来创建一个RevealAnimator动画对象。
这五个参数分别是:
view 操作的视图
centerX 动画开始的中心点X
centerY 动画开始的中心点Y
startRadius 动画开始半径
startRadius 动画结束半径
根据下面的效果图和代码可以很容易的了解这几个参数的作用:
http://img0.tuicool.com/yeQrQz.gif
具体使用细节如下(操作方块):
final View rect = this.findViewById(R.id.rect); rect.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Animator animator = ViewAnimationUtils.createCircularReveal( rect, 0, 0, 0, (float) Math.hypot(rect.getWidth(), rect.getHeight())); animator.setInterpolator(new AccelerateInterpolator()); animator.setDuration(2000); animator.start(); } }); |
总结:
RevealAnimator 和之前的动画使用没什么区别,同样可以设置监听器和加速器来实现各种各样的特效。
转场动画(Activity Transition):也叫“Activity过渡“
转场动画大多使用于两个界面(Activity)之间的跳转,他们之间就可以有这样的一个动画。主要有三种效果的动画:Explode(爆炸式)、Fade(淡入淡出)、Slide(平滑式)。
使用这些动画,你必须在进入和退出activity都要求使用这些内容转场特效,并且在两个Activity的setOncontent()里面有:
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
并且必须在setContentView()加载布局之前设置。
使用getWindow().setExitTransition( Transition ) 和getWindow().setEnterTransition( Transition ) 方法告诉activity当打开和关闭时如何执行,Transition代表的就是Explode(爆炸式)、Fade(淡入淡出)、Slide(平滑式)中的一种,例外还有4个方法需要知道:
getWindow().setEnterTransition(transition);
getWindow().setExitTransition(transition);
getWindow().setReturnTransition(transition);
getWindow().setReenterTransition(transition);
为了帮助大家理解,我们做这样的假设:
A和B分别是两个Activity,我们从A Activity跳转到B Activity。 Activity transition API围绕退出(exit),进入(enter),返回(return)和再次进入(reenter)四种transition。按照上面对A和B的约定,我这样描述这一过程。 Activity A的退出变换(exit transition)决定了在A调用B的时候,A中的View是如何播放动画的。 Activity B的进入变换(enter transition)决定了在A调用B的时候,B中的View是如何播放动画的。 Activity B的返回变换(return transition)决定了在B返回A的时候,B中的View是如何播放动画的。 Activity A的再次进入变换(reenter transition)决定了在B返回A的时候,A中的View是如何播放动画的。 |
按照上面的规则,我们:
在第一个Activity中:
@Override public void onClick(View v) { Transition transition=null; Intent intent=null; switch (v.getId()){ case R.id.explodeButton://爆炸式过渡 transition = new Explode(); intent = new Intent(this, ExplodeActivity.class); break; case R.id.fadeButton://淡入淡出过渡 transition = new Fade(); intent = new Intent(this, FadeActivity.class); break; case R.id.slideButton://平滑的过渡 transition = new Slide(); intent = new Intent(this, SlidActivity.class); break; } transition.setDuration(1000); getWindow().setEnterTransition(transition); getWindow().setExitTransition(transition); getWindow().setReturnTransition(transition); getWindow().setReenterTransition(transition); //界面跳转,官方文档规定的。 startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle()); } |
在第二个Activity中:
public class ExplodeActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS); Transition transition = new Explode(); transition.setDuration(1000); getWindow().setEnterTransition(transition); getWindow().setExitTransition(transition); getWindow().setReturnTransition(transition); getWindow().setReenterTransition(transition); setContentView(R.layout.activity_explode); } } |
3、RecyclerView
RecyclerView出现已经有一段时间了,相信大家肯定不陌生了,大家可以通过导入support-v7对其进行使用。首先我们要明白一点,RecyclerView可以用来代替我们的ListView和GridView,同时对ViewHodler进行了更好的封装,它自动重用我们的convertView。所以使用更加简单。
Recycler高度的解耦,异常的灵活,通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现令人瞠目的效果:
你想要控制其显示的方式,请通过布局管理器LayoutManager
你想要控制Item间的间隔(可绘制),请通过ItemDecoration
你想要控制Item增删的动画,请通过ItemAnimator
下面是使用recyclerView最简单的一个布局:
在我们的Activity里面获得到它,使用方法跟我们的ListView一样:
下面是适配器adapter里面的内容(添加了条目点击事件哦):
private RecyclerView.Adapter adapter = new RecyclerView.Adapter() { //加载布局条目 ;//设置条目里面的图片 //给条目添加点击事件 //拿到对应条目的holder //刷新已经移除的条目,RecyclerView不需要整体刷新 //创建一个ViewHolder |
5、CardView
通过图片,我们知道CardView继承至FrameLayout类,可以在一个卡片布局中一致性的显示内容,卡片可以包含圆角和阴影。CardView是一个Layout,可以布局其他View。
使用它需要我们在xml中定义:
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:card_view="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" > <android.support.v7.widget.CardView android:layout_width="wrap_content" android:layout_height="wrap_content" card_view:cardCornerRadius="6dp" card_view:cardElevation="6dp" card_view:contentPadding="5dp" android:layout_marginBottom="10dp" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ImageView android:id="@+id/iv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:src="@mipmap/ic_launcher"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="图片标题"/> </LinearLayout> </android.support.v7.widget.CardView> </FrameLayout> |
注意1:我们一定要有xmlns:card_view=http://schemas.android.com/apk/res-auto命名空间
注意2:我们需要在CardView的外层套一个FramLayout,这样显示效果更明显,更加;但是当在加载View条目的时候没有加载FramLayout的宽高,这样也没关系。我们只需要在CardView里面添加就行了。
下面我们列举CardView的一些常用属性:(红色为最常用的)
card_view:cardElevation 卡片的高度(阴影) card_view:cardMaxElevation 阴影最大高度 card_view:cardBackgroundColor 卡片的背景色 card_view:cardCornerRadius 卡片的圆角大小 card_view:contentPadding 卡片内容于边距的间隔 card_view:contentPaddingBottom card_view:contentPaddingTop card_view:contentPaddingLeft card_view:contentPaddingRight card_view:contentPaddingStart card_view:contentPaddingEnd card_view:cardUseCompatPadding 设置内边距,V21+的版本和之前的版本仍旧具有一样的计算方式 card_view:cardPreventConrerOverlap 在V20和之前的版本中添加内边距,这个属性为了防止内容和边角的重叠 |
1. 简介
0.1 Material Design
0.4 查看视频
0.5 打开AndroidStudio和模拟器,展示5.0效果
0.5.1 由于手机性能提升,5.0上原生API的控件,谷歌增加了很多动画
0.5.2 可以变更标题栏和ActionBar的颜色
0.5.3 其他的控件和动画展示
0.5.4 Material完整效果在5.0以上版本原生提供,Support包的兼容性无法做到完全一样
2. 自定义状态栏、标题栏、导航栏的颜色
1.1 参考图片说明和源码,修改新建项目的values-v21/styles.xml
1.2 查看动态切换主题的代码,代码不重要,学生应该掌握查找代码的方法
3. 阴影
2.1 z = elevation(海拔) + translationZ(属性动画里Z轴的位移)
2.2 阴影范围越大,颜色越淡,表示海拔越高
2.3 海拔高的控件显示在界面上层
2.4 材料设计认为控件都是有实体质感的,可以拉伸折叠收缩,但是不能有“穿墙”的行为
2.3 当子控件已经比父控件大,则阴影不会显示
4. 圆形图片轮廓的显示方式
3.1 xml设置
outlineProvider:none|background|bounds|paddedBounds
3.2 代码设置
view.setOutlineProvider(new ViewOutlineProvider(){
public void getOutLine(view,outine){
outline.setOval(0,0,view.getWidth(),view.getHeight());
}
});
3.3 注意:阴影不会超出父view范围
5. 图片选择器 tint属性
4.1 直接从文档展示
4.2 创建Bitmap的Drawable文件,指定src、tintmode和tine可以生成新的图片
6. 图片颜色抽取 Palette
5.1 直接从文档展示
5.2 引入support下的palette包
Palette.from(drawable.getBitmap()).generate(new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(Palette palette) {
int color = palette.getLightVibrantColor(Color.RED);
Log.d(TAG, "onGenerated: color="+color);
iv.setBackgroundColor(color);
}
});
7. 矢量图
6.0 矢量图和栅格图区别
6.1 直接从文档展示
6.1.1 创建vector的drawable
6.1.2 指定宽高、以及viewport宽高
6.1.3 指定绘制的path属性
name、fillcolor、pathdata
6.2 可以创建矢量图的网站
http://editor.method.ac/
8. 矢量图动画
7.0 从源码查看
7.1 创建animated-vector的drawable
7.2 指定animator-vector的默认图片
7.3 指定animator-vector的动画资源animator-1
<target name="vector" animator="@animator/animator-1" />
7.4 创建animator/animator-1.xml
7.5 animator-1为一个set,包含了多个objectAnimator
7.6 objectAnimator应该指定:
duration="2000",propertyName="pathData",valueType="pathType",valueFrom="图形数据",valueTo="图形数据"
9. 按压时的波纹效果
8.1 background="?android:attr/selectableItemBackgroud"
8.2 自定义波纹动画
Animator anim = ViewAnimationUtils.createCircularReveal(view, centerX, centerY,startRadius,endRadius);
// 在指定view的指定位置,以startRadius为起始半径,endRadius为最终半径,绘制水波纹动画
anim.start();
10. SwipeRefreshLayout
9.0 展示效果:下拉刷新列表
9.1 增加到布局文件
9.2 find到view对象,并修改下拉颜色变化
9.3 设置下拉监听
11. RecycleView
10.1 展示效果:可以垂直/水平显示的列表/瀑布流,功能强大,用于替代ListView
10.2 增加到布局文件
10.3 find到view对象,并设置Adapter
10.4 设置布局管理器
10.5 点击事件处理
12. CardView
11.1 展示效果:具备阴影的控件,也就是具备z轴海拔的控件
11.2 该View继承自FrameLayout,直接作为父布局包裹子控件即可
12.v7包的ToolBar
12.1 用于替代ActionBar,继承自ViewGroup可以任意包裹子布局,灵活性更高
12.2 使用时必须设置背景色
12.3 设置主题,隐藏ActionBar
parent="Theme.AppCompat.NoActionBar"
12.4 主界面继承自AactionBarActivity,onCreate方法执行时设置ToolBar作为ActionBar
setSupportActionBar(toolbar);
13. v4包的drawerToggle
13.1 展示效果:抽屉效果,可以关联toolbar
13.2 在布局文件添加DrawerLayout,包裹两个帧布局
13.3 创建DrawerToggle对象
drawToggle = new ActionBarDrawerToggle(this,drawerLayout,toolbar,R.string.open,R.string.close);// 构造方法里关联了drawLayout和toolbar
13.4 设置监听
drawerLayout.setDrawerListener(drawerToggle);
13.5 开启功能
```java
drawerToggle.sysncState();
```