android动画

果果君 · · 268 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

android 动画

android动画可以分为三种:View动画,帧动画,和属性动画;其实帧动画也属于view的动画的一种;
View动画通过对场景中的对象不断做图像变换从而产生动画效果,它是一种渐进式动画,view动画支持自定义;
帧动画,是指通过顺序播放一系列图像从而产生动画效果,可以理解为图片切换动画,显然,图片过多,会造成OOM;
属性动画,是通过动态地改变对象的属性从而达到动画效果;

1.View动画
View的动画作用对象时view,它支持4种动画效果,分别是平移,缩放,旋转和透明度;
View动画的四种变换效果分别对应着Animation的四个子类:TranslateAnimation,ScaleAnimation,RotateAnimation,AlphaAnimation;

使用view动画,最好是采用XML来定义动画
<set>标签表示动画集合,对应AnimationSet类,它可以包含若干个动画,并且它的内部也是可以嵌套其他动画集合的;
android:interpolator 动画集合采用的插值器,插值器影响对话的速度;
android:shareinterpolator 集合中的动画是否和集合共享同一个插值器;

<translate> 表示平移动画
android:fromXDelta 表示x的起始值,如0;
android:toXDelta 表示x的结束值,如100;
android:fromYDelta 表示y的起始值;
android:toYDelta 表示y的结束值;

<scale> 表示缩放动画
android:fromXScale 水平方向缩放的起始值,如0.5;
android:toXScale 水平方向缩放的起始值,如1.2;
android:fromYScale 竖直方向缩放的起始值;
android:toYScale 竖直方向缩放的结束值;
android:pivotX 缩放的轴点的x坐标,它会影响缩放的效果;
android:pivotX 缩放的轴点的y坐标,它会影响缩放的效果;
默认情况下轴点是View的中心,这个时候在水平方向上进行缩放的话会导致view向左右两个方向同时进行缩放;
但是如果把轴点改为view的右边界,那么view就只会向左边进行缩放;

<rotate> 表示旋转动画
android:fromDegress 旋转开始的角度
android:toDegress 旋转结束的角度
android:pivotX 旋转的轴点的x坐标
android:pivotX 旋转的轴点的y坐标
在这里,轴点扮演着旋转轴的角色

<alpha> 表示透明度动画
android:fromAlpha 透明度的起始值,如0.1;
android:toAlpha 透明度的结束值,如1;

View动画的常用属性
android:duration  动画的持续时间
android:fillAfter 动画结束以后是否停留在结束位置,true表示view停留在结束位置

如何应用动画:
Animation animation = AnimationUtils.loadAnimation(this,R.anim.xxx);
view.startAnimation(animation);

动画监听
Animation的setAnimationListener方法设置监听;
public static interface AnimationListener {
    void onAnimationStart(Animation animation);
    void onAnimationEnd(Animation animation);
    void onAnimationRepeat(Animation animation);
}

自定义view动画
自定义view动画,需要继承Animation,并重写initialize和applyTransformation方法;
在initialize中做一些初始化工作,在applyTransformation中进行相应的矩阵变换,很多时候需要采用Camera来简化矩阵变换的过程(这一般是多维动画用到);

2.帧动画
顺序播放一组预先定义好的图片,使用AnimationDrawable来播放帧动画
XML中使用<animation-list>标签
使用帧动画,比较容易引起OOM,所以在使用帧动画时应尽量避免使用过多尺寸较大的图片;

3.view动画的特殊使用场景
①LayoutAnimation
作用于ViewGroup,为ViewGroup指定一个动画,这样当它的子元素出场时都会具有这种动画效果,这种效果常被用在ListView上,为ListView的每个Item制造出场动画;
LayoutAnimation也是一个view动画,它的标签是<layoutAnimation>;

android:delay 表示子元素开始动画的时间延迟,如子元素入场动画的时间周期为300ms,那么0.5表示每个子元素都需要延迟150ms才能播放入场动画;
总体来说,第一个延迟150ms,第二个延迟300ms,以此类推;

android:animationOrder 子元素动画的顺序,有三种选项:normal,reverse和random;
其中normal表示顺序显示,即排在前面的子元素先开始播放入场动画;
reverse表示逆向显示,即排在后面的子元素先开始播放入场动画;
random则是随机播放入场动画

android:layoutAnimation 即给Viewgroup指定入场动画;

除了在XML中指定LayoutAnimation外,还可以通过LayoutAnimationController来实现;

②Acitivity切换效果
Activity有默认的切换效果,但是这个效果我们是可以自定义的,主要用到overridePendingTransition(int enterAnim,int exitAnim),该方法必须要在startActivity(intent)或者finish之后调用才能生效;
enterAnim  activity被打开时的,所需的动画资源;
exitAnim activity被暂停时的,所需的动画资源;

4,属性动画
属性动画可以对任何对象做动画,甚至可以没有对象;
属性动画默认时间间隔300ms,默认帧率是10ms/帧,其可以达到的效果是:在一个时间间隔内完成对象从一个属性值到另一个属性值得改变;

常用的几个动画类:
ValueAnimator,ObjectAnimator,AnimatorSet;
其中ObjectAnimator继承自ValueAnimator,AnimatorSet是动画集合;
举例:
①ObjectAnimator.ofFloat(object,"translationY",-object.getHeight()).start();让其沿着y轴向上平移一段距离:它的高度;
②ValueAnimator colorAnim = ObjectAnimator.ofInt(this,"backgroundColor",0XFFFF0000,0XFF000000);
//动画时间
colorAnim.setDuration(3000);
//估值器
colorAnim.setEvaluator(new ArgbEvaluator());
//重复次数
colorAnim.setRepeatCount(ValueAnimator.INFINITE);
//重复模式(这里是反转)
colorAnim.setRepeatMode(ValueAnimator.REVERSE);
colorAnim.start();
③AnimatorSet set = new AnimatorSet();
set.playTogether(Animator...);

