视图动画(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,所以在使用帧动画时应尽量避免使用过多尺寸较大的图片