zoukankan      html  css  js  c++  java
  • 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绘制的位置,并没有改变对象本身的真实位置
      可以使用XML定义也可以使用代码定义     XML定义的动画放在/res/anim/文件夹内
     
      开始动画 通过view的startAnimation(Animation a)  参数定义的动画
     
    四种补间动画通过XML定义
      AlphaAnimation:透明度动画
    <?xml version="1.0" encoding="utf-8"?>
    <alpha xmlns:android="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;
            //加载XML中的动画XML文件
            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一样
    <?xml version="1.0" encoding="utf-8"?>
    <scale xmlns:android="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:平移动画
    <?xml version="1.0" encoding="utf-8"?>
    <translate xmlns:android="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:旋转动画
    <?xml version="1.0" encoding="utf-8"?>
    <rotate xmlns:android="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()函数可以得到当前的属性值

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

      使用xml
    <?xml version="1.0" encoding="utf-8"?>
    <animator xmlns:android="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()加载xml 创建ValueAnimator
            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/ 

  • 相关阅读:
    住建部第一批城市更新试点名单
    新城建试点城市
    日常笔记
    简单的C++配置模块
    C++ 异常 OR 错误码
    数独的暴力破解法
    MySQL语法数据库操作 Test
    Python中的staticmethod和classmethod Test
    Python中的__init__()、__new__()、__del__()方法 Test
    MySQL语法数据库表操作 Test
  • 原文地址:https://www.cnblogs.com/r-decade/p/5894230.html
Copyright © 2011-2022 走看看