Android Lollipop(5.0) 一些新特性

来源:互联网 发布:证大淘宝贷 编辑:程序博客网 时间:2024/06/10 06:40

Android 5.0系统新特性:

1、Android  Material Design 

概念:融合卡片式,立体式的设计风格,强调层次感,动画,阴影等元素

 Android UI样式风格发展:2.3版本(黄色丑陋版)->4.0(Holo)->5.0(MaterialDesign)

官网地址:http://developer.android.com/training/material

分类:

1、主题和布局

自定义 主题:

@android:style/Theme.Material 
@android:style/Theme.Material.Light
@android:style/Theme.Material.Light.DarkActionBar

自定义颜色基调(color palette)

<resources>    <!-- inherit from the material theme -->    <style name="AppTheme" parent="android:Theme.Material">      <!-- Main theme colors -->      <!--   your app's branding color (for the app bar) -->      <item name="android:colorPrimary">@color/primary</item>      <!--   darker variant of colorPrimary (for status bar, contextual app bars) -->      <item name="android:colorPrimaryDark">@color/primary_dark</item>      <!--   theme UI controls like checkboxes and text fields -->      <item name="android:colorAccent">@color/accent</item>    </style>  </resources> 


2、视图和阴影效果

View的大小位置都是通过x,y确定的,而现在有了z轴的概念,而这个z值就是View的高度(elevation),而高度决定了阴影(shadow)的大小。
View Elevation(视图高度)
View的z值由两部分组成,elevation和translationZ(它们都是Android L新引入的属性)。
eleavation是静态的成员,translationZ是用来做动画。
Z = elevation + translationZ


在layout中使用 android:elevation属性去定义 
在代码中使用 View.setElevation 方法去定义 
设置视图的translation,可以使用View.setTranslationZ方法 
新的ViewPropertyAnimator.z和ViewPropertyAnimator.translationZ方法可以设置视图的elevation值

新的属性值:translationZ允许你创建一个动画暂时的反应出View的高度值(elevation)变化。
这对于响应触摸手势很有用处,请看下面代码(官方Demo中的代码):

int action = motionEvent.getActionMasked();  
                    /* Raise view on ACTION_DOWN and lower it on ACTION_UP. */  
                    switch (action) {  
                        case MotionEvent.ACTION_DOWN:  
                            Log.d(TAG, "ACTION_DOWN on view.");  
                            view.setTranslationZ(120);  
                            break;  
                        case MotionEvent.ACTION_UP:  
                            Log.d(TAG, "ACTION_UP on view.");  
                            view.setTranslationZ(0);  
                            break;  
                        default:  
                            return false;  
                    }  

Shadows and Outlines(阴影和轮廓)
视图的背景边界决定了默认的阴影形状。轮廓(Outlines)代表了图形对象的外形状,并确定了对于触摸反馈的波纹区域。


在Android L中设置一个阴影很简单,只需要两点:
1.设置eleavation值
2.添加一个背景或者outline


可以在xml中通过定义一个背景来设置outline:
     <TextView  
        android:id="@+id/myview"  
        ...  
        android:elevation="2dp"  
        android:background="@drawable/myrect" />  
     <!-- res/drawable/myrect.xml -->  
    <shape xmlns:android="http://schemas.android.com/apk/res/android"  
           android:shape="rectangle">  
        <solid android:color="#42000000" />  
        <corners android:radius="5dp" />  
    </shape>  


也可以通过代码来创建一个outline:
 /* Get the size of the shape from resources. */  
int shapeSize = getResources().getDimensionPixelSize(R.dimen.shape_size);  
  
/* Create a circular outline. */  
mOutlineCircle = new Outline();  
mOutlineCircle.setRoundRect(0, 0, shapeSize, shapeSize, shapeSize / 2);  
  
/* Create a rectangular outline. */  
mOutlineRect = new Outline();  
mOutlineRect.setRoundRect(0, 0, shapeSize, shapeSize, shapeSize / 10); 
给视图设置一个outline(如果为了防止一个视图产生阴影可以设置outline为null):


