首页 > 代码库 > Android Animations简介
Android Animations简介
一 、Animations简介
Animations提供了一系列的动画效果,这些效果可以应用于绝大多数的控件;
二、Animations的分类
第一类:TweenedAnimations,该类Animations提供了旋转,移动,淡入淡出和缩放等效果;
第二类:Frame-by-Frame Animations,这类Animations可以创建一个Drawable序列,这些Drawable可以按照指定的时间间歇一个个的显示;
TweenedAnimations介绍
(1)TweenedAnimations可以分为下面几类:
1. Alpha:淡入淡出效果
2. Scale:缩放效果
3. Rotate:旋转效果
4. Translate:移动效果
(2)Animations的使用方法:
一种是在Java代码中使用,另一种是定义在XML文件中;
(3)在Java代码中使用步骤为:
a) 创建一个AnimationSet对象;
b)根据需要创建相应的Animation对象;
c)根据软件动画的需求,为Animation对象设置相应的数据;
d)将Animation对象添加到AnimationSet对象当中;
e)使用控件对象开始执行AnimationSet;
而Animation在代码中对应的四个子类分别为:
AlphaAnimation、TranslateAnimation、ScaleAnimation、RotateAnimation
例子:
效果图不好传,就不传了;
代码如下:
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.xiaozhang.animationtest.MainActivity" > <Button android:id="@+id/scaleButtonId" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:text="scale动画效果" /> <Button android:id="@+id/rotateButtonId" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_above="@id/scaleButtonId" android:text="rotate动画效果" /> <Button android:id="@+id/alphaButtonId" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_above="@id/rotateButtonId" android:text="alpha动画效果" /> <Button android:id="@+id/translateButtonId" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_above="@id/alphaButtonId" android:text="translate动画效果" /> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ImageView android:id="@+id/imageViewId" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="100dp" android:src="@drawable/icon" /> </LinearLayout></RelativeLayout>
MainActivity.java
package com.xiaozhang.animationtest;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.view.animation.AlphaAnimation;import android.view.animation.Animation;import android.view.animation.AnimationSet;import android.view.animation.RotateAnimation;import android.view.animation.ScaleAnimation;import android.view.animation.TranslateAnimation;import android.widget.ImageView;public class MainActivity extends Activity { private ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.imageViewId); imageView = (ImageView) findViewById(R.id.imageViewId); findViewById(R.id.rotateButtonId).setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { AnimationSet animationSet = new AnimationSet(true); RotateAnimation rotateAnimation = new RotateAnimation( 0, 360, Animation.RELATIVE_TO_PARENT, 0.3f, Animation.RELATIVE_TO_PARENT, 0.3f); rotateAnimation.setDuration(1000); animationSet.addAnimation(rotateAnimation); imageView.startAnimation(animationSet); } }); findViewById(R.id.scaleButtonId).setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { AnimationSet animationSet = new AnimationSet(true); ScaleAnimation scaleAnimation = new ScaleAnimation(1, 0.0f, 1, 0.0f, Animation.RELATIVE_TO_PARENT, 0.1f, Animation.RELATIVE_TO_PARENT, 0.1f); scaleAnimation.setDuration(1000); animationSet.addAnimation(scaleAnimation); imageView.startAnimation(animationSet); } }); findViewById(R.id.alphaButtonId).setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { // 创建一个AnimationSet对象 AnimationSet animationSet = new AnimationSet(true); // 创建一个AlphaAnimation对象 AlphaAnimation alphaAnimation = new AlphaAnimation(0, 1); // 设置整个动画执行所需要的时间 alphaAnimation.setDuration(2000); // 将AlphaAnimation对象添加到AnimationSet当中 animationSet.addAnimation(alphaAnimation); // 使用控件执行动画效果 imageView.startAnimation(alphaAnimation); } }); findViewById(R.id.translateButtonId).setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { AnimationSet animationSet = new AnimationSet(true); TranslateAnimation translateAnimation = new TranslateAnimation( Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 1.0f); translateAnimation.setDuration(1000); animationSet.addAnimation(translateAnimation); imageView.startAnimation(translateAnimation); } }); }}
另外,Animation或AnimationSet有一系列的方法,如:
setDuration(long) :设置动画持续时间(单位:毫秒)
setFillAfter(boolean) :如果参数为true,则动画执行结束后,控件将停留在结束的状态
setFillBefore(boolean) :如果参数为true,则动画执行结束后,控件将回到执行前的状态
setStartOffset(long) :设置动画执行前的等待时间
setRepeatCount(int) :设置动画重复执行的次数
(4)使用XML文件来执行Animation;
a)在res文件夹下新建一个名为anim的文件夹;
b)为各个不同的效果分别创建xml文件,并首先加入set标签,标签代码如下:
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator" ></set>
c)在该标签中分别加入rotate,alpha,scale或translate标签;
d)在代码当中使用AnimationUtils装载xml文件,并生成Animation对象;
例子如上,代码如下:
res/anim/alpha.xml
<?xml version="1.0" encoding="UTF-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator" > <alpha android:duration="500" android:fromAlpha="1.0" android:startOffset="1000" android:toAlpha="0.0" /></set>
res/anim/scale.xml
<?xml version="1.0" encoding="UTF-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator" > <scale android:duration="2000" android:fromXScale="1.0" android:fromYScale="1.0" android:pivotX="50%" android:pivotY="50%" android:toXScale="0.0" android:toYScale="0.0" /></set>
res/anim/rotate.xml
<?xml version="1.0" encoding="UTF-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator" > <rotate android:duration="3000" android:fromDegrees="0" android:pivotX="50%" android:pivotY="50%" android:toDegrees="+350" /></set>
res/anim/translate.xml
<?xml version="1.0" encoding="UTF-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator" > <translate android:fromXDelta="50%" android:toXDelta="100%" android:fromYDelta="0%" android:toYDelta="100%" android:duration="2000" /></set>
MainActivity.java
package com.xiaozhang.animationtest;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.view.animation.Animation;import android.view.animation.AnimationUtils;import android.widget.ImageView;public class MainActivity extends Activity { private ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.imageViewId); imageView = (ImageView) findViewById(R.id.imageViewId); findViewById(R.id.rotateButtonId).setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { Animation animation = AnimationUtils.loadAnimation( MainActivity.this, R.anim.rotate); imageView.startAnimation(animation); } }); findViewById(R.id.scaleButtonId).setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { Animation animation = AnimationUtils.loadAnimation( MainActivity.this, R.anim.alpha); imageView.startAnimation(animation); } }); findViewById(R.id.alphaButtonId).setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { Animation animation = AnimationUtils.loadAnimation( MainActivity.this, R.anim.scale); imageView.startAnimation(animation); } }); findViewById(R.id.translateButtonId).setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { Animation animation = AnimationUtils.loadAnimation( MainActivity.this, R.anim.translate); imageView.startAnimation(animation); } }); }}
不过需注意的是:
rotate.xml文件中android:pivotX的值共有三种设置方法:
1.android:pivotX="50" 这种方法使用绝对位置定位;
2.android:pivotX="50%" 这种方法相对于控件本身定位;
3.android:pivotx="50%p" 这种方法相对于控件的父控件定位;
Android Animations简介