Android 动画

来源:互联网 发布:php某个字符替换 编辑:程序博客网 时间:2024/06/07 16:34

Android动画就哪几类,他们的特点和区别时什么

Android动画就三种 第一个补间动画 第二种帧动画 第三中属性动画(3.0开始)

tweened animation 补间动画 通过对场景对象不懂做图像的变化(评议 缩放 旋转)产生动画效果
frame-by-frame animation 帧动画 顺序播放事先准备好的图像,类似电影一样

这两种动画类型都能在任何View对象中使用,用来提供简单的旋转计时器,

Property animation 属性动画 未完成

帧动画 可以使用代码和XML两种实现方式

AnimactionDrawable 通过这个对象我们可以使用代码来创建一个帧动画```    //创建对象    AnimationDrawable animaction = new AnimationDrawable();    //设置帧动画用的图片    animation.addFrame(R.drawable.xx, 100);    //关联imageView    imageView.setBackground(animation);    //循环执行动画,默认只执行一次    animation.setOnShot(false);    //执行帧动画    animation.start();    //停止动画    if(animation.isRunning())        animation.start();```XML实现帧动画,首先我们再res文件里面创建一个固定名字drawable文件夹,然后创建xml文件,``` 假设文件名字animation.xml  <?xml>    <animation-list>        <item android:drawable="" android:duration=""></item>    </animation-list>    //然后通过代码加载xml    AnimationDrawable animDrawable = getResouces().getDrawable(R.drawable.animation);    //启动和停止是一样的```补间动画 (tween)常见使用有 缩放(scale) 位移(translation) 透明度(alpaha) 旋转(rotate)。也是有2种方式实现代码和XML实现```代码实现    //位移动画    // fromXType 开始点的X坐标 相对于自己 相对父容器或相对自己    // formxvalue 开始位置数字    TranslateAnimation translateAnimation = new TranslateAnimation(fromXTye, formXValue, toXType,toXValue,                         formYType, fromYValue, toYType, toYValue);    //意思就是说相对父容器x 再0这个位置 到父容器1(就是父容器的宽)后面的参数同理    //其实这里面的使用的都是偏移量区分正负      new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0, Animation.RELATIVE_TO_PARENT,1.0f,                         Animation.RELATIVE_TO_PARENT, 0, Animation.RELATIVE_TO_PARENT, 1.0f);    //必要设置。动画执行时间,单位毫秒    transleAnimation.setDuration(3000)    //设置循环运行次数 Animation.INFINITE是无穷,也就说永远不停止    transleAnimation.setRepeatCount(Animation.INFINITE)    //设置是否填充 其实就是动画执行完毕后view是不是停在位置后的位置而不是回到原来的位置,默认是false    transleAnmiation.setFillAfter(true)    //设置动画重复模式 两个模式 RESTART 重新开始 REVERSE 往复    transleAnimation.setReperatMode(Animation.RESTART)    //关联View    imageView.setAnimation(transleAnimation)    //启动动画    transleAnimation.start()    //旋转动画    //根据上一个位置动画就知道了0 360 第一个是旋转初始度数,一个旋转多少度,后面四个参数分别是先对谁,再什么位置旋转。一半情况旋转都是相对自己来说的    自己长度和宽度的一半也就是中心点旋转    RotateAnimation rotateAnimation = new RotateAnimation(0 , 360, Animation.RELATVIE_TO_SELF, 0.5f,                            Animation.REVATVIE_TO_SELF, 0,5f)    //设置动画时长 必要设置     rotateAnimation.setDuration(3000)    //其他设置如位移动画一样    //透明度动画    //参数就是初始0 不可见 1就是可见没有透明度    AlphaAnimation alphaAnimation = new AlpahaAnimation(0 , 1)    //设置动画时长    alpahaAnimation.setDuration(3000)    //缩放动画    //前四个参数,什么位置开始 缩放多少 fromx x轴起点坐标 tox就是x轴的终点坐标 后两个就是y轴的起终点坐标    //pivoteXType 相对那个参照物 还是2种 一个相对自己 一个是相对父容器     //pivoteXValue 相对于谁的什么位置缩放    ScaleAnimation scaleAnimation = new ScaleAnimation(formX, toX, formY, toY, pivotXType, pivotXValue, pivotYType, pivotYValue)    //这样就是说缩放3倍,相对自己的中心点缩放    new ScaleAnimation(0, 3.0f, 0, 3.0f, Animation.RELATVIE_TO_SELF, 0.5, Animation.RELATVIE_TO_SELF, 0.5)    //设置动画时长    scaleAnimation.setDuration(3000)   //组合动画实现   //AnimationSet 创建参数false 就是不设置动画差速器,差速器可以然后动画先快后慢之类的速度效果后面说   AnimationSet animSet = new AnimationSet(false)   //将上面的动画添加到集合中,可以添加多个 都需要分别设置时长 重复次数 和 重复模式    //特别注意当组合动画添加的时候,请将位移动画最后一个加入到动画集合中,如果不放在最后添加可能会出现位移不准确的情况 为啥不是太清楚   animSet.addAnimation(alphaAnimation)   //将动画效果设置到view上面   iamgeView.setAnimation(animSet)   //执行动画   animSet.start()   //关于多个动画分别执行后组合,意思就是有一个动画执行完后再执行另一个动画  动画执行的监听   //设置动画监听   animation.setAnimationListener(new AnimationListener(){       //动画开始       public void onAnimationStart(Animation arg0){       }       //动画重复       public void onAnimationRepeat(Animation arg0){       }       //动画结束       public void onAnimationEnd(Animation arg0){       }   });   //XML生成补间动画   再res文件夹下创建anim文件夹   //位移xml 文件名称translate 节点名称一看就知道了,这里说明一下100%p 就是相对父容器 没有p就是相对自己来说的   <xml?>    <translate xmls="......"     android:fromXDelta="0"    android:fromYDelta="0"    android:toXDelta="100%p"    android.toYDelta="100%p"    android:duration="3000"    android:repeatCount="infinite"    android:repeatMode="restart|reverse">   </translate>   //加载xml文件   Animation anim = AnimationUtils.loadAnimation(context, R.anim.translate)   //其他三种都是一样不再描述了   //xml组合动画  类似下面的写法    <xml?>     <set>        <translate xmls="......"             android:fromXDelta="0"            android:fromYDelta="0"            android:toXDelta="100%p"            android.toYDelta="100%p"            android:duration="3000"            android:repeatCount="infinite"            android:repeatMode="restart|reverse">        </translate>        <scale ......>        <alpaha ...>    </set>```//补间动画插值器InterpolatorAccelerateDecelerateInterpolator   先加速在减速AccelerateInterpolator             加速AnticipateInterpolator             先回退一小步然后加速前进AnticipateOvershootInterpolator    再上一个基础上超出终点一小步再回到终点BounceInterpolator                 最后阶段弹球效果CycleInterpolator                  周期运动DecelerateInterpolator             减速LinearInterpolator                 匀速OvershootIntpolator                快速到达终点并超出一小步后回到终点```    //如果设置true 就是说明动画集合里面所有的动画都使用统一一个插值器,false则相反    AnimationSet animationSet = new AnimationSet(true)    //设置插值器    animationSet.setinterpolator(new BounceInterpolator())    //对于AnimationSet 不能统一停止,只能分别停止子动画```属性动画 property animation 常用API ValueAnimation ObjectAnimation TimeAnimation 属性动画动画参数translationX    沿X轴位移translationY    沿Y轴位移rotationY       沿Y轴旋转rotationX       沿X轴旋转rotation        沿中心点旋转alpha           透明度scaleX          沿X轴缩放scaleY          沿Y轴缩放```//位移动画  //obejct 谁要执行这个动画,也就是执行动画的View//property 是执行什么动作 也就上面罗列的属性字符串//最后一个参数比较有意思,它是一个可变参数 也就是数组ObjectAnimation object_transla = ObjactAnimation.ofFloat(object, property, obj...)//上面这个位移动画实际应该是这个样子的. 最后数组就是x轴位移的数值,//如果我们写一个均匀递增那么动画就是匀速执行,//如果不是这根绝数组种差值大小的变化而加速或减速。ObjectAnimation object_transla     = ObjectAnimation.ofFloat(view, "translationX", 10 ,20 ,30 ,50 ,100 , 200, 500 ,700)//设置动画时长object_transla.setDuration(5000)//设置重复次数object_transla.setRepeatCount(2)//无线重复ObjectAnimation.INFINITE //启动动画object_transla.start() ```//属性动画组合//第一种组合实现```  //设置属性动画的数据及动画效果  PropertyValuseHolder translate_animation = PropertyValuesHolder.ofFloat(property, obj...)  PropertyValuseHolder scale_animation = PropertyValuesHolder.ofFloat(property, obj...)  PropertyValuseHolder rotate_animation = PropertyValuesHolder.ofFloat(property, obj...)  ObjectAnimation animation = ObajctAnimation    .ofPropertyValuesHolder(view, translate_animation, scale_animation, rotate_animation)  animation.setDuration(5000)  animation.start();```第二种组合实现```    ObjectAnimation objectAnim = ObjectAnimation.ofFloat(view, "", 1.0f , 0)    //设置刷新监听    objectAnim.addUpdateListener(new AnimationUpdateListener(){        public void onAnimationUpate(ValueAnimation animation){            //获取当前的值            float value = (Float) animation.getAnimatedValue();            //设置内容            view.setScaleX(value);            view.setScaleY(value);            view.setAlpha(value);        }    });    objectAnim.setDuration(50000)    objectAnim.start()```//属性动画加强```    //执行属性动画    ValueAnimation valueAnim = new ValueAnimation();    //初始位置    valuesAnim.setObjectValues(new PointF(0, 0));    valuesAnim.setDuraion(10000)    //设置属性动画的执行过程数据    valueAnim.setEvaluator(new TypeEvaluator<PointF>(){        public PointF evaluate(float fraction, PointF startValue,             PointF endValue){            //fraction 就是当前的时间处以duration的比值            //startValue 起始点的数值            //endValue  终点的数值            PointF pointf = new PointF()            pointf.x = fraction * width;            pointf.y = (float) Math.sqrt(pointf.x * width)            return pointf        }    })    //设置动画变化的监听    valueAnim.addUpdateListener(new AnimationUpdateListener(){        public void onAnimationUpdate(valueAnimation animation){           //当前位置点           PointF point = animation.getAnimationValue();           //设置当前View的位置           imageView.setTranslationX(pointf.x)           imageView.setTranslationY(pointf.y)        }    });    valuesAnim.start()```