你的位置:首页 > 操作系统

[操作系统]android 帧动画,补间动画,属性动画的简单总结


 
帧动画——FrameAnimation
  将一系列图片有序播放,形成动画的效果。其本质是一个Drawable,是一系列图片的集合,本身可以当做一个图片一样使用
  在Drawable文件夹下,创建animation-list为根节点的资源文件
<animation-list android:oneshot="false">  <item android:drawable="@drawable/img1" android:duration="100"/>  <item android:drawable="@drawable/img2" android:duration="100"/>  <item android:drawable="@drawable/img3" android:duration="100"/>  <item android:drawable="@drawable/img4" android:duration="100"/></animation-list>

  oneshot:是否只播放一次      


  drawable:一帧引用的图片
  duration:一帧播放的时间
播放动画
  将动画作为控件的背景
  ((AnimationDrawable)view.getBackground()).start();
 
Animation常用属性
  duration:动画时间                   
  repeatCount:重复次数 infinite无限次
  fillAfter:是否停止在最后一帧
  repeatMode:重复模式     值:restart重新开始,reserve反复
  startOffset:开始延迟时间

 
补间动画 Tween Animation
  只能应用于View对象,只支持部分属性,View animation值改变了View绘制的位置,并没有改变对象本身的真实位置
  可以使用 
  开始动画 通过view的startAnimation(Animation a)  参数定义的动画
 
四种补间动画通过  AlphaAnimation:透明度动画
<??><alpha ="http://schemas.android.com/apk/res/android"  android:fromAlpha="0"  android:toAlpha="1"  android:duration="2000">  <!--  fromAlpha 起始透明度 0为完全透明 1为不透明 0~1之间的浮点值  toAlpha 结束透明度  duration 动画运行时间 单位毫秒  --></alpha>

    AlphaAnimation alphaAnimation=null;    //加载    alphaAnimation= (AlphaAnimation) AnimationUtils.loadAnimation(MainActivity.this, R.anim.anim_alpha);    //常用属性设置 各种动画通用    alphaAnimation.setRepeatCount(3);//执行动画效果结束后重复执行3次 一共4次    alphaAnimation.setRepeatMode(Animation.REVERSE);//重复模式    //动画结束是否停止在最后一帧    alphaAnimation.setFillAfter(true);    //动画结束是否停止在第一帧    alphaAnimation.setFillBefore(false);    //设置插值器 动画执行速度 变速 加减速。。    //AccelerateInterpolator减速    //DecelerateInterpolator加速    alphaAnimation.setInterpolator(new AccelerateDecelerateInterpolator());


  ScaleAnimation:缩放动画
    代码加载的方式和方法的使用与AlphaAnimation一样
<??><scale ="http://schemas.android.com/apk/res/android"  android:toXScale="1"  android:toYScale="1"  android:fromXScale="0.1"  android:fromYScale="0.1"  android:pivotY="0%"  android:pivotX="0%"  android:duration="2000">  <!--      浮点值 表示倍数 自身几倍      fromXScale 动画在X轴以自身几倍伸缩开始      toXScale  动画在X轴以自身几倍伸缩结束      fromYScale 动画在Y轴以自身几倍伸缩开始      toYScale  动画在Y轴以自身几倍伸缩结束      pivotX 动画相对于控件自身的X坐标的开始位置      pivotY 动画相对于控件自身的Y坐标的开始位置      0% 0% 表示控件左上角 为0,0原点坐标  --></scale>


  TranslateAnimation:平移动画
<??><translate ="http://schemas.android.com/apk/res/android"  android:fromXDelta="-100%p"  android:fromYDelta="0"  android:toXDelta="100%p"  android:toYDelta="0"  android:duration="2000">  <!--      fromXDelta x轴起始位置      toXDelta  X轴结束位置      fromYDelta y轴起始位置      toYDelta  y轴结束位置      100%p 表示相对于父级      100%相对于自身--></translate>

 


  RotateAnimation:旋转动画

<??><rotate ="http://schemas.android.com/apk/res/android"  android:fromDegrees="0"  android:toDegrees="360"  android:duration="2000"  android:pivotX="50%"  android:pivotY="50%"  android:interpolator="@android:anim/accelerate_decelerate_interpolator">  <!--   interpolator 指定动画的插值器   accelerate_decelerate_interpolator  加速-减速   accelerate_interpolator        加速   decelerate_interpolator        减速   fromDegrees 动画起始角度   toDegrees  动画结束旋转的角度 可以大于360度   负数表示逆时针旋转 正数表示顺时针旋转   pivotX相对于view的X坐标的开始位置   pivotY相对于view的Y坐标的开始位置   100 绝对尺寸 100px   50% 相对尺寸 相对于自身的50%   50%p 相对尺寸 相对于父容器的50%   50%为物件的X或Y方向坐标上的中点位置   duration 动画播放时间 单位毫秒--></rotate>

