Android动画深入分析————读书笔记

Android动画深入分析

Android的动画分为三种:View动画、帧动画和属性动画,帧动画也算属于View动画的一种。

View动画

View动画的作用对象是View,它支持四种动画效果:平移动画,缩放动画,旋转动画和透明度动画。

View动画的种类

View动画的四种对应效果对应着Animation的四个子类:TranslateAnimation、ScaleAnimation、RotateAnimation和AlphaAnimation。既可以用xml定义也可以通过代码来创建,建议使用xml(可读性好)。具体属性介绍见书和其他文档。

帧动画

帧动画是顺序播放一组预先定义好的图片,类似于电影播放。系统提供了一个类AnimationDrawable来使用帧动画。
帧动画的使用:1.xml定义一个AnimationDrawable2.将AnimationDrawable作为View的背景并通过Drawable来播放动画即可。
注:帧动画使用简单,但是比较容易引起OOM,使用时尽量避免使用过多较大尺寸的图片。

View动画的特殊使用场景

View动画可以在一些特殊场景下使用,比如在Activity中实现不同Activity之间的切换效果。

LayoutAnimation

LayoutAnimation作用于ViewGroup,为ViewGroup指定一个动画,这样当它的子元素出场时都会具有这种动画效果。
步骤如下:
1.定义LayoutAnimation

<layoutAnimation
xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="0.5"
android:animationOrder="reverse"
android:animation="@anim/anim_item"/>

2.为子元素指定具体的入场动画

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300"
android:interpolator="@android:anim/accelerate_interpolator"
android:shareInterpolator="true" >

<alpha
    android:fromAlpha="0.0"
    android:toAlpha="1.0" />

<translate
    android:fromXDelta="500"
    android:toXDelta="0" />

</set>

3.为ViewGroup指定android:layoutAnimation属性。

<ListView
    android:id="@+id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layoutAnimation="@anim/anim_layout"
    android:background="#fff4f7f9"
    android:cacheColorHint="#00000000"
    android:divider="#dddbdb"
    android:dividerHeight="1.0px"
    android:listSelector="@android:color/transparent" />

除了在xml中指定LayoutAnimation外,还可以通过

LayoutAnimationController来实现。
ListView listView = (ListView) layout.findViewById(R.id.list);
    Animation animation = AnimationUtils.loadAnimation(this, R.anim.anim_item);
    LayoutAnimationController controller = new LayoutAnimationController(animation);
    controller.setDelay(0.5f);
    controller.setOrder(LayoutAnimationController.ORDER_NORMAL);
    listView.setLayoutAnimation(controller);

Activity的切换效果

Activity有默认的切换效果,我们也可以自定义。主要用到overridePendingTransition(int enterAnim,int exitAnim)这个方法,此方法必须在startActivity或者finish之后被调用才能生效。
fragment也可以添加切换动画。FragmentTransaction中的setCustomAnimations()方法来添加。

属性动画

属性动画可以对任何对象做动画,甚至可以没有对象。只要对象有这个属性,它都能实现动画效果。实际开发建议使用代码实现属性动画(通过代码比较简单)。

理解插值器和估值器

插值器的作用是根据时间的流逝的百分比来计算出当前属性值改变的百分比。系统预置的有:LinearInterpolator(线性插值器:匀速动画)、AccelerateDecelerateInterpolator(加减速插值器:动画两头慢中间快)和DecelerateInterpolator(减速插值器:动画越来越慢)等。
估值器的作用是根据当前属性改变的百分比来计算改变后的属性值。
属性动画中的插值器和估值器是实现非匀速动画的重要手段。

属性动画的监听器

属性动画提供了监听器用于监听动画的播放过程,主要有如下两个接口:AnimatorUpdateListener和AnimatorListener。
AnimatorListener可以监听动画的开始、结束、取消以及重复播放。
AnimatorUpdateListener监听整个动画过程,每播放一帧就会被调用一次。

对任意属性做动画

属性动画要求动画作用的对象提供该属性的get和set方法,属性动画根据外界传递的该属性的初始值和最终值,以动画的效果多次调用set方法,每次传递给set方法的值都不一样,确切来说是随着时间的推移,所传递的值越来越接近最终的值。
我们对object的属性abc做动画,若想让动画生效必须满足以下条件:
1.object必须提供setAbc方法。
2.object的setAbc方法对属性abc所做的改变必须能够通过某种方法反映出来。
如果不满足,有3中解决方法:
1.给对象加上get和set方法
2.用一个类包装原始对象,间接为其提供get和set方法
3.采用ValueAnimation,监听动画过程,自己实现属性的改变

属性动画的工作原理

属性动画要求动画作用的对象提供该属性的get和set方法,属性动画根据外界传递的该属性的初始值和最终值,以动画的效果多次调用set方法,每次传递给set方法的值都不一样,确切来说是随着时间的推移,所传递的值越来越接近最终的值。如果动画的时候没有传递初始值,还有提供get方法。
源码分析详情见书中描述。

使用动画的注意事项

1.OOM问题:避免使用帧动画
2.内存泄漏:无限循环动画需要在Activity退出时及时停止
3.兼容性问题:做好适配工作
4.View动画的问题:View动画是对View的影像做操作,并未真正的改变View的状态。
5.不要使用px:尽量使用dp
6.动画元素的交互:3.0以前版本所有动画新位置无法触发单击事件。3.0以后属性动画新位置的单击事件能触发,View动画仍然在原位置。
7.硬件加速:动画过程中,建议开启硬件加速

你可能感兴趣的:(android,动画,读书笔记)