Android 动画-基础篇

一、概述

Android动画大致为三种:

  1. Tween Animation:补间动画,(View)通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果,即是一种渐变动画。
  2. Frame Animation:逐帧动画,(Drawable)顺序播放事先做好的图像,是一种画面转换动画。
  3. Property Animation:属性动画,通过动态地改变对象的属性从而达到动画效果,属性动画为API 11新特性。

1、Tween Animation(View)对View进行操作,有四种形式:

 - alpha        渐变透明度动画效果
 - scale        渐变尺寸伸缩动画效果
 - translate    画面位置移动动画效果
 - rotate       画面旋转动画效果

这四种动画实现方式都是通过Animation类和AnimationUtils配合实现。可以通过xml实现:动画的XML文件在工程中res/anim目录
如:anim.xml

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <alpha 
            fromAlpha ---- 透明度起始值,0表示完全透明
            toAlpha ---- 透明度最终值,1表示不透明/>
    <scale  
            fromXScale ---- 水平方向缩放的起始值,比如0
            fromYScale ---- 竖直方向缩放的起始值,比如0
            toXScale ---- 水平方向缩放的结束值,比如2
            toYScale ---- 竖直方向缩放的结束值,比如2
            pivotX ---- 缩放支点的x坐标
            pivotY ---- 缩放支点的y坐标(支点可以理解为缩放的中心点,缩放过程中这点的坐标是不变的;支点默认在中心位置)/>
    <translate 
            fromXDelta ---- x起始值
            toXDelta ---- x结束值
            fromYDelta ---- y起始值
            toYDelta ---- y结束值/>
    <rotate 
            fromDegrees ---- 旋转起始角度
            toDegrees ---- 旋转结束角度/> 
</set>

使用动画

Animation animation = AnimationUtils.loadAnimation(that,R.anim.anim);
animation.setDuration(300);
animation.setAnimationListener(new Animation.AnimationListener() { //动画状态监听
   @Override
   public void onAnimationStart(Animation animation) {
   }
   @Override
   public void onAnimationEnd(Animation animation) {
   }
   @Override
   public void onAnimationRepeat(Animation animation) {
    }
});
mAnimView.setAnimation(animation);

2、Frame Animation (drawable):

Frame Animation是顺序播放事先做好的图像,操作的drawable,使用较多的场景是自定义的loading效果,使用AnimationDrawable来实现定义的Frame Animation。
xml文件:res/drawable/frame.xml:

<?xml version="1.0" encoding="utf-8"?>    
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"  
android:oneshot="true"  >  
<item android:drawable="@drawable/p1" android:duration="500"/>  
<item android:drawable="@drawable/p2" android:duration="500"/> 
<item android:drawable="@drawable/p3" android:duration="500"/>  
<item android:drawable="@drawable/p4" android:duration="500"/>  
</animation-list>

使用动画:

AnimationDrawable anim = (AnimationDrawable)getResources().  
getDrawable(R.drawable.frame);  
textWidget.setBackgroundDrawable(anim);  
anim.start();

3、Property Animation(Android SDK >= 3.0)对对象属性进行操作的动画

属性动画要求动画作用的对象提供该属性的get和set方法,属性动画根据你传递的该熟悉的初始值和最终值,以动画的效果多次去调用set方法,每次传递给set方法的值都不一样,确切来说是随着时间的推移,所传递的值越来越接近最终值。总结一下,你对object的属性xxx做动画,如果想让动画生效,要同时满足两个条件:

  1. object必须要提供setXxx方法,如果动画的时候没有传递初始值,那么还要提供getXxx方法,因为系统要去拿xxx属性的初始值(如果这条不满足,程序直接Crash)
  2. object的setXxx对属性xxx所做的改变必须能够通过某种方法反映出来,比如会带来ui的改变啥的(如果这条不满足,动画无效果但不会Crash)

相关的类:

  • ObjectAnimator
  • ValueAnimator
  • AnimatorSet
  • AnimatorInflater
  • TimeInterpolator
  • TypeEvaluator

1、ObjectAnimator

ObjectAnimator.ofFloat(myObject,"translationY",myObject.getHeight()).start();

改变一个对象(myObject)的 translationY属性,让其沿着Y轴向上平移一段距离。

2、ValueAnimator