通过构造方法创建  

  构造参数详解  此段内容选自 http://www.cnblogs.com/aimeng/archive/2011/10/10/2206710.html  

//在代码中定义 动画实例对象private Animation myAnimation_Alpha;private Animation myAnimation_Scale;private Animation myAnimation_Translate;private Animation myAnimation_Rotate;     //根据各自的构造方法来初始化一个实例对象myAnimation_Alpha=new AlphaAnimation(0.1f, 1.0f); myAnimation_Scale =new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f,       Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); myAnimation_Translate=new TranslateAnimation(30.0f, -80.0f, 30.0f, 300.0f); myAnimation_Rotate=new RotateAnimation(0.0f, +350.0f,        Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);

AlphaAnimation
 AnimationAlphaAnimation(float fromAlpha, float toAlpha)//第一个参数fromAlpha为 动画开始时候透明度//第二个参数toAlpha为 动画结束时候透明度myAnimation_Alpha=new AlphaAnimation(0.1f, 1.0f);//说明://        0.0表示完全透明//        1.0表示完全不透明

myAnimation_Alpha.setDuration(5000);//设置时间持续时间为 5000毫秒

 


ScaleAnimation
    ScaleAnimation(float fromX, float toX, float fromY, float toY,               int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)     //第一个参数fromX为动画起始时 X坐标上的伸缩尺寸        //第二个参数toX为动画结束时 X坐标上的伸缩尺寸         //第三个参数fromY为动画起始时Y坐标上的伸缩尺寸        //第四个参数toY为动画结束时Y坐标上的伸缩尺寸      /*说明:                        以上四种属性值                            0.0表示收缩到没有                         1.0表示正常无伸缩                             值小于1.0表示收缩                          值大于1.0表示放大    */    //第五个参数pivotXType为动画在X轴相对于物件位置类型      //第六个参数pivotXValue为动画相对于物件的X坐标的开始位置    //第七个参数pivotXType为动画在Y轴相对于物件位置类型       //第八个参数pivotYValue为动画相对于物件的Y坐标的开始位置    myAnimation_Scale =new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f,                 Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);    myAnimation_Scale.setDuration(700);    //设置时间持续时间为 700毫秒

 TranslateAnimation

    TranslateAnimation(float fromXDelta, float toXDelta,                           float fromYDelta, float toYDelta)     //第一个参数fromXDelta为动画起始时 X坐标上的移动位置        //第二个参数toXDelta为动画结束时 X坐标上的移动位置          //第三个参数fromYDelta为动画起始时Y坐标上的移动位置         //第四个参数toYDelta为动画结束时Y坐标上的移动位置 

RotateAnimation

    RotateAnimation(float fromDegrees, float toDegrees,                 int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)    //第一个参数fromDegrees为动画起始时的旋转角度        //第二个参数toDegrees为动画旋转到的角度       //第三个参数pivotXType为动画在X轴相对于物件位置类型      //第四个参数pivotXValue为动画相对于物件的X坐标的开始位置    //第五个参数pivotXType为动画在Y轴相对于物件位置类型       //第六个参数pivotYValue为动画相对于物件的Y坐标的开始位置    myAnimation_Rotate=new RotateAnimation(0.0f, +350.0f,               Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);

 

属性动画
  相对补间动画  属性动画会真正的使目标对象的属性值发生改变,不像补间动画只是影像的改变    只能修改具有get/set方法的属性值
  因为可以修改对象的属性,属性动画可以做到更多的效果,改变文本大小,背景颜色等等
  属性动画创建在 res/animator
  
ValueAnimator

包含属性动画的所有核心功能,动画时间,开始、结束属性值,属性值计算方法等。

ValuAnimiator设置开始结束值 实现ValueAnimator.onUpdateListener接口,

这个接口只有一个函数onAnimationUpdate(),在这个函数中会传入ValueAnimator对象做为参数,通过这个ValueAnimator对象的getAnimatedValue()函数可以得到当前的属性值

把属性值设置给某个控件的某个属性


  使用
