android动画浅析

jopen 8年前

经过这几天对android动画的学习,本人对android动画有了些浅显的了解。

android动画分为三大类:帧动画(Frame animation)、补间动画(tween animation)、属性动画(property animation

),其中帧动画、补间动画是3.0之前的产物。属性动画是3.0之后才产生的。

1、帧动画

    帧动画比较简单,它就像播放gif一样一针一针(一针也就是其中的一张图片)的播放。下面我们就以播放一个gif为例讲解一下帧动画。

    1) 首先需要做的是下载一个gif,然后将其分解成一张一张的图片,网上有许多分解的网站,比如:

                www.360doc.com/content/13/0314/18/699582_271506280.shtml

    2)现在你应该得到了一个图片包了,里边有许多图片。将其放入drawable文件夹下。

    3)在drawable目录下创建一个xml文件,代码如下:

<?xml version="1.0" encoding="utf-8"?>  <animation-list xmlns:android="http://schemas.android.com/apk/res/android"      android:oneshot="false" >      <!--         根标签为animation-list,其中oneshot代表着是否只展示一遍,设置为false会不停的循环播放动画        根标签下,通过item标签对动画中的每一个图片进行声明        android:duration 表示展示所用的该图片的时间长度         -->          <item          android:drawable="@drawable/loading_0"          android:duration="100"/>      <item          android:drawable="@drawable/loading_1"          android:duration="100"/>      <item          android:drawable="@drawable/loading_2"          android:duration="100"/>      <item          android:drawable="@drawable/loading_3"          android:duration="100"/>      <item          android:drawable="@drawable/loading_4"          android:duration="100"/>      <item          android:drawable="@drawable/loading_5"          android:duration="100"/>      <item          android:drawable="@drawable/loading_6"          android:duration="100"/>      <item          android:drawable="@drawable/loading_7"          android:duration="100"/>    </animation-list>

    4)使用

ImageView iv = (ImageView) findViewById(R.id.progressbar);  iv.setBackgroundResource(R.drawable.progress_dialog);  AnimationDrawable ad = (AnimationDrawable) iv.getBackground();  ad.start();

至此帧动画使用完成

2、补间动画,补间动画很强大能实现我们大部分时候的需要。

首先来说说原理,不见动画tween animation它是通过你给出两个关键状态即开始状态和结束状态,然后中间的过程由android框架给你自动完成。动画基本就是此原理,其实很简单。这样有人会问了,我不要让它给我实现我要自己去控制中间的过程,包括效果展示,速度的快慢等等,那要怎么办呢?android肯定会给我们留接口的,后面再说。

补间动画主要分这四种:

    渐变尺寸放大缩小:ScaleAnimation

    透明度渐变:AlphaAnimation

    移动渐变:TranslateAnimation

    旋转渐变:RotateAnimation

上面四个类都继承至Animation类,这四个类的用法很简单

AlphaAnimation实现淡入淡出的效果

//方式一通过代码的方式定义透明度动画  AlphaAnimation aphaAnimation=new AlphaAnimation(1f,0.1f);  alphaAnimation.setDuration(3000);//设置动画持续时间为3秒  alphaAnimation.setFillAfter(true);//设置动画结束后保持当前的位置(即不返回到动画开始前的位置)  imgShow.startAnimation(alphaAnimation);

ScaleAnimation实现放大缩小渐变

主要属性及说明:

fromXScale(浮点型)属性为动画起始时X坐标上的缩放尺寸

fromYScale(浮点型)属性为动画起始时Y坐标上的缩放尺寸

toXScale(浮点型) 属性为动画结束时X坐标上的缩放尺寸

toYScale(浮点型) 属性为动画结束时Y坐标上的缩放尺寸

说明: 以上四种属性值

0.0表示收缩到没有

1.0表示正常无缩放

值小于1.0表示收缩

值大于1.0表示放大

pivotX(浮点型) 属性为动画相对于物件的X坐标的开始位置

pivotY(浮点型) 属性为动画相对于物件的Y坐标的开始位置

//方式一通过代码的方式定义缩放动画  Animation scaleAnimation=new ScaleAnimation(0.5f, 1.0f,1.0f, 1.0f);  scaleAnimation.setDuration(2000);//设置动画持续时间为3秒  scaleAnimation.setFillAfter(true);//设置动画结束后保持当前的位置(即不返回到动画开始前的位置)  scaleAnimation.setRepeatCount(3);  imgShow.startAnimation(scaleAnimation);

TranslateAnimation移动动画

//方式一通过代码的方式定义位移动画  Animation translateAnimation=new TranslateAnimation(0, 100, 0, 0);  translateAnimation.setDuration(3000);//设置动画持续时间为3秒  translateAnimation.setInterpolator(this, android.R.anim.cycle_interpolator);//设置动画插入器  translateAnimation.setFillAfter(true);//设置动画结束后保持当前的位置(即不返回到动画开始前的位置)  imgShow.startAnimation(translateAnimation);

RotateAnimation实现旋转的动画效果

      主要属性及说明:

repeatCount 重复次数

fromDegrees为动画起始时物件的角度:

当角度为负数——表示逆时针旋转

当角度为正数——表示顺时针旋转

(负数fromDegrees——toDegrees正数:顺时针旋转)

(负数fromDegrees——toDegrees负数:逆时针旋转)

(正数fromDegrees——toDegrees正数:顺时针旋转)

(正数fromDegrees——toDegrees负数:逆时针旋转)

toDegrees属性为动画结束时物件旋转的角度可以大于360度

pivotX,pivotY 为动画相对于物件的X、Y坐标的开始位.说明:以上两个属性值从0%-100%中取值,50%为物件的X或Y方向坐标上的中点位置。

Animation rotateAnimation=new RotateAnimation(0, 45);  rotateAnimation.setDuration(3000);//设置动画持续时间为3秒  rotateAnimation.setFillAfter(true);//设置动画结束后保持当前的位置(即不返回到动画开始前的位置)  imgShow.startAnimation(rotateAnimation);

同时以上所有的动画实现方式还可以通过xml文件来配置,这里就不多做说明。

AnimationSet实现动画集合

如果我要实现旋转的时候同时进行淡入淡出怎么办呢?AnimationSet可以解决此问题。

Animation rotateAnimation=new RotateAnimation(0, 45);  rotateAnimation.setDuration(3000);//设置动画持续时间为3秒  AlphaAnimation aphaAnimation=new AlphaAnimation(1f,0.1f);  alphaAnimation.setDuration(3000);//设置动画持续时间为3秒  AnimationSet set = new AnimationSet(true);  set.add(rotateAnimation);  set.add(alphaAnimation);  imageShow.startAnimation(set);

上面只是简单的几种动画,但是现实可以能有各种各样的动画需要,大部分可以用上面的方式解决,但是有时候我们需要自己定义自己的动画效果。AlphaAnimation ScaleAnimation RotationAnImation TransexAnimation这几个类都是继承至Animation基类,同样如果根据实际需要我们也可以继承Animation基类来实现自己想要的效果。

下篇本人将来谈谈动画更高级的东西包括属性动画以及实现自定义动画效果。

本篇完


来自: http://my.oschina.net/u/579493/blog/599041