Android动画

Android动画有2种,一种是Tween Animation,另一种是Frame Animation 

Tween动画:

  Tween动画是对视图进行比如位置的移动,大小的缩放,旋转,透明度的变化等等。

Tween动画可以写到一个xml文件中,就像定义布局文件一样,当然,也可以写到android代码中,不过推荐写到xml文件中,因为它具备的阅读性,可重用性大大超过了硬编码。

xml文件放在工程的res/anim目录中,这个目录中要包含一个根元素,可以是<scale>,<translate>,<alpha>或者<rotate>,当然,这些元素都可以放到一个动画集合<set>中,默认情况下,所有的动画指令都是同时发生的,为了让他们按顺序发生,需要设置一个特殊的属性startOffset。

下面定义了一个动画的集合:

<?xml version="1.0" encoding="utf-8"?>
  <set xmlns:android="http://schemas.android.com/apk/res/android"
 android:shareInterpolator="false">
 <scale android:interpolator="@android:anim/accelerate_decelerate_interpolator"
 android:fromXScale="1.0"
 android:toXScale="1.4"
 android:fromYScale="1.0"
 android:toYScale="0.6"
 android:pivotX="50%"
 android:pivotY="50%"
 android:fillAfter="false"
 android:duration="700"/>
 
 <set android:interpolator="@android:anim/decelerate_interpolator">
 <scale
 android:fromXScale="1.4"
 android:toXScale="0.0"
 android:fromYScale="0.6"
 android:toYScale="0.0"
 android:pivotX="50%"
 android:pivotY="50%"
 android:startOffset="700"
 android:duration="400"
 android:fillBefore="false"/>
 <rotate
 android:fromDegrees="0"
 android:toDegrees="-45"
 android:toYScale="0.0"
 android:pivotX="50%"
 android:pivotY="50%"
 android:startOffset="700"
 android:duration="400"/>
 </set>
  </set>

代码的作用:
首先是一个动画的集合set,在这个set中有一个属性shareInterpolater,如果设置为true,则这个集合下面所有的子元素都享有同样的interpolater
紧跟在这个集合后面的是一个缩放动画,里面有一些个属性,

下面一一介绍:
android:interpolator属性:这是值定一个动画的插入器,有一些常用的插入器:accelerate_decelerate_interpolator加速-减速动画插入器,顾名思义,就是先加速后减速,accelerate_interpolator加速动画插入器,decelerate_interpolator减速动画插入器
android:fromXScale属性为动画起始时,x坐标上的伸缩尺寸
android:toXScal属性为动画结束时,x坐标上的伸缩尺寸
android:fromYScale属性为动画起始时,y坐标上的伸缩尺寸
android:toYScale属性为动画结束时,y坐标上的伸缩尺寸
关于伸缩尺寸:
上面的四个属性的值:0.0表示收缩到没有,1.0表示正常无收缩,值小于1.0表示收缩,值大于1.0表示放大。
android:fillAfter属性当设置为true时,该动画转化在动画结束后被应用,同理还有android:fillBefore属性,当设置为true时,该动画转化在动画开始前被应用
android:duration属性表示动画持续的时间,单位是毫秒
android:pivotX属性为动画相对于x坐标的起始位置
android:pivotY属性为动画相对于y坐标的起始位置
这2个属性有不同的格式表示,如值为50,表示是相对于父类的50%,如值为50%,表示是相对于自己的50%
这里的50%表示相对于自身x,y坐标上的中点位置
紧跟着是一个动画集合,里面有缩放和旋转,这个集合的interpolater为减速动画插入器
这里的缩放里面还有一个属性,android:startOffset属性是设置动画开始的时间,这里设置700是表示700毫秒之后开始,也就是第一个缩放完成之后开始。
旋转里面的属性跟scale里面的都差不多,只是旋转讲究的角度。
android:fromDegrees属性表示动画起始时的角度
android:toDegrees属性表示动画结束时旋转的角度,可以大于360度

在程序代码中的使用:

ImageView iv = (ImageView) findViewById(R.id.imageView1);
Animation animation = (AnimationSet) AnimationUtils.loadAnimation(this, R.anim.anim_set);
iv.setAnimation(animation);
animation.start();
Frame Animation:帧动画,可以使用AndroidDrawable来负责帧动画,同样它可以在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/register" android:duration="500"/>
 <item android:drawable="@drawable/duola" android:duration="500"/>
 <item android:drawable="@drawable/icon" android:duration="500"/>
 </animation-list>

定义了帧的名字和每帧的持续时间.
这里有3帧,通过设置android:oneshot属性为true,它将会在最后一帧停下来,如果设置为false,它将会循环播放,可以把它添加到一个背景中,让他播放,具体代码如下:

 
 public class TestActity extends Activity {
 AnimationDrawable animationDrawable;
 
 @Override
 protected void onCreate (Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.test);
 ImageView iv = (ImageView) findViewById(R.id.imageView1);
 iv.setBackgroundResource(R.anim.anim_list);
 animationDrawable = (AnimationDrawable) iv.getBackground();
 }
 @Override
 public boolean onTouchEvent (MotionEvent event) {
 if(event.getAction() == MotionEvent.ACTION_DOWN) {
 animationDrawable.start();
 return true;
 }
 return super.onTouchEvent(event);
 }
 }
这里需要注意的是:AnimationDrawable在调用OnCreate的过程中不能调用start(),这是因为AnimationDrawable不能在不完全的窗口上运行,需要一个操作来触发,如果你想立即播放动画,没有必要的交互,你可以在onWindowFocusChanged()方法中调用它,这样它将会成为窗口焦点。



修改自网络。




你可能感兴趣的:(android,xml,list,Class,animation,encoding)