上面的方法在Android L5.0正式版中已经被替换,下面我再介绍以下Android L5.0设置outline的方法:
    ViewOutlineProvider viewOutlineProvider = new ViewOutlineProvider() {  
        @Override  
        public void getOutline(View view, Outline outline) {  
            int size = getResources().getDimensionPixelSize(R.dimen.fab_size);  
            outline.setOval(0, 0, size, size);  
        }  
    };  
    fab.setOutlineProvider(viewOutlineProvider);  

Drawable Tinting(着色)
对于Android L还有一个独特的特点就是现在可以定义图片的alpha遮罩,并且可以轻松的使用android:tint属性去调整色调。
Clipping Views(裁剪视图)


可以使用View.setClipToOutline方法去剪切一个视图的outline区域。
只有rectangle,circle, 和round rectangle outlines支持裁剪(Outline.canClip方法用来判断是否可以裁剪)


为了裁剪一个可绘制的视图形状,需要先设置一个outline然后调用View.setClipToOutline方法:
floatingShape.setClipToOutline(true);  
下面请看一个使用裁剪的例子:
     int margin = Math.min(clippedView.getWidth(), clippedView.getHeight()) / 10;  
    Outline mClip = new Outline();  
    mClip.setRoundRect(margin, margin, clippedView.getWidth() - margin,  
            clippedView.getHeight() - margin, margin / 2);  
    /* Sets the Outline of the View. */  
    clippedView.setOutline(mClip);  
    /* Enables clipping on the View. */  
    clippedView.setClipToOutline(true);  


注意:


高度影响View的绘制顺序,过去是按View添加顺序绘制,先添加的先绘制,现在高度小的先绘制,因为高度小的,层级低,在下面, 高度相同的,按添加顺序绘制

如果View的背景色为透明,则不会显示出阴影效果
只有子View的大小比父View小时,阴影才能显示出来

View的轮廓可以通过outlineProvider属性设置,默认是依据于background的,还有其他3个取值:bounds,none,paddingBounds
android:outlineProvider="bounds"
none:即使设置了evaluation也不显示阴影
background:按背景来显示轮廓,如果background是颜色值,则轮廓就是view的大小,如果是shape,则按shape指定的形状作为轮廓
bounds: View的矩形大小作轮廓
paddedBounds: View的矩形大小减去padding的值后的大小作轮廓。


如果background是图片,那只能通过代码setOutlineProvider()来指定轮廓
View的裁剪是指将View按照轮廓裁剪,能改变View的形状,如圆形头像:
先设置轮廓:
再设置根据轮廓裁剪View,目前只支持对矩形,圆形,圆角矩形的裁剪:
//设置对View进行裁剪
tv_clip.setClipToOutline(true);


3、UI控件

在Android L中新增了两个控件分别是RecyclerView,CardView:
RecyclerView:--- (android.support.v7.widget.RecyclerView )
RecyclerView是ListView的升级版,它提供了更好的性能而且更容易使用。
RecyclerView这个控件是一个可以装载大量的视图集合,并且可以非常效率的进行回收和滚动。当你list中的元素经常动态改变时可以使用RecyclerView控件。

RecyclerView非常容易使用,它提供了如下两个功能:

为每个条目位置提供了layout管理器(RecyclerView.setLayoutManager)

为每个条目设置了操作动画(RecyclerView.setItemAnimator)

先添加依赖 compile 'com.android.support:recyclerview-v7:23.1.1'
设置LayoutManager:控制RecyclerView如何显示布局,系统提供3个布局管理器:
LinearLayoutManager:线性布局,有横向和竖直方向显示
GridLayoutManager:网格布局,有横向和竖直方向显示
StaggeredGridLayoutManager: 瀑布流布局,有横向和竖直方向显示
然后给RecyclerView设置Adapter<RecyclerView.ViewHolder>
设置点击事件,由于RecyclerView没有setOnItemClickListener,只能在Adapter中给View设置Click事件