ValueAnimator colorAnim = ValueAnimator.ofInt(this, "backgroundColor", 0xFFFF8080, 0xFF8080FF);  
colorAnim.setDuration(3000);  
colorAnim.setEvaluator(new ArgbEvaluator());  
colorAnim.setRepeatCount(ValueAnimator.INFINITE);  
colorAnim.setRepeatMode(ValueAnimator.REVERSE);  
colorAnim.start();

改变一个对象的背景颜色,并且动画无限循环且有反转效果。

1,2小结:对于ObjectAnimator和ValueAnimator,ObjectAnimator是继承ValueAnimator的。都提供了ofInt、ofFloat、ofObject,这几个方法都是设置动画作用的元素、作用的属性、动画开始、结束、以及中间的任意个属性值。

3、AnimatorSet

public void togetherRun(View view)  
    {  
        ObjectAnimator anim1 = ObjectAnimator.ofFloat(view, "scaleX",  
                1.0f, 2f);  
        ObjectAnimator anim2 = ObjectAnimator.ofFloat(view, "scaleY",  
                1.0f, 2f);  
        AnimatorSet animSet = new AnimatorSet();  
        animSet.setDuration(2000);  
        animSet.setInterpolator(new LinearInterpolator());  
        //两个动画同时执行  
        animSet.playTogether(anim1, anim2);  
        animSet.start();  
    }  
  
    public void playWithAfter(View view)  
    {  
        float cx = mBlueBall.getX();  
  
        ObjectAnimator anim1 = ObjectAnimator.ofFloat(view, "scaleX",  
                1.0f, 2f);  
        ObjectAnimator anim2 = ObjectAnimator.ofFloat(view, "scaleY",  
                1.0f, 2f);  
        ObjectAnimator anim3 = ObjectAnimator.ofFloat(view,  
                "x",  cx ,  0f);  
        ObjectAnimator anim4 = ObjectAnimator.ofFloat(view,  
                "x", cx);  
          
        /** 
         * anim1,anim2,anim3同时执行 
         * anim4接着执行 
         */  
        AnimatorSet animSet = new AnimatorSet();  
        animSet.play(anim1).with(anim2);  
        animSet.play(anim2).with(anim3);  
        animSet.play(anim4).after(anim3);  
        animSet.setDuration(1000);  
        animSet.start();  
    }

两个效果:
第一:使用playTogether两个动画同时执行,当然还有playSequentially依次执行。
第二:如果我们有很多动画,如何使用代码控制顺序,比如1,2同时;3在2后面;4在1之前等

4、AnimatorInflater
使用AnimatorInflater加载动画的资源文件,然后设置目标就可以了!提供一个大神的链接,里面有详情讲解,还有一个LayoutTransition布局动画的可以参考:
http://blog.csdn.net/lmj623565791/article/details/38092093

5、TimeInterpolator
TimeInterpolator中文翻译为时间插值器,它的作用是根据时间流逝的百分比来计算出当前属性值改变的百分比,系统预置的有LinearInterpolator(线性插值器:匀速动画)、AccelerateDecelerateInterpolator(加速减速插值器:动画两头慢中间快)和DecelerateInterpolator(减速插值器:动画越来越慢)等

6、TypeEvaluator
TypeEvaluator的中文翻译为类型估值算法,它的作用是根据当前属性改变的百分比来计算改变后的属性值,系统预置的有IntEvaluator(针对整型属性)、FloatEvaluator(针对浮点型属性)和ArgbEvaluator(针对Color属性)。

说明:属性动画要求该属性有set方法和get方法(可选);插值器和估值算法除了系统提供的外,我们还可以自定义,实现方式也很简单,因为插值器和估值算法都是一个接口,且内部都只有一个方法,我们只要派生一个类实现接口就可以了,然后你就可以做出千奇百怪的动画效果。具体一点就是:自定义插值器需要实现Interpolator或者TimeInterpolator,自定义估值算法需要实现TypeEvaluator。还有就是如果你对其他类型(非int、float、color)做动画,你必须要自定义类型估值算法。

总结

使用类 作用 备注
ValueAnimator 先改变值,然后 手动赋值 给对象的属性 本质是对值的操作
ObjectAnimator 先改变值,然后 自动赋值 给对象的属性 采用get() & set() 进行自动赋值
AnimatorSet 实现 组合动画
ViewPropertyAnimator 采用对对象操作 实现属性动画
addListener() 动画监听器 监听动画开始、结束、取消、重复时刻 可采用动画适配器(AnimatorListenterAdapter)按需监听动画
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容