美文网首页
Android 动画

Android 动画

作者: feifei_fly | 来源:发表于2018-03-25 19:37 被阅读0次

Android 动画分类:

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

帧动画

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

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

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true"
    >
    <item
        android:duration="1000"
        android:drawable="@drawable/image1"
        />
    <item
        android:drawable="@drawable/image2"
        android:duration="1000"
        />
    <item
        android:drawable="@drawable/image3"
        android:duration="1000"
        />
</animation-lis

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

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromXScale="0.0"
    android:fromYScale="0.0"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toXScale="1.0"
    android:toYScale="1.0"
    android:duration="1000"
    >

</scale>

anim_set.xml 补间动画组合

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    >
 <alpha
     android:toAlpha="0.3"
     android:fromAlpha="1.0"
     />
    <scale
        android:fromXScale="0.3"
        android:fromYScale="0.3"
        android:pivotY="50%"
        android:pivotX="50%"
        android:toYScale="1.0"
        android:toXScale="1.0"
        />

    <translate
        android:fromXDelta="-100"
        android:fromYDelta="0"
        android:toXDelta="0"
        android:toYDelta="0"
        />

    <rotate
        android:pivotY="50%"
        android:pivotX="50%"
        android:fromDegrees="0"
        android:toDegrees="360"
        />

</set>
  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 动画

      本文链接:https://www.haomeiwen.com/subject/ludkcftx.html