赞
踩
Android提供了2中动画
1.Tween动画,通过对View的内容进行一系列的图形变换(包括平移,缩放,旋转,改变透明度)来实现动画的效果,动画效果的定义可以采用XML方式也可以采用编码来做Tween动画有4种类型:
动画的类型 | Xml定义动画使用的配置节点 | 编码定义动画使用的类 |
渐变透明度动画效果 | <alpha/> | AlphaAnimation |
渐变尺寸缩放动画效果 | <scale/> | ScaleAnimation |
画面位置移动动画效果 | <translate/> | TranslateAnimation |
画面旋转动画效果 | <rotate/> | RotateAnimation |
2.Frame动画,即事先播放先做好的图像,跟放胶片电影类似,开发步骤:
(1)把准备好的图片放进项目res/ drawable下。
(2)在项目的res目录下创建文件夹anim,然后在anim文件夹下面定义动画XML文件,文件名称可以自定义。当然也可以采用编码方式定义动画效果(使用AnimationDrawable类)。
(3)为View控件绑定动画效果。调用代表动画的AnimationDrawable的start()方法开始动画。
本例要实现对ImageView对象进行渐变尺寸缩放动画效果
1> 在项目的res目录下创建文件夹anim,然后在anim文件夹下面定义动画XML文件,文件名称可以自定义,如:scale.xml,内容如下:
- <?xml version="1.0" encoding="utf-8"?>
- <set xmlns:android="http://schemas.android.com/apk/res/android">
- <scale android:interpolator="@android:anim/accelerate_decelerate_interpolator"
- android:fromXScale="0.0"
- android:fromYScale="0.0"
- android:toXScale="5"
- android:toYScale="5"
- android:pivotX="50%"
- android:pivotY="50%"
- android:fillAfter="false"
- android:duration="5000"
- />
- </set>
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <ImageView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/icon"
- android:id="@+id/imageView"
- />
- </LinearLayout>
- public class AnimationActivity extends Activity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- ImageView imageView = (ImageView)this.findViewById(R.id.imageView);
- //加载动画XML文件,生成动画指令
- Animation animation = AnimationUtils.loadAnimation(this, R.anim.scale);
- //开始执行动画
- imageView.startAnimation(animation);
- }
- }
- public class AnimationActivity extends Activity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- ImageView imageView = (ImageView)this.findViewById(R.id.imageView);
- ScaleAnimation animation = new ScaleAnimation(0.0f, 5f, 0.0f, 5f,
- Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
- animation.setDuration(5000); //设置持续时间5秒
- imageView.startAnimation(animation);
- }
- }
- <?xml version="1.0" encoding="utf-8"?>
- <set xmlns:android="http://schemas.android.com/apk/res/android">
- <alpha
- android:fromAlpha="0.1"
- android:toAlpha="1.0"
- android:duration="3000"
- />
- </set>
- public class AnimationActivity extends Activity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- ImageView imageView = (ImageView)this.findViewById(R.id.imageView);
- AlphaAnimation animation = new AlphaAnimation(0.1, 1.0);
- animation.setDuration(5000); //设置持续时间5秒
- imageView.startAnimation(animation);
- }
- }
- <?xml version="1.0" encoding="utf-8"?>
- <set xmlns:android="http://schemas.android.com/apk/res/android">
- <translate
- android:repeatCount="2"
- android:fromXDelta="0"
- android:fromYDelta="0"
- android:toXDelta="120"
- android:toYDelta="120"
- android:duration="3000"
- />
- <!-- fromXDelta fromYDelta 为动画起始时 X和Y坐标上的位置
- toXDelta toYDelta为动画结束起始时 X和Y坐标上的位置
- -->
- </set>
编码实现位置移动动画效果:
- public class AnimationActivity extends Activity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- ImageView imageView = (ImageView)this.findViewById(R.id.imageView);
- TranslateAnimation animation = new TranslateAnimation(0, 120, 0, 120);
- animation.setDuration(5000); //设置持续时间5秒
- imageView.startAnimation(animation);
- }
- }
=================画面旋转动画效果======================
- <?xml version="1.0" encoding="utf-8"?>
- <set xmlns:android="http://schemas.android.com/apk/res/android">
- <rotate
- android:interpolator="@android:anim/accelerate_interpolator"
- android:repeatCount="2"
- android:fromDegrees="0"
- android:toDegrees="+360"
- android:pivotX="50%"
- android:pivotY="50%"
- android:duration="3000"
- />
- <!--
- repeatCount 重复次数
- fromDegrees为动画起始时物件的角度:
- 当角度为负数——表示逆时针旋转
- 当角度为正数——表示顺时针旋转
- (负数fromDegrees——toDegrees正数:顺时针旋转)
- (负数fromDegrees——toDegrees负数:逆时针旋转)
- (正数fromDegrees——toDegrees正数:顺时针旋转)
- (正数fromDegrees——toDegrees负数:逆时针旋转)
- toDegrees属性为动画结束时物件旋转的角度 可以大于360度
- pivotX,pivotY 为动画相对于物件的X、Y坐标的开始位.说明:以上两个属性值 从0%-100%中取值,50%为物件的X或Y方向坐标上的中点位置
- -->
- </set>
- RotateAnimation animation = new RotateAnimation(0, -90, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
- animation.setDuration(500);
- imageView.startAnimation(animation);
- <?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/girl_1" android:duration="200" />
- <item android:drawable="@drawable/girl_2" android:duration="200" />
- <item android:drawable="@drawable/girl_3" android:duration="200" />
- </animation-list>
上面的XML就定义了一个Frame动画,其包含3帧动画,3帧动画中分别应用了drawable中的3张图片:girl_1.gif, girl_2.gif, girl_3.gif,每帧动画持续200毫秒。android:oneshot属性如果为true,表示动画只播放一次停止在最后一帧上,如果设置为false表示动画循环播放。
- public class FrameActivity extends Activity {
- private AnimationDrawable animationDrawable;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- ImageView imageView = (ImageView)this.findViewById(R.id.imageView);
- imageView.setBackgroundResource(R.anim.frame);
- animationDrawable = (AnimationDrawable) imageView.getBackground();
- }
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- if (event.getAction() == MotionEvent.ACTION_DOWN) {//按下
- animationDrawable.start();
- return true;
- }
- return super.onTouchEvent(event);
- }
- }
有一点需要强调的是:启动Frame动画的代码animationDrawable.start();不能应用在OnCreate()方法中,因为在OnCreate()中 AnimationDrawable还没有完全的与ImageView绑定。在OnCreate()中启动动画,只能看到第一张图片。这里在触摸事件中实现的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。