首页 > 代码库 > 第二十六讲:Android之Animation

第二十六讲:Android之Animation

懒惰象生锈一样,比操劳更能消耗身体;经常用的钥匙,总是亮闪闪的。 —— 富兰克林


本讲内容:Animation 动画

一、Android中动画的实现分两种方式,一种方式是补间动画 Tween Animation,就是说你定义一个开始和结束,中间的部分由程序运算得到。另一种叫逐帧动画 Frame Animation,就是说一帧一帧的连起来播放就变成了动画。和放电影的机制很相似,下面我们逐个学习。

下面引用官方文档


从图我们可以知道Animation的直接子类有AlphaAnimationAnimationSet、RotateAnimation、ScaleAnimation、TranslateAnimation。其中AnimationSet包含一系列的Animation。


二、Tween动画是操作某个控件让其展现出旋转()、渐变、移动、缩放的这么一种转换过程。我们可以以XML形式定义动画,也可以编码实现。


三、Tween Animation共同的节点属性


属性[类型]

功能 备注
Duration[long]动画持续时间毫秒为单位
fillAfter [boolean]当设置为true动画执行后,控件将停留在执行结束的状态
fillBefore[boolean]当设置为true动画执行后,控件将停留在执行之前的状态
repeatCount[int]动画的重复次数 
RepeatMode[int]定义重复的行为1:重新开始  2:plays backward
startOffset[long]动画执行之前的等待时间毫秒为单位
   
   

四、alpha  渐变透明度动画效果(范围在0.0和1.0之间,分别代表透明和完全不透明

android:fromAlpha="1.0"代表起始alpha值浮点值,范围在0.0和1.0之间
android:toAlpha="0.0"代表结尾alpha值浮点值,范围也在0.0和1.0之间。
android:duration="500"动画持续时间毫秒为单位
   


五、scale 渐变尺寸伸缩动画效果(浮点值,比如1.0代表自身无变化,0.5代表起始时缩小一倍,2.0代表放大一倍

android:fromXScale起始的X方向上相对自身的缩放比例浮点值,范围在0.0和1.0之间
android:toXScale结尾的X方向上相对自身的缩放比例 
android:fromYScale起始的Y方向上相对自身的缩放比例 
android:toYScale结尾的Y方向上相对自身的缩放比例 
android:pivotX缩放的中轴点X坐标如果想表示中轴点为图像的中心,
android:pivotY缩放的中轴点Y坐标可以把两个属性值定义成0.5或者50%。

android:pivotX属性代表旋转中心的X坐标值,android:pivotY属性代表旋转中心的Y坐标值,
这两个属性也有三种表示方式,
数字方式代表相对于自身左边缘的像素值,(绝对位置定位)Ainmation.ABSOLUTE
num%方式代表相对于自身左边缘或顶边缘的百分比,(相对于控件本身定位)Ainmation.RELATIVE_TO_SELF
num%p方式代表相对于父容器的左边缘或顶边缘的百分比。(相对于父控件) Ainmation.RELATIVE_TO_PARENF


六、translate  画面转换位置移动动画效果(代表一个水平、垂直的位移

android:fromXDelta起始X方向的位置浮点数、num%、num%p
android:toXDelta结尾X方向上的位置 
android:fromYScale起始Y方向上的位置 
android:toYDelta结尾Y方向上的位置 
   

以上四个属性都支持三种表示方式:浮点数、num%、num%p

数字方式代表相对于自身左边缘的像素值,(绝对位置定位)
num%方式代表相对于自身左边缘或顶边缘的百分比,(相对于控件本身定位)100%表示移动自己的1倍距离
num%p方式代表相对于父容器的左边缘或顶边缘的百分比。(相对于父控件)


七、rotate  画面转移旋转动画效果

android:fromDegrees代表起始角度浮点值,单位:度
android:toDegrees代表结尾角度浮点值,单位:度
android:pivotX旋转中心的X坐标 
android:pivotY表旋转中心的Y坐标值 
   


我们通过一个例子感受一下,代码的讲解都写在注释里了

下面是res/layout/activity_main.xml 布局文件:

<LinearLayout 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:orientation="vertical"
    tools:context="com.example.text.MainActivity$PlaceholderFragment" >
 <ImageView 
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src=http://www.mamicode.com/"@drawable/ic_launcher">
下面是MainActivity.java主界面文件:

public class MainActivity extends Activity implements OnClickListener {
	private Button translate;
	private Button alpha;
	private Button rotate;
	private Button scale;
	private ImageView image;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		image = (ImageView) findViewById(R.id.image);
		translate = (Button) findViewById(R.id.translate);
		alpha = (Button) findViewById(R.id.alpha);
		rotate = (Button) findViewById(R.id.rotate);
		scale = (Button) findViewById(R.id.scale);
		translate.setOnClickListener(this);
		alpha.setOnClickListener(this);
		rotate.setOnClickListener(this);
		scale.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		// 创建一个AnimationSet对象
		AnimationSet animationSet = new AnimationSet(true);
		switch (v.getId()) {
		case R.id.alpha:
			// 创建一个AlphaAnimation对象
			AlphaAnimation alphaAnimation = new AlphaAnimation(1, 0);
			// 设置动画执行的时间(单位:毫秒)
			alphaAnimation.setDuration(1000);
			// 将AlphaAnimation对象添加到AnimationSet当中
			animationSet.addAnimation(alphaAnimation);
			// 使用ImageView的startAnimation方法开始执行动画
			image.startAnimation(animationSet);
			break;

		case R.id.translate:
			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);
			image.startAnimation(animationSet);
			break;

		case R.id.rotate:
			RotateAnimation rotateAnimation = new RotateAnimation(0, 360,
					Animation.RELATIVE_TO_PARENT, 1f,
					Animation.RELATIVE_TO_PARENT, 0f);
			rotateAnimation.setDuration(5000);
			animationSet.addAnimation(rotateAnimation);
			image.startAnimation(animationSet);
			break;

		case R.id.scale:
			ScaleAnimation scaleAnimation = new ScaleAnimation(1, 0.1f, 1,
					0.1f, Animation.RELATIVE_TO_SELF, 0.5f,
					Animation.RELATIVE_TO_SELF, 0.5f);
			animationSet.addAnimation(scaleAnimation);
			animationSet.setStartOffset(1000);
			animationSet.setDuration(2000);
			image.startAnimation(animationSet);
			break;
		}
	}
}

下面是运行结果:



本讲到这里,谢谢大家!

第二十六讲:Android之Animation