<??><animator ="http://schemas.android.com/apk/res/android"  android:duration="1000"  android:valueFrom="0"  android:valueTo="300"  android:valueType="intType"  android:interpolator="@android:interpolator/overshoot">  <!--    valueFrom 起始值    valueTo  结束值    valueType 值的类型    intType整数值、floatType浮点值、colorType颜色值    interpolator插值器  --></animator>

    ValueAnimator valueAnimator=null;    //通过AnimatorInflater.loadAnimator()加载    valueAnimator= (ValueAnimator) AnimatorInflater.loadAnimator(this,R.animator.animator_value);    //动画执行时间    valueAnimator.setDuration(3000);    //值改变监听    valueAnimator.addUpdateListener(listener);    //开始动画    valueAnimator.start();

  private ValueAnimator.AnimatorUpdateListener listener=new ValueAnimator.AnimatorUpdateListener() {    @Override    public void onAnimationUpdate(ValueAnimator animation) {       //获取值      int value= (int) animation.getAnimatedValue();       //btnValueAnimator为测试控件        //设置控件X轴平移        btnValueAnimator.setTranslationX(value);    }  };

  使用代码

    /**     * valueAnimator 单个值     */    //代码创建 ValueAnimator类自身的方法    //ofFloat值类型float    ValueAnimator valueAnimator=ValueAnimator.ofFloat(0,1);    //ofInt值类型int 从0~300    valueAnimator=ValueAnimator.ofInt(0,300);    //也可以用来设置颜色 在颜色改变过程中会将颜色变化情况显示出来    //红色到蓝色的改变过程 显示N种颜色    valueAnimator=ValueAnimator.ofInt(Color.RED,Color.BLUE);    //ofArgb设置颜色 如果无法使用 是的sdk版本低了    //这个方法改变颜色过程中只显示红色和蓝色    //valueAnimator=ValueAnimator.ofArgb(Color.RED,Color.BLUE);    //设置插值器    valueAnimator.setInterpolator(new CycleInterpolator());

/** * * ValueAnimator.ofPropertyValuesHolder 设置多个值 */ //设置动画属性 参数1:名字 参数2,3值的变化区间 PropertyValuesHolder alphaHolder=PropertyValuesHolder.ofFloat("alpha",0f,1f); PropertyValuesHolder widthHolder=PropertyValuesHolder.ofInt("width",0,300); //ValueAnimator.ofPropertyValuesHolder 添加holder 创建动画 valueAnimator=ValueAnimator.ofPropertyValuesHolder(alphaHolder,widthHolder); //动画执行时间 valueAnimator.setDuration(3000); //值改变监听 valueAnimator.addUpdateListener(listener);

  private ValueAnimator.AnimatorUpdateListener listener=new ValueAnimator.AnimatorUpdateListener() {    @Override    public void onAnimationUpdate(ValueAnimator animation) {      /**       * 单个值获取 getAnimatedValue取出变化值 根据设置类型强转       * btnValueAnimator 测试用的button       *///      int value= (int) animation.getAnimatedValue();//      btnValueAnimator.setTranslationX(value);横坐标平移//      float value= (float) valueAnimator.getAnimatedValue();//      btnValueAnimator.setAlpha(value);透明度改变//      int value= (int) animation.getAnimatedValue();//      btnValueAnimator.setTextColor(value);文字颜色改变      /**       * PropertyValuesHolder存了多个值 通过名字获取 强制转换       */      float alpha= (float) valueAnimator.getAnimatedValue("alpha");      int width= (int) valueAnimator.getAnimatedValue("width");      btnValueAnimator.setAlpha(alpha);//改变透明度      //图像绘制 左边不变从右边慢慢增加      //修改控件的width height不能使用setWidth或setHeight      btnValueAnimator.setRight(width);      //btnValueAnimator.setBottom(width);    }  };

ObjectAnimator:

继承自ValueAnimator,要指定一个对象及该对象的一个属性,当属性值计算完成时自动设置为该对象的相应属性,不需要设置监听,底层自动完成,一般会用ObjectAnimator来改变某一对象的某一属性

    //用来测试的button    Button btnObjectAnimator= (Button) findViewById(R.id.btn_object_animator);    //加载动画    ObjectAnimator objectAnimator= (ObjectAnimator) AnimatorInflater.loadAnimator(this,R.animator.animator_object);    //绑定控件    objectAnimator.setTarget(btnObjectAnimator);    //参数1 绑定控件 参数2 设置 属性 参数3 设置值    objectAnimator=ObjectAnimator.ofInt(btnObjectAnimator,"textColor",Color.RED);    //PropertyValuesHolder设置多个属性    PropertyValuesHolder translationXHolder=PropertyValuesHolder.ofFloat("translationX",0,300);    PropertyValuesHolder translationYHolder=PropertyValuesHolder.ofFloat("translationY",0,200);    objectAnimator=ObjectAnimator.ofPropertyValuesHolder(btnObjectAnimator,translationXHolder,translationYHolder);    objectAnimator.setDuration(3000);
     //开始动画
     objectAnimator.start();

 

转载请注明出处:http://www.cnblogs.com/r-decade/