属性动画可以在XML中去定义;
标签为<set>,<objectAnimator>,<animator>;
分别对应着AnimatorSet,ObjectAnimator,ValueAnimator;
<set>标签的android:ordering属性有两个值可选,"together"表示动画集合中的子动画同时播放,"sequentially"表示动画集合中子动画按照前后的顺序进行播放,默认是together;
对于<objectAnimator>,android:propertyName 表示属性动画的作用对象的属性的名称;
对于<objectAnimator>,<animator>:
android:duration 表示动画的时长
android:valueFrom 表示属性的起始值
android:valueTo 表示属性的结束值
android:startoffset 表示动画的延迟时间,当动画开始后,需要延迟多少毫秒才会真正地播放此动画;
android:repeatCount 动画的重复次数,默认是0,-1表示无限重复
android:repeatMode 动画的重复模式,repeat表示连续重复,reverse表示逆向重复;
android:valueType 表示android:propertyName所指定的属性的类型,有"intType"和"floatType"两个选项,分别表示属性的类型为整型和浮点型;另外,如果android:propertyName所指定的属性表示的是颜色,那么不需要指定android:valueType,系统会自动对颜色类型的属性做处理;

代码中去应用xml
AnimatorSet set = (AnimatorSet)AnimatorInflater.loadAnimator(myContext,R.anim.property);
set.setTarget(mButton);
set.start();

5.插值器和估值器
TimeInterpolator是时间插值器,它的作用是根据时间流逝的百分比来计算出当前属性值改变的百分比;系统预制的有LinearInterpolator(匀速),AccelerateDecelerateInterpolator(加速减速。两头慢,中间快),和DelelerateInterpolator(减速,动画越来越慢)等;
TypeEvaluator为类型估值器,根据当前属性改变的百分比来计算改变后的属性值,系统预置的有IntEvaluator,FloatEvaluator和ArgbEvaluator;
属性动画的插值器和估值器和重要,是实现非匀速动画的重要手段;

属性动画要求对象的该属性有set方法和get方法(可选),我们也可以自己定义插值器和估值器;
自定义插值器需要实现Interpolator或者TimeInterpolator,自定义估值算法需要实现TypeEvaluator;
如果要对其他类型(非int,float,Color)做动画,就必须要自定义类型估值器;

6.属性动画的监听器
AnimatorListener和AnimatorUpdateListener
AnimatorListener可以监听动画的开始,结束,取消以及重复播放,系统还提供了AnimatorListenerAdapter,它是AnimatorListener的适配器,这样我们就可以选择性地实现上面4个方法了;
AnimatorUpdateListener比较特殊,它会监听整个动画过程,动画每播放一帧,它的onAnimatorUpdate方法都会被调用一次;

7.属性动画原理剖析
在使用属性动画时,如果随便传递一个实行过去,轻则没动画效果,重则程序直接crash;
属性动画要求动画作用的对象提供该属性的get和set方法,属性动画根据外界传递的该属性的初始值和最终值,以动画的效果多次去调用set方法,每次传递给set方法的值都不一样,随着时间的推移,所传递的值会越来越接近最终值;

例如,想对object的属性abc做动画,要想让动画生效,需满足两个条件:
①object必须提供setAbc()方法,如果动画的时候没有初始值,那么还要提供getAbc方法,因为系统要去取abc属性的初始值(如果不满足,会直接crash);
②object的setAbc对属性abc所做的改变必须能够通过某种方法反映出来,否则动画无效果,但不会crash;

ValueAnimator不作用于任何对象,它是对一个值做动画,如ValueAnimator.ofInt(1,100);我们可以监听它的动画过程,在它的动画过程中修改我们的对象的属性值;
如:
ValueAnimator valueAnimator = ValueAnimator.ofInt(1,100);
    valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
                
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
        //由估值器得到,当前动画的进度值
        int value = (int) animation.getAnimatedValue() ;
        //有估值器得到,当前动画进度占整个动画过程的比例
        float fraction = animation.getAnimatedFraction();
        }
    });
valueAnimator.setDuration(3000).start();

8.使用动画时的注意事项
①OOM问题
主要是帧动画
②内存泄漏
在属性动画中有一类无限循环的动画,这类动画需要在Activity退出时及时停止,否则将导致Activity无法释放从而导致内存泄漏,但是view动画并不存在此问题;
③View动画的问题
View动画是对View的影像做动画,并不是真正地改变view的状态,因此有时候会出现动画完成后View无法隐藏的情况,即setVisibility(View.GONE)失效了,这个时候只要调用view.clearAnimataion()清楚View动画即可解决此问题;
④不要使用px
在进行动画的过程中,要尽量使用dp,使用px会导致在不同的设备上有不同的效果;
⑤动画元素的交互
将view平移后,view动画,新位置将无法触犯单击时间,同时,老位置仍然可以触发单击事件;
但是属性动画的单击事件触发位置为移动后的位置;
⑥使用动画的过程中,建议开启硬件加速,这样会提高动画的流畅性;

本文来自:开源中国博客

感谢作者:果果君

查看原文:android动画

268 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet