Android Animation

Animation


简介

Android提供了几种动画类型:View Animation (视图动画)、Drawable Animation 、Property Animation (属性动画)。
View Animation包括Tween Animation(补间动画)和Frame Animation(逐帧动画);
Property Animator包括ValueAnimator和ObjectAnimation;

xml动画 写在res/anim or res/animator

translationY //translationY改变的是布局本身的位置,而不是里面元素的位置,scrollY才能改变里面元素的位置。




ObjectAnimation

详细见/ObjectAnimator实例

学习自http://blog.csdn.net/javazejian/article/details/52273733


单种动画

ObjectAnimator oa = ObjectAnimator.ofFloat(Imgo0,"translationX",0f,200f,0f); //控件、操作的属性、初始值、目标值、目标值2...
oa.setDuration(3000);     //运行时间
oa.start();               //启动动画

针对对应
针对属性float值类型的变化ObjectAnimator.ofFloat(view,”x”,10f,100f);
针对属性int值类型的变化ObjectAnimator.ofInt(view,”x”,10,100);
针对属性颜色的变化ObjectAnimator.ofArgb(view,”backgroundColor”,0xffffff80,0xffff80fe);




多种动画

AnimatorSet set = new AnimatorSet();
set.playTogether(                                            //playTogether()多个动画一起同时执行、playSequentially()多个动画按顺序执行
    ObjectAnimator.ofFloat(Img0,"alpha",0,1,0.5f,1),     //透明度          f表示fload 浮点型
    ObjectAnimator.ofFloat(Img0,"rotation",0,360,0),     //旋转
    ObjectAnimator.ofFloat(Img0,"scaleX",0,1,1.5f,1),    //控制View对象围绕它的支点进行2D缩放
    ObjectAnimator.ofFloat(Img0,"scaleY",0,1,1.5f,1),    //控制View对象围绕它的支点进行2D缩放
    ObjectAnimator.ofFloat(Img0,"translationX",0,125),   //相对于它父容器的左上角坐标偏移的位置
    ObjectAnimator.ofFloat(Img0,"translationY",0,125),   //相对于它父容器的左上角坐标偏移的位置
    ObjectAnimator.ofFloat(Img0,"rotation",0,255),       //围绕支点进行旋转, 对应2D
    ObjectAnimator.ofFloat(Img0,"rotationX",0,255),      //围绕支点进行旋转,对应3D旋转
    ObjectAnimator.ofFloat(Img0,"rotationY",0,255),      //围绕支点进行旋转,对应3D旋转
    ObjectAnimator.ofFloat(Img0,"pivotX",0,255),         //包含旋转和缩放都围绕这个支点变换和处理。 默认值为View对象的中心
    ObjectAnimator.ofFloat(Img0,"pivotY",0,255)          //包含旋转和缩放都围绕这个支点变换和处理。 默认值为View对象的中心
);
set.setDuration(99999).start();   //99999:动画时间,毫秒为单位

多个动画还可以这样
//PropertyValuesHolder p1=PropertyValuesHolder.ofFloat("scaleX",0.5f,1);
//PropertyValuesHolder p2=PropertyValuesHolder.ofFloat("scaleY",0.5f,1);
//PropertyValuesHolder p3=PropertyValuesHolder.ofFloat("translationX",0,200f);
//ObjectAnimator.ofPropertyValuesHolder(btn,p1,p2,p3).setDuration(500).start();

多重应用
ObjectAnimator moveIn = ObjectAnimator.ofFloat(btn, "translationX", -500f, 0f);
ObjectAnimator rotate = ObjectAnimator.ofFloat(btn, "rotation", 0f, 360f);
ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(btn, "alpha", 1f, 0f, 1f);
AnimatorSet animSet = new AnimatorSet();
animSet.play(rotate).with(fadeInOut).after(moveIn);
animSet.setDuration(5000);
animSet.start();
函数(参数)内容
play(Animator anim)执行这个动画
after(Animator anim)将现有动画插入到传入的动画之后执行
after(long delay)将现有动画延迟指定毫秒后执行
before(Animator anim)将现有动画插入到传入的动画之前执行
with(Animator anim)将现有动画和传入的动画同时执行

调用写好的xml动画

xml动画 写在res/animator下
http://blog.csdn.net/javazejian/article/details/52273733#t9

