Android动画

安卓中的动画可以分为三种:View动画、帧动画、属性动画,下面我们来一种一种的来介绍。

1.View动画





view动画的对象是View,他有四种动画效果,这四种效果都对应着四个类

  • 平移-<translate>-TranslateAnimation
  • 缩放-<scale>-ScaleAnimation
  • 旋转-<rotate>-RotateAnimation
  • 透明-<alpha>-AlphaAnimation

看下面的代码,就知道怎么使用了,set是一个动画集合,他会执行你所有定义了的动画,也就是说下面的这些动画会同时执行,这个文件创建在 /res/anim/xxx.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
	<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true"
android:duration="500">
<!--
android:fillAfter="true" //这属性说明的的动画结束后是否停留在结束位置,true为停留,false为不停留
android:duration="500" //这个是这组动画执行的事件
-->

<!--平移动画-->
<!--
android:fromXDelta="500" //X的起始位置
android:fromYDelta="0" //Y的其实位置
android:toXDelta="0" //X的结束位置
android:toYDelta="0" //Y的结束位置
-->
<translate
android:fromXDelta="500"
android:fromYDelta="0"
android:toXDelta="0"
android:toYDelta="0"
/>


<!--缩放动画-->
<!--
android:fromXScale="1.0" //X的缩放起始值
android:fromYScale="1.0" //Y的缩放其实值
android:toXScale="1.5" //X的缩放结束值
android:toYScale="1.5" //Y的缩放结束值
android:pivotX="100" //缩放点的X轴
android:pivotY="50" //缩放点的Y轴
-->
<scale
android:fromXScale="1.0"
android:fromYScale="1.0"
android:toXScale="1.5"
android:toYScale="1.5"
android:pivotX="100"
android:pivotY="50"
/>


<!--旋转动画-->
<!--
android:fromDegrees="50" //旋转开始的角度
android:toDegrees="180" //旋转结束的角度
android:pivotX="0" //旋转的转轴X坐标
android:pivotY="0" //旋转的转轴Y坐标
-->
<rotate
android:fromDegrees="50"
android:toDegrees="180"
android:pivotX="0"
android:pivotY="0"
/>


<!--透明动画-->
<!--
android:fromAlpha="1" //起始透明
android:toAlpha="0.2" //结束透明度
-->
<alpha
android:fromAlpha="1"
android:toAlpha="0.2"
/>
</set>

那么如何使用这个动画呢?看下面

1
2
3
4
//获取你的动画
Animation animation= AnimationUtils.loadAnimation(getApplicationContext(),R.anim.my);
//使用你的动画
button.startAnimation(animation);

不仅仅只能用xml的形式来使用动画,还可以用代码的方式,嗯,代码方式难得敲了,百度找吧

1.1 layoutAnimation

我们有时候会看到一些列表有初始的进入动画,类似与下面这种,他使用的是LayoutAnimation,他的作用是给ViewGroup加上一个动画,这样它的子控件就都有这种效果了,使用这个东西首先你要定义一个layoutAnimation,这个文件创建在 /res/anim/xxx.xml


1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="10%"
android:animationOrder="normal"
android:animation="@anim/my" //这个属性是你的动画
>

</layoutAnimation>

然后在ViewGroup的 android:layoutAnimation=”@anim/layout” 加上你刚刚定义的layoutAnimation,这样子你的ViewGroup就都有出场动画了,但是有一点,在列表中的时候只有看的见的控件才有动画,看不见的是没有的,加载完成后你将它滑动显示,他是没有动画的,所以说你的动画要设计的要与这些没有动画的控件看起来协调。

1.2 Activity的切换效果

主要是通过overridePendintTransition(int enterAnim,int exitAnim)这个方法,这个方法使用在startActivity(intent),或者finish之后。
enterAnim Activity打开时调用的动画资源
exitAnim Activity被暂停调用的动画资源

2.帧动画





帧动画怎么说呢,就是一组图片,然后循环播放,它使用发放比较简单,但是比较容易引起内存泄露,所以使用帧动画应该避免过多的使用尺寸较大的图片



xml文件的代码,duration代表的是每张图片的时间
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false">
<item android:drawable="@drawable/ic_loading_white_01" android:duration="100"/>
<item android:drawable="@drawable/ic_loading_white_02" android:duration="100"/>
<item android:drawable="@drawable/ic_loading_white_03" android:duration="100"/>
<item android:drawable="@drawable/ic_loading_white_04" android:duration="100"/>
<item android:drawable="@drawable/ic_loading_white_05" android:duration="100"/>
<item android:drawable="@drawable/ic_loading_white_06" android:duration="100"/>
<item android:drawable="@drawable/ic_loading_white_07" android:duration="100"/>
<item android:drawable="@drawable/ic_loading_white_08" android:duration="100"/>
<item android:drawable="@drawable/ic_loading_white_09" android:duration="100"/>
<item android:drawable="@drawable/ic_loading_white_10" android:duration="100"/>
<item android:drawable="@drawable/ic_loading_white_11" android:duration="100"/>
<item android:drawable="@drawable/ic_loading_white_12" android:duration="100"/>
</animation-list>

