第七章、Android动画深入分析

来源:互联网 发布:网络电影商业计划书 编辑:程序博客网 时间:2024/06/05 00:55

第七章、Android动画深入分析

> Android动画可以分为三种:View动画,帧动画、属性动画。其实帧动画也属于View动画,只不过它和平移、旋转等常见的View动画在表现形式上略有不同而已。

1. View动画
View动画的作用对象是View,支持四种动画:平移、缩放、旋转、透明度。
1. View动画的种类
1. View动画的四种变化效果对应着Animation的四个子类:TanslateAnimation 、ScaleAnimation、RetateAnimation和AlphaAnimation。
2. 对于view动画来说,建议采用XML来定义动画,因为可读性更好。
2. 帧动画
帧动画是顺序播放一组预先定义好的图片,类似于电影播放。不同于View动画,系统提供了另外一个类AnimationDrawable来使用帧动画。帧动画起来容易引起OOM,所以在使用帧动画时应尽量避免使用过多尺寸较大的图片
2. View动画使用场景
在ViewGroup中可以控制子元素的出场效果,在Activity中可以实现不同Activity之间的切换效果。
1. LayoutAnimation
LayoutAnimation作用于ViewGroup,为ViewGroup指定一个动画,这样当它的子元素出场时都会具有这种动画效果。
代码示例:

        <layoutAnimation            xmlns:android="http://schemas.android.com/apk/res/android"            android:delay="0.5"            android:animationOrder="reverse"            android:animation="@anim/anim_item"/>    属性的含义:      1. android:dely:          表示子元素开始动画的时间延迟。比如子元素入场动画的时间周期是300ms,那么0.5表示每个子元素都需要延迟150ms才能播放入场动画。    2. android:animationOrder:          表示子元素的出场顺序,有三种选项:normal、reverse和random。    3. android:animation        为子元素指定具体的入场动画。  2. Activity的切换效果      1. Activity有默认的切换效果,但是这个效果可以自定义。主要用到了overridePendingTransition(int enterAnim,int exitAnim)这个方法。这个方法必须在startActivity(Intent)或者finish()之后被调用才能生效。

3. 属性动画
1. 使用属性动画
在实际开发中建议采用代码来实现属性动画,因为通过代码来实现比较简单。更重要的是,很多时候一个属性无法提前确定。逼图让一个Button从屏幕左边移动到屏幕的右边,由于我们无法提前知道屏幕的宽度,因此无法将属性动画定义在XML中,在这种情况下就必须通过代码动态地创建属性动画。
2. 理解插值器和估值器
1. TimeInterpolator,时间插值器,它的作用是根据时间流逝的百分比来计算出当前属性改变的百分比。系统内置的插值器有线性插值器(LinearInterpolator)、加速减速插值器(AccelerateDecelerateInterpolator)和减速插值器(DecelerateInterpolator)。
2. TypeEvaluator,类型估值算法,它的作用是根据当前属性改变的百分比来计算改变后的属性值。系统内置的估值器有IntEvaluator、FloatEvaluator和ArgbEvaluator。
3. 属性动画监听器
属性动画提供了监听器用于监听动画的播放过程,主要有两个接口:AnimatorUpdateListener和AnimatorListener。为了开发方便,系统提供了AnimatorListenerAdapter这个类,这是AnimatiorListener的适配器,这样我们可以有选择性的实现方法。
4. 对任意属性做动画
View不支持对宽度进行动画。
1. 属性动画的原理:
属性动画要求动画作用的对象提供该属性的get和set方法,属性动画根据外界传递的该属性的初始值和最终值,以动画的效果多次去调用set方法,每次传递给set方法的值都不一样,确切来说随着时间的推移,所传递的值越来越接近最终值。
2. 我们对object的属性abc做动画,如果想要动画生效,需要同时满足两个条件:
1. object必须提供setAbc方法,如果动画的时候没有传递初始值,那么还要提供getAbc方法,因为系统要去取abc属性的初始值。
2. Object的setAbc属性对abc所做的改变必须更够通过某种方法反应出来,比如会带来UI的改变之类的。

    3. 对Button的width属性做动画没有效果?              因为Button内部的setWidth并不是改变视图的大小,所以Button并不满足条件2,有三种解决方法:              1. 给你的对象加上get和set方法,如果有权限的话。            2. 用一个类来包装原始对象,间接为其提供get和set方法。            3. 采用ValueAnimator,监听动画过程,自己实现属性的改变。5. 属性动画的工作原理      1. 属性动画要求动画的作用的对象提供该属性的set方法,属性动画根据你传递的该属性的初始值和最终值,以动画的效果多次去调用set方法。每次传递个set方法的值都不一样,确切来说,随着时间的推移,所传递的值越来越接近最终值。    2. 属性动画需要运行在有Looper的线程中。
  1. 是使用动画注意事项
    1. OOM:尽量避免使用帧动画,使用的话应尽量避免使用过多尺寸较大的图片;
    2. 内存泄露:属性动画中的无限循环动画需要在Activity退出的时候及时停止,否则将导致Activity无法释放而造成内存泄露。view动画不存在这个问题;
      3.兼容性问题:某些动画在3.0以下系统上有兼容性问题;
    3. view动画的问题:view动画是对view的影像做动画,并不是真正的改变view的状态,因此有时候动画完成之后view无法隐藏,即setVisibility(View.GONE)失效了,此时需要调用view.clearAnimation()清除view动画才行。
    4. 不要使用px;
    5. 动画元素的交互:在android3.0以前的系统上,view动画和属性动画,新位置均无法触发点击事件,同时,老位置仍然可以触发单击事件。从3.0开始,属性动画的单击事件触发位置为移动后的位置,view动画仍然在原位置;
    6. 硬件加速:使用动画的过程中,建议开启硬件加速,这样会提高动画的流畅性。
0 0
原创粉丝点击