<set                                                      //<set>对应AnimatorSet
  android:ordering=["together" | "sequentially"]>           //[ 默认:同时播放 | 顺序播放 ]

    <objectAnimator                                       //<objectAnimator>对应ObjectAnimator
        android:propertyName="string"                       //属性名称 比如 scaleX scaleY....
        android:valueType=["intType" | "floatType"]         //变化值类型 (如果变化颜色,则不用指定)
        android:valueFrom="float | int | color"             //变化开始值
        android:valueTo="float | int | color"               //变化结束值
    android:duration="3000"                             //动画持续时间
        android:startOffset="int"                           //动画开始延迟的时间,也就是动画多久后才开始播放
        android:repeatCount="int"                           //重复次数,-1表示无限重复
        android:repeatMode=["repeat" | "reverse"]/>         //重复模式 [ 顺序重复 | 反向重复 ]


    <animator                                             //<animator>对应ValueAnimator
        android:duration="int"
        android:valueFrom="float | int | color"
        android:valueTo="float | int | color"
        android:startOffset="int"
        android:repeatCount="int"
        android:repeatMode=["repeat" | "reverse"]
        android:valueType=["intType" | "floatType"]/>


    <objectAnimator
        android:propertyName="scaleX"
        android:duration="5000"
        android:valueFrom="0.5"
        android:valueTo="1"
        android:valueType="floatType" />


    <set>
        ...
    </set>
</set>
AnimatorSet  set= (AnimatorSet) AnimatorInflater.loadAnimator(this,R.animator.my_anim);
set.setTarget(btn);
set.start();







Tween Animation

学习自http://blog.csdn.net/harvic880925/article/details/50995268

Animation类

Animation类是所有动画(scale、alpha、translate、rotate)的基类
pivotX定点X轴坐标,可以是数值、百分数、百分数p 三种样式,比如 50、50%、50%p,当为数值时,表示在当前View的左上角,即原点处加上50px,做为起始缩放点;如果是50%,表示在当前控件的左上角加上自己宽度的50%做为起始点;如果是50%p,那么就是表示在当前的左上角加上父控件宽度的50%做为起始点x轴坐标
pivotXTypeX轴定点数据类型, 如Animation.RELATIVE_TO_SELF/RELATIVE_TO_PARENT
pivotY定点Y轴坐标
pivotYTypeY轴定点数据类型
Duration动画持续时间,以毫秒为单位
FillAfter动画结束时,将保持动画最后时的状态
FillBefore动画结束时,还原到开始动画前的状态
FillEnabled与android:fillBefore 效果相同,都是在动画结束时,将控件还原到初始化状态
RepeatCount重复次数
RepeatMode重复类型,reverse表示倒序回放,restart表示重新放一遍
Interpolator设定插值器,其实就是指定的动作效果,比如弹跳效果等

Interpolator 插值器,其实就是高级一点的动画应用

属性简介
@android:anim/accelerate_decelerate_interpolator在动画开始与介绍的地方速率改变比较慢,中间的时候加速
@android:anim/accelerate_interpolator在动画开始的地方速率改变比较慢,然后开始加速
@android:anim/anticipate_interpolator开始的时候向后然后向前甩
@android:anim/anticipate_overshoot_interpolator开始的时候向后然后向前甩一定值后返回最后的值
@android:anim/bounce_interpolator动画结束的时候弹起
@android:anim/cycle_interpolator动画循环播放特定的次数,速率改变沿着正弦曲线
@android:anim/decelerate_interpolator在动画开始的地方快然后慢
@android:anim/linear_interpolator以常量速率改变
@android:anim/overshoot_interpolator向前甩一定值后再回到原来位置




scale 大小

ScaleAnimation scaleAnim = new ScaleAnimation(fromXScale,toXScale,fromYScale,toYScale,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
scaleAnim.setDuration(700);
控件.startAnimation(scaleAnim);
Animation scaleAnimation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.scaleanim);  //加载res/anim/scaleanim.xml
控件.startAnimation(scaleAnimation); 
<?xml version="1.0" encoding="utf-8"?>  
<scale xmlns:android="http://schemas.android.com/apk/res/android"  
    android:fromXScale="0.0"  android:toXScale="1.4"  
    android:fromYScale="0.0"  android:toYScale="1.4"  
    android:pivotX="50%"  
    android:pivotY="50%"  
    android:duration="700"   
    android:fillBefore="true"  
    android:repeatCount="1"  
    android:repeatMode="reverse"  
