总的来说,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:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:duration="5000"
android:fromAlpha="1.0" android:toAlpha="0.1"/>
</set>
复制代码
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:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:duration="5000"
android:fromXScale="1.0" android:fromYScale="1.0"
android:pivotX="50%" android:pivotY="50%"
android:toXScale="1.5" android:toYScale="1.5"/>
</set>
复制代码
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
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:valueFrom="1.0"
android:valueTo="0.0"
android:repeatCount="1"
android:repeatMode="reverse"
android:propertyName="alpha"
android:valueType="floatType"
/>
复制代码
- sets
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="together">
<objectAnimator
android:duration="1000"
android:valueFrom="1.0"
android:valueTo="0.0"
android:valueType="floatType"
android:propertyName="alpha"
android:repeatCount="1"
android:repeatMode="reverse"/>
<objectAnimator
android:duration="1000"
android:valueFrom="1.0"
android:valueTo="3.0"
android:valueType="floatType"
android:repeatCount="1"
android:repeatMode="reverse"
android:propertyName="scaleX"/>
</set>
复制代码
- 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();
复制代码