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轴坐标 |
pivotXType | X轴定点数据类型, 如Animation.RELATIVE_TO_SELF/RELATIVE_TO_PARENT |
pivotY | 定点Y轴坐标 |
pivotYType | Y轴定点数据类型 |
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>
- 它必需紧挨着startActivity()或者finish()函数之后调用
- 它只在android2.0以及以上版本上适用
- 在ActivityGroup等的嵌入式Activity中,这个比较容易解决,用如下方法就可以了:this.getParent().overridePendingTransition 就可以解决。
- 在一个Activity的内部类中,或者匿名类中,这时候只好用Handler来解决了。