CardView:--- (android.support.v7.widget.CardView)
CardView继承自FrameLayout,允许你在card视图中显示信息. CardView也可以设置阴影和圆角。(其实现在很多应用都自定义了Card视图,Google这回将card视图作为基本控件,可以拿来直接使用了)
Layout中为CardView设置圆角使用card_view:cardCornerRadius属性
代码中为CardView设置圆角使用CardView.setRadius方法
为CardView设置背景颜色使用card_view:cardBackgroundColor属性

1.设置圆角:card_view:cardCornerRadius="10dp"
2.设置高度:card_view:cardElevation="10dp"
3.设置内边距:card_view:contentPadding="10dp"
4.设置背景色:card_view:cardBackgroundColor="?android:attr/colorPrimary"

ToolBar:
它用来代替ActionBar,但是比ActionBar更加灵活,相当于可以写在布局文件中的ActionBar;与DrawerLayout的使用的时候,DrawerLayout可以覆盖在ToolBar上,并且ToolBar和ActionBar不能同时使用
使用ToolBar的步骤:
先隐藏ActionBar,可以继承一个不带ActionBar的Theme,如:
style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"
然后在Activity中设置ToolBar替代ActionBar:
setSupportActionBar(toolBar);
最后设置ToolBar的显示内容:
toolBar.setTitle("ToolBar");//设置标题
toolBar.setNavigationIcon(iconRes);//设置图标
toolBar.setOnMenuItemClickListener();//设置Menu Item点击


4、动画

在Android L中新增了如下几种动画:
Touch feedback(触摸反馈)
Reveal effect(揭露效果)
Activity transitions(Activity转换效果)
Curved motion(曲线运动)
View state changes (视图状态改变)
Animate Vector Drawables(可绘矢量动画)

触摸反馈:
在Android L5.0中加入了触摸反馈动画。
其中最明显,最具代表性的就是波纹动画,比如当点击按钮时会从点击的位置产生类似于波纹的扩散效果。

波纹效果(Ripple):
可以通过如下代码设置波纹的背景:
android:background="?android:attr/selectableItemBackground"波纹有边界
android:background="?android:attr/selectableItemBackgroundBorderless"波纹超出边界
android:colorControlHighlight:设置波纹颜色
android:colorAccent:设置checkbox等控件的选中颜色

Circular Reveal:
应用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);  
}  
view 操作的视图
centerX 动画开始的中心点X
centerY 动画开始的中心点Y
startRadius 动画开始半径
startRadius 动画结束半径
RevealAnimator和之前的动画使用没什么区别,同样可以设置监听器和加速器来实现各种各样的特效。
这些效果常用在视图的添加,删除,状态,大小改变的时候,以后我会写一个更直观详细的例子。

Activity Transition:
Activity Transition是Material Design中提供的一种动画效果。它通过运动和切换不同状态之间的元素来产生各种动画效果。 

Activity Transition提供了两种Transition类型:
Enter(进入):进入一个Activity的效果
Exit(退出):退出一个Activity的效果
而这每种类型又分为普通Transition和共享元素Transition:
普通Transition:
explode:从场景的中心移入或移出
slide:从场景的边缘移入或移出
fade:调整透明度产生渐变效果

Shared Elements Transition 共享元素转换:
它的作用就是共享两个acitivity种共同的元素,在Android 5.0下支持如下效果:
changeBounds -  改变目标视图的布局边界
changeClipBounds - 裁剪目标视图边界
changeTransform - 改变目标视图的缩放比例和旋转角度
changeImageTransform - 改变目标图片的大小和缩放比例

Activity Transition使用 :
设置允许使用transition,并且设置transition
首先,如果要使用transition需要先修改style文件,在继承了material主题的style.xml中添加如下属性:

    <style name="myTheme" parent="android:Theme.Material">  
            <!-- 允许使用transitions -->  
            <item name="android:windowContentTransitions">true</item>  
      
            <!-- 指定进入和退出transitions -->  
            <item name="android:windowEnterTransition">@transition/explode</item>  
            <item name="android:windowExitTransition">@transition/explode</item>  
      
            <!-- 指定shared element transitions -->  
            <item name="android:windowSharedElementEnterTransition">  
                @transition/change_image_transform</item>  
            <item name="android:windowSharedElementExitTransition">  
                @transition/change_image_transform</item>  
    </style>  
