总的来说,Android动画可以分为两类,最初的传统动画和Android3.0 之后出现的属性动画; 传统动画又包括 帧动画(Frame Animation)和补间动画(Tweened Animation)。
1. View Animator
Animation类 是所有动画(scale、alpha、translate、rotate)的基类,这里以scale标签为例,讲解一下,Animation类所具有的属性及意义。
- android:duration 动画持续时间,以毫秒为单位
- android:fillAfter 如果设置为true,控件动画结束时,将保持动画最后时的状态
- android:fillBefore 如果设置为true,控件动画结束时,还原到开始动画前的状态
- android:fillEnabled 与android:fillBefore 效果相同,都是在动画结束时,将控件还原到初始化状态
- android:repeatCount 重复次数
- android:repeatMode 重复类型,有reverse和restart两个值,reverse表示倒序回放,restart表示重新放一遍,必须与repeatCount一起使用才能看到效果。因为这里的意义是重复的类型,即回放时的动作。
- android:interpolator 设定插值器,其实就是指定的动作效果,比如弹跳效果等,不在这小节中讲解,后面会单独列出一单讲解。
分类:
1.1 alpha 渐变透明度动画效果
- android:fromAlpha 动画开始的透明度,从0.0 --1.0 ,0.0表示全透明,1.0表示完全不透明
- android:toAlpha 动画结束时的透明度,也是从0.0 --1.0 ,0.0表示全透明,1.0表示完全不透明
Example:
复制代码
AlphaAnimation alphaAnim = new AlphaAnimation(1.0f, 0.1f);复制代码
1.2 scale 渐变尺寸伸缩动画效果
XML参数说明:
- android:fromXScale 起始的X方向上相对自身的缩放比例,浮点值,比如1.0代表自身无变化,0.5代表起始时缩小一倍,2.0代表放大一倍;
- android:toXScale 结尾的X方向上相对自身的缩放比例,浮点值;
- android:fromYScale 起始的Y方向上相对自身的缩放比例,浮点值,
- android:toYScale 结尾的Y方向上相对自身的缩放比例,浮点值;
- android:pivotX 缩放起点X轴坐标,可以是数值、百分数、百分数p 三种样式,比如 50、50%、50%p,当为数值时,表示在当前View(如果当前为按键点击来切换页面,则这个View是button)的左上角,即原点处加上50px,做为起始缩放点;如果是50%,表示在当前控件的左上角加上自己宽度的50%做为起始点;如果是50%p,那么就是表示在当前的左上角加上父控件宽度的50%做为起始点x轴坐标。
- android:pivotY 缩放起点Y轴坐标,取值及意义跟android:pivotX一样。 关于pivotX和pivotY设置为'%p'的时候的原点为屏幕的左上角,向右为x正方向,向下为y正方向
Example:
复制代码
ImageView img = (ImageView) findViewById(R.id.img);Animation scaleAnimation = AnimationUtils.loadAnimation(this, R.anim.scale_anim);img.startAnimation(scaleAnimation);复制代码
也可以直接用代码设置:
ScaleAnimation scaleAnim2 = new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);复制代码
1.3 translate 画面转换位置移动动画效果
- android:fromXDelta 起始点X轴坐标,可以是数值、百分数、百分数p 三种样式,比如 50、50%、50%p,具体意义已在scale标签中讲述,这里就不再重讲
- android:fromYDelta 起始点Y轴从标,可以是数值、百分数、百分数p 三种样式;
- android:toXDelta 结束点X轴坐标
- android:toYDelta 结束点Y轴坐标
1.4 rotate 画面转移旋转动画效果
- android:fromDegrees 开始旋转的角度位置,正值代表顺时针方向度数,负值代码逆时针方向度数
- android:toDegrees 结束时旋转到的角度位置,正值代表顺时针方向度数,负值代码逆时针方向度数
- android:pivotX 缩放起点X轴坐标,可以是数值、百分数、百分数p 三种样式,比如 50、50%、50%p,具体意义已在scale标签中讲述,这里就不再重讲
- android:pivotY 缩放起点Y轴坐标,可以是数值、百分数、百分数p 三种样式,比如 50、50%、50%p
1.5 Animation Set
AlphaAnimation alphaAnim = new AlphaAnimation(1.0f, 0.1f);ScaleAnimation scaleAnim2 = new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);RotateAnimation rotateAnim = new RotateAnimation(0, 720, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);xy.addAnimation(alphaAnim);xy.addAnimation(rotateAnim);xy.addAnimation(scaleAnim2);xy.setDuration(3000);btn_xml.startAnimation(xy);复制代码
2. Property Animation
Property Animation 也可以用xml来定义,property的xml放在 res/animator 下。
2.1 xml设置
- alpha
复制代码
- sets
复制代码
- Java代码中调用
载入 ObjectAnimator 动画 (1)通过AnimatorInflater.loadAnimator载入, (2)注意需要设置 setTarget (3)和代码一样的道理,属性值也可以在代码中动态修改 (4)新建的动画类的类别必须跟XML文件中的根标签对应
ObjectAnimator xxx = (ObjectAnimator) AnimatorInflater.loadAnimator(MainActivity.this, R.animator.test_object_animator);xxx.setTarget(v);xxx.start();复制代码
2.2 java设置
- 设置单一的 ObjectAnimator
ObjectAnimator anim = ObjectAnimator //新建ObjectAnimator .ofFloat(v, "alpha", 1.0f, 0.0f,1.0f) //设置变化的值从3.0f到0.0f .setDuration(1000); //设置变化时间anim.setRepeatCount(1); //设置重复次数anim.setRepeatMode(ObjectAnimator.REVERSE); //设置重复模式anim.setTarget(v); //绑定控件,可以不用设置btn_java.setPivotX(0); //设置变化的中心btn_java.setPivotX(0);anim.start(); //开启动画复制代码
- 设置单一的动画,ValueAnimator,必须要在addUpdateListener中更新控件的属性,不然没有任何效果
ValueAnimator animator = ValueAnimator .ofFloat(3.0f,0.0f) .setDuration(1000);animator.setRepeatCount(1);animator.setRepeatMode(ValueAnimator.RESTART);animator.setTarget(v);animator.start();animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float x = (Float) animation.getAnimatedValue(); v.setAlpha(x); //设置透明度 v.setScaleX(x); //设置X轴 v.setScaleY(x); //设置Y轴 }});复制代码
- 设置动画集,AnimatorSet
AnimatorSet set = new AnimatorSet();set.setDuration(1000);set.play(anim);set.play(animator);set.playTogether(anim, animator); //设置两个动画一起运行set.start();复制代码