Android 动画

Android 动画分类:

  1. 传统动画
  • 帧间动画
  • 补间动画
  1. 属性动画
    ObjectAnimator 和 ValueAnimator

帧动画

帧动画是最容易实现的一种动画,这种动画更多的依赖于完善的UI资源,他的原理就是将一张张单独的图片连贯的进行播放,

在res->drawalbe 目录下创建动画对应的frame_animation.xml(animation-list)



    
    
    

imageView.setImageResource()指定帧动画
imaggeView.getDrawable() 获取AnimationDrawable
AnimationDrawable.start()开始动画

iv_imageView.setImageResource(R.drawable.frame_animation);

        AnimationDrawable animationDrawable = (AnimationDrawable)iv_animation.getDrawable();
        if(animationDrawable != null){
            animationDrawable.start();
        }

补间动画

补间动画又可以分为四种形式,分别是 alpha(淡入淡出),translate(位移),scale(缩放大小),rotate(旋转)。

补间动画的实现,一般会采用xml 文件的形式;代码会更容易书写和阅读,同时也更容易复用

使用过程:

1. 在res->anim目录下建立 对应的xml 补间动画

scale_anim.mxl





anim_set.xml 补间动画组合



 
    

    

    


  1. 调用 补间动画
        //(1) 透明度变化
//        Animation animationAlhpa = AnimationUtils.loadAnimation(this,R.anim.alpha_anim);
//        iv_animation.startAnimation(animationAlhpa);

        //(2) 放缩动画
        //Animation animationScale = AnimationUtils.loadAnimation(this,R.anim.scale_anim);
        //iv_animation.startAnimation(animationScale);

        //(3)组合 动画
        Animation animation_set = AnimationUtils.loadAnimation(this,R.anim.anim_set);
        iv_animation.startAnimation(animation_set);

属性动画

属性动画,顾名思义它是对于对象属性的动画。因此,所有补间动画的内容,都可以通过属性动画实现。

ObjectAnimator

  //(1) 属性动画之 - 旋转
        ObjectAnimator animator_rotate = ObjectAnimator.ofFloat(iv_animation,"rotation",0f,270f);
        animator_rotate.start();

//        (2) 属性动画之 - alpha
        ObjectAnimator animator_alpha = ObjectAnimator.ofFloat(iv_animation,"alpha",1.0f,0.5f);
        animator_alpha.start();

        //(3)属性动画之 - 组合动画
        ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(iv_animation,"alpha",0.2f,1.0f);
        ObjectAnimator scaleXAnim = ObjectAnimator.ofFloat(iv_animation,"scaleX",0.5f,1.0f);
        ObjectAnimator scaleYAnim = ObjectAnimator.ofFloat(iv_animation,"scaleY",0.5f,1.0f);

        ObjectAnimator rotateAnim = ObjectAnimator.ofFloat(iv_animation,"rotation",0,360);
        ObjectAnimator transXAnim = ObjectAnimator.ofFloat(iv_animation,"translationX",100,400);
        ObjectAnimator transYAnim = ObjectAnimator.ofFloat(iv_animation,"translationY",100,750);

        AnimatorSet set = new AnimatorSet();
        set.playTogether(alphaAnim,scaleXAnim,scaleYAnim,rotateAnim,transXAnim,transYAnim);
        set.setDuration(3000);
        set.start();

ValueAnimator

ValueAnimator是ObjectAnimator的基础。本质上是一个插值器。

  • 指定开始值、结束值、和时间周期。ValueAnimator 就能产生从开始值到结束值之间变化的插值值animation.getAnimatedValue。

  • 你可以通过获得的插值 来设置一个甚至多个View的任何属性。从而实现单个单个视图某个属性或多个属性的变化。

  • 必要时还可以实现 多个视图View 共同变化的动画组。非常nice~

 final ValueAnimator animator = ValueAnimator.ofInt(0, 100);
         animator.setDuration(5000);
         animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
             @Override
             public void onAnimationUpdate(ValueAnimator animation) {
                 /**
                  * 通过这样一个监听事件,我们就可以获取
                  * 到ValueAnimator每一步所产生的值。
                  *
                  * 通过调用getAnimatedValue()获取到每个时间因子所产生的Value。
                  * */
                 Integer value = (Integer) animation.getAnimatedValue();
                 btn_click.setText(value + "");
             }
         });
         animator.start();

你可能感兴趣的:(Android 动画)