/>  
属性效果
fromXScale起始的X方向上相对自身的缩放比例,浮点值,比如1.0代表自身无变化,0.5代表起始时缩小一倍,2.0代表放大一倍
toXScale结尾的X方向上相对自身的缩放比例,浮点值
fromYScale起始的Y方向上相对自身的缩放比例,浮点值
toYScale结尾的Y方向上相对自身的缩放比例,浮点值




alpha 透明度

alphaAnim = new AlphaAnimation(1.0f,0.1f);
alphaAnim.setDuration(3000);
alphaAnim.setFillBefore(true);
控件.startAnimation(alphaAnim);
属性效果
android:fromAlpha动画开始的透明度,从0.0 –1.0 ,0.0表示全透明,1.0表示完全不透明
android:toAlpha动画结束时的透明度,也是从0.0 –1.0 ,0.0表示全透明,1.0表示完全不透明




rotate 旋转

rotateAnim = new RotateAnimation(fromDegrees, toDegrees, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
rotateAnim.setDuration(3000);
rotateAnim.setFillAfter(true);
控件.startAnimation(rotateAnim);
属性效果
android:fromDegrees开始旋转的角度位置,正值代表顺时针方向度数,负值代码逆时针方向度数
android:toDegrees结束时旋转到的角度位置,正值代表顺时针方向度数,负值代码逆时针方向度数




translate标签 —— 平移

translateAnim = new TranslateAnimation(Animation.ABSOLUTE, fromXDelta, Animation.ABSOLUTE, toXDelta, Animation.ABSOLUTE, fromYDelta, Animation.ABSOLUTE, toYDelta);
translateAnim.setDuration(2000);
translateAnim.setFillBefore(true);
控件.startAnimation(translateAnim);
属性效果
android:fromXDelta起始点X轴坐标,可以是数值、百分数、百分数p 三种样式,比如 50、50%、50%p
android:fromYDelta起始点Y轴从标,可以是数值、百分数、百分数p 三种样式
android:toXDelta结束点X轴坐标
android:toYDelta结束点Y轴坐标




同时使用几种动画

AnimationSet setAnim=new AnimationSet(true);  
setAnim.addAnimation(scaleAnim);
setAnim.addAnimation(alphaAnim);
setAnim.addAnimation(rotateAnim);
setAnim.addAnimation(translateAnim);

setAnim.setInterpolator(new BounceInterpolator());        //插值器
bounce_interpolator == BounceInterpolator() //_去掉 第一个字母大写

setAnim.setDuration(3000);
setAnim.setFillAfter(true);
控件.startAnimation(setAnim);
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000">
    <translate android:fromXDelta="-50%p" android:toXDelta="0"/>
    <alpha android:fromAlpha="0.0" android:toAlpha="1.0"/>
</set>







应用动画


ListView项目载入动画

//创建动画
AnimationSet animation= new AnimationSet(true);
animation.addAnimation(new TranslateAnimation(-100f, 0f, 0f, 0f));
animation.addAnimation(new AlphaAnimation(0.0f,1.0f));
animation.setDuration(1000);   //动画时间
animation.setFillAfter(true);  //不复位
//放入ListView
LayoutAnimationController controller = new LayoutAnimationController(animation);   //创建一个LayoutAnimationController对象;
controller.setOrder(LayoutAnimationController. ORDER_NORMAL);   //设置显示顺序; ORDER_NORMAL:正序、ORDER_REVERSE:倒序、ORDER_RANDOM:随机 
controller.setDelay(0.3f);                                      //设置每个Item动画的间隔时间
myListView.setLayoutAnimation(controller);
myListView.startLayoutAnimation(); //开始载入动画




Activity(界面)切换动画

Activity的切换动画指的是从一个activity跳转到另外一个activity时的动画

//overridePendingTransition(第一个activity退出时的动画, 第二个activity进入时的动画)
overridePendingTransition(R.anim.out_left,R.anim.in_right);//原来的界面从左边退出,新的界面从右边进来

in_right.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
    android:fromXDelta="-100%"
    android:toXDelta="0%"
    android:duration="300"/>
</set>

out_left.xml

<?xml version="1.0"encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
    android:fromXDelta="0%p"
    android:toXDelta="-100%p"
    android:duration="500"/>
</set>
  1. 它必需紧挨着startActivity()或者finish()函数之后调用
  2. 它只在android2.0以及以上版本上适用
  3. 在ActivityGroup等的嵌入式Activity中,这个比较容易解决,用如下方法就可以了:this.getParent().overridePendingTransition 就可以解决。
  4. 在一个Activity的内部类中,或者匿名类中,这时候只好用Handler来解决了。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值