下面再来看看如何定义transition动画:
    <transitionSet xmlns:android="http://schemas.android.com/apk/res/android">  
        <explode/>  
        <changeBounds/>  
        <changeTransform/>  
        <changeClipBounds/>  
        <changeImageTransform/>  
    </transitionSet>  
transition里面的元素就是之前介绍过的,使用方法和以前的AnimationSet差不多,具体如何使用大家可以参考官方文档。

代码:
在代码中同样可以完成对于transition的设置:
    // 允许使用transitions  
    getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);  
    // 设置一个exit transition  
    getWindow().setExitTransition(new Explode());  

可以通过如下方法在代码总设置transition效果:
Window.setEnterTransition():普通transition的进入效果
Window.setExitTransition():普通transition的退出效果
Window.setSharedElementEnterTransition():共享元素transition的进入效果
Window.setSharedElementExitTransition():共享元素transition的退出效果


5、Palette的使用
使用Palette可以让我们从一张图片中拾取颜色,将拾取到的颜色赋予ActionBar,StatusBar以及背景色可以让界面色调实现统一
使用Palette需要添加以下依赖:
compile 'com.android.support:palette-v7:23.0.0+'
Palette提供的API
//同步获取,需要在子线程中使用
Palette palette = Palette.from(drawable.getBitmap()).generate();
//异步获取,可以在主线程中使用
Palette.from(drawable.getBitmap()).generate(new Palette.PaletteAsyncListener() {
    @Override
    public void onGenerated(Palette palette) {
        //...
    }
});
得到Palette对象后,获取其中的颜色,颜色对应如下:
vibrant      -  有活力的颜色
lightVibrant -  有活力的亮色
darkVibrant  -  有活力的暗色
muted        -  柔和暗淡的颜色
lightMuted   -  柔和的亮色
darkMuted    -  柔和的暗色
获取指定颜色的采样对象,获取采样得到的颜色:
//我们可以直接使用palette获取指定颜色:
palette.getLightMutedColor(defaultColor);

//一般也可以先获取采样对象Swatch,从Swatch中获取我们需要的颜色:
//获取有活力颜色的采样对象
Palette.Swatch vibrantSwatch = palette.getVibrantSwatch();
采样对象Swatch提供了以下方法来获取颜色:
//swatch.getPopulation(): the amount of pixels which this swatch represents.
//swatch.getRgb(): the RGB value of this color.
//swatch.getHsl(): the HSL value of this color,即色相,饱和度,明度.
//swatch.getBodyTextColor(): the RGB value of a text color which can be displayed on top of this color.
//swatch.getTitleTextColor(): the RGB value of a text color which can be displayed on top of this color
//一般会将getRgb设置给控件背景色,getBodyTextColor()设置给文字颜色
textView.setBackgroundColor(vibrantSwatch.getRgb());
textView.setTextColor(vibrantSwatch.getBodyTextColor());


6、Android 5.0新特性的向下兼容
可以通过Support Library使用的新特性可以向下兼容,如:
RecyclerView (recyclerview-v7)
CardView (cardview-v7)
Palette颜色识别 (palette-v7)
ToolBar (appcompat-v7)
SwipeRefreshLayout (v4)
定义针对版本的资源目录
layout:使用新API的布局放在res/layout-v21中,其他的放res/layout
drawable:使用新属性的drawable文件放到 res/drawable-v21,其他的放 res/drawable
values: 新的主题放到 res/values-v21, 其他的放 res/values
在代码中对系统Version做判断,使用对应的效果,如:
if(Build.VERSION.SDK_INT> 21){
        //使用新动画
        ...
    }


0 0
原创粉丝点击