然后使用它,这里是用AnimationDrawable

1
2
3
button.setBackgroundResource(R.drawable.zhen);
AnimationDrawable animationDrawable= (AnimationDrawable) button.getBackground();
animationDrawable.start();


3.属性动画


3.1 ObjectAnimator

对于View动画我们只能够对其进行平移、旋转、透明,缩放进行操作,并且View动画进行改变之后,他是没有改变View的属性的,比如,你使用平移将控件平移100,但是你去出发他的点击事件,你会发现触发不了,点击原来的位置才能够出发,这就是View动画的局限性了,所以出来了属性动画,属性动画额能够对对象的属性进行操作,所以属性动画基本上是无所能的。

ObjiecAnimator的使用有一点很重要,就是在设置他的属性的时候必须要有set方法。因为有Set方法我们才能够对它进行属性的改变。

使用方法,
1
2
3
ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(button,"translationX", 0f,1000f);
objectAnimator.setDuration(2000);
objectAnimator.start();

看到上面的代码是不是很简单呢,是的属性动画的使用方法非常简单,但是还是有一些其他的方法,来让我们更好的使用属性动画

1
2
3
4
5
objectAnimator.setEvaluator(new ArgbEvaluator());    //设置一个估值器,常用的有ArgbEvaluator\IntEvaluator\FloatEvaluator
objectAnimator.setRepeatCount(-1); //动画的重复次数 -1代表无限重复
objectAnimator.setRepeatMode(ObjectAnimator.REVERSE); //重复模式 REVERSE逆向重复 REPEAT 连续重复
objectAnimator.setDuration(2000); //动画持续时间
objectAnimator.setStartOffset(2000); //延迟时间

下面列举一些常用的属性动画

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ObjectAnimator.ofInt(button,"backgroundColor", Color.RED,Color.YELLOW,Color.BLUE);  //背景颜色的改变
ObjectAnimator.ofInt(button,"textColor", Color.RED,Color.YELLOW,Color.BLUE); //字体颜色的改变
ObjectAnimator.ofFloat(button,"textSize", 15f,30f); //字体大小

ObjectAnimator.ofFloat(button,"translationX", 0f,1000f); //X(左右)轴平移
ObjectAnimator.ofFloat(button,"translationY", 0f,1000f); //Y(上下)轴平移
ObjectAnimator.ofFloat(button,"translationZ", 0f,1000f); //Z(高度)轴平移
//这里是旋转这里注意一下他可以设置旋转的轴心,原本旋转是控件的中心,你可以通过下面两个方法来设置轴心
button.setPivotX(0);
button.setPivotY(0);
ObjectAnimator.ofFloat(button,"rotationX", 0f,1000f); //沿X旋转
ObjectAnimator.ofFloat(button,"rotationY", 0f,1000f); //沿Y旋转
ObjectAnimator.ofFloat(button,"rotation", 0f,1000f); //平面旋转
//缩放动画
ObjectAnimator.ofFloat(button,"scaleY", 1f,2F);
ObjectAnimator.ofFloat(button,"scaleX", 1f,2F);
ObjectAnimator.ofFloat(button,"textScaleX", 1f,2F); //这个是字体的缩放

ObjectAnimator.ofFloat(button,"alpha", 1f,0.2F); //透明度



3.2 ValueAnimator

ValueAnimator动画是ObjeecAnimator的父类,ObjeecAnimator的实现就是基于Value的,但是这两个类有什么区别呢?ObjeecAnimator主要是对属性的过渡操作,而Value则是对值的过渡操作。
下面给一个ValueAnimator的例子,它实现了对Button的text的改变,还有对字体大小,宽度的改变,具体的可以看看注释。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ValueAnimator valueAnimator=ValueAnimator.ofInt(1,100); //一个区间
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
IntEvaluator intEvaluator=new IntEvaluator(); //一个估值器
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
//动画过程的监听方法
int i= (int) valueAnimator.getAnimatedValue(); //获取动画当前的值
float f=valueAnimator.getAnimatedFraction(); //获取当前整个动画所占比例
button.getLayoutParams().width=intEvaluator.evaluate(f,0,600); //按照当前比例计算出所占的值 f-比例 0-初始值 600-结束值
button.setTextSize(i); //设置字体大小
button.setText(i+""); //设置值
button.requestLayout(); //当view确定自身已经不再适合现有的区域时,该view本身调用这个方法要求parent view重新调用他的onMeasure onLayout来对重新设置自己位置。
}
});
valueAnimator.setDuration(3000).start(); //设置过渡时间 启动
}
});

ValueAnimator不仅仅可以作用在改变控件上面,更多的是去改变对象的值。


3.3 AnimatorSet 这是一个动画的集合,能够同时做出集中不同的动画,看下面的例子




1
2
3
4
5
play(Animator anim):添加一个动画,并返回AnimatorSet.Builder 
playSequentially(List items):添加一组动画,播放顺序为一一播放
playSequentially(Animator… items):添加一组动画,播放顺序为一一播放
playTogether(Collection items):添加一组动画,播放顺序为一起播放
playTogether(Animator… items):添加一组动画,播放顺序为一起播放

很有意思。。

最后看看需要注意的问题: