视图动画(Animation)渐变动画,针对
View
的动画,主要支持平移、旋转、缩放、透明度
通过 View 不断的重绘实现动画
优点:使用方便,效率较高
缺点:不具备交互性,其响应事件的位置依然在动画前的地方
分类:
- 透明度(AlphaAnimation)
- 旋转(RotateAnimation)
- 缩放(ScaleAnimation)
- 位移(TranslateAnimation)
- 动画集合(AnimationSet)
均是 Animation 的子类,即可以通过XML 来定义,也可以通过代码来创建
1、透明度动画
这四种动画实现方式都是通过Animation类和AnimationUtils配合实现。
也可以通过xml实现:动画的XML文件在工程中res/anim目录。
为视图增加透明度变换的动画
AlphaAnimation aa = new AlphaAnimation(0, 1);//透明度变化范围
aa.setDuration(1000);
view.startAnimation(aa);
2、旋转动画
为视图增加旋转变换的动画
RotateAnimation ra = new RotateAnimation(0, 360, //起始角度及最终角度
100, 100);//旋转中心点的坐标
ra.setDuration(1000);
view.startAnimation(ra);
RotateAnimation ra = new RotateAnimation(0,360,
RotateAnimation.RELATIVE_TO_SELF,//设置参考系为自身中心点,也可设置为父容器为参考系
RotateAnimation.RELATIVE_TO_SELF);
3、缩放动画
为视图增加缩放变换的动画
ScaleAnimation sa = new ScaleAnimation(0, 2, 0, 2);//缩放的起始坐标及最终坐标
ScaleAnimation sa = new ScaleAnimation(0,1,0,1,
ScaleAnimation.RELATIVE_TO_SELF,//设置以自身中心为缩放中心
ScaleAnimation.RELATIVE_TO_SELF);
sa.setDuration(1000);
view.startAnimation(sa);
4、位移动画
为视图增加位移变换的动画
TranslateAnimation ta = new TranslateAnimation(0, 200, 0, 300);//位移的起始坐标及最终坐标
ta.setDuration(1000);
view.startAnimation(ta);
5、动画集合
AnimationSet 动画合集
AnimationSet as = new AnimationSet(true);
as.setDuration(1000);
AlphaAnimation aa = new AlphaAnimation(0, 1);
aa.setDuration(1000);
as.addAnimation(aa);
RotateAnimation ra = new RotateAnimation(0, 360, 100, 100);
ra.setDuration(1000);
as.addAnimation(ra);
TranslateAnimation ta = new TranslateAnimation(0, 200, 0, 300);
ta.setDuration(1000);
as.addAnimation(ta);
ScaleAnimation sa = new ScaleAnimation(0, 2, 0, 2);
sa.setDuration(1000);
as.addAnimation(sa);
view.startAnimation(as);
as.setAnimationListener(new Animation.AnimationListener() {//监听动画事件
@Override
public void onAnimationStart(Animation animation) {//开始
}
@Override
public void onAnimationEnd(Animation animation) {//结束
}
@Override
public void onAnimationRepeat(Animation animation) {//重复
}
});
这四种动画实现方式都是通过Animation类和AnimationUtils配合实现。
也可以通过xml实现:动画的XML文件在工程中res/anim目录。
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@[package:] anim/interpolator_resource"
android:shareInterpolator="true">
<!--透明度动画
fromAlpha 透明度起始值,比如0.1
toAlpha 透明度结束值,比如1
-->
<alpha
android:fromAlpha="float"
android:toAlpha="float"/>
<!--缩放动画
fromXScale 水平缩放的起始值,比如0.5
toXScale 水平缩放的结束值,比如1.2
pivotX/pivotY 中缩放心坐标点的x,y坐标
-->
<scale
android:fromXScale="float"
android:fromYScale="float"
android:toXScale="float"
android:toYScale="float"
android:pivotX="float"
android:pivotY="float"/>
<!--平移动画
fromXDelta x的起始值,比如0
toXDelta x的结束值,比如100
-->
<translate
android:fromXDelta="float"
android:fromYDelta="float"
android:toXDelta="float"
android:toYDelta="float"/>
<!--旋转动画
fromDegrees 旋转开始的角度,比如0
toDegrees 旋转结束的角度,比如180
pivotX/pivotY 中心坐标点
-->
<rotate
android:fromDegrees="float"
android:pivotX="float"
android:pivotY="float"
android:toDegrees="float"/>
<set>
....
</set>
</set>
从上可以看出,View 的视图动画既可以是单个动画,也可以是一系列动画的组合
<set> 标签表示动画集合,对应AnimationSet 类,它可以包含若干个动画,并且他的内部也是可以嵌套其它动画集合的,
他的两个属性含义如下:
interpolator:
表示动画集合所采用的插值器,插值器影响动画的速度,比如非匀速动画就需要通过插值器来控制动画的播放过程。这个属性
可以不指定,默认为@android:anim/accelerate_decelerate_interpolator,即加速减速插值器
shareInterpolator:表示集合中的动画是否和集合共享一个插值器,如果不指定插值器,则子动画就需要单独指定所需的插值器或者
使用默认值。
除了上述的属性外,View 动画还有一些常用的属性,如下
- android:duration 动画的持续时间
- android:fillAfter 动画结束后View 是否停留在结束位置,true表示 View 停留在结束位置,false则不停留
例如:
rotate.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter = "false"
android:zAdjustment="bottom"
>
<rotate
android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%"
android:duration="4000"
/>
</set>
如何应用上面的动画呢?如下所示:
Button mButton = (Button)findViewById(R。id.button);
Animation animation = AnimationUtils.loadAnimation(this,R.anim.animation_test);
mButton.startAnimation(animation);
Frame Animation(帧动画)
主要是设置
View
的背景,可以以动画的形式为
View
设置多张背景
帧动画
是顺序播放事先做好的图像,跟电影类似。
Android SDK
提供了另外一个类
AnimationDrawable
来定义使用
帧动画
。
利用
xml
文件实现:
res/drawable-hdpi/frame.xml:
<?xml version="1.0" encoding="utf-8"?>
<animation-list
xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true"
>
<item android:drawable="@drawable/p1" android:duration="1000"></item>
<item android:drawable="@drawable/p2" android:duration="1000"></item>
<item android:drawable="@drawable/p3" android:duration="1000"></item>
<item android:drawable="@drawable/p4" android:duration="1000"></item>
<item android:drawable="@drawable/p5" android:duration="1000"></item>
<item android:drawable="@drawable/p6" android:duration="1000"></item>
</animation-list>
使用动画
AnimationDrawable anim = (AnimationDrawable)getResources().
getDrawable(R.drawable.frame);
textWidget = (TextView)findViewById(R.id.text_widget);
textWidget.setText("背景渐变动画效果");
textWidget.setBackgroundDrawable(anim);
anim.start();
这里有点不同的是,利用AnimationDrawable实现动画时,本身并没有提供接口来监听动画的状态(开始,结束),需要自己处理。帧动画使用比较简单,但是比较容易引起OOM,所以在使用帧动画时应尽量避免使用过多尺寸较大的图片