Android动画学习总结

47 阅读3分钟

 Android动画主要有三种:view动画,帧动画,属性动画。

1.view动画:

也叫补间动画,通过对场景的对象不断做图像变换(平移,缩放,旋转,透明度)从而产生动画效果,是一种渐进式动画。

     四种动画效果对应四种子类:

动画效果标签java类
平移动画TranslateAnimation
缩放动画ScaleAnimation
旋转动画RotateAnimation
透明度动画AlphaAnimation

使用view动画,首先要创建动画的xml文件,文件路径为:res/res/anim/animation_test.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:android1="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android1:fillAfter="false"
   android:repeatMode="reverse"
    android:shareInterpolator="true"
    android:startOffset="500"
    android:zAdjustment="normal">

    <rotate
        android:fromDegrees="0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:repeatCount="3"
        android:toDegrees="360"
        />
    <scale
        android:fromXScale="50%"
        android:fromYScale="50%"
        android:pivotX="50%"
        android:pivotY="50%"
        android:repeatCount="3"
        android:toXScale="100%"
        android:toYScale="100%"
        />
    <translate
        android:fromXDelta="-30%p"
        android:fromYDelta="0"
        android:repeatCount="3"
        android:toXDelta="30%p"
        android:toYDelta="0"
        />
    <alpha
        android:fromAlpha="1"
        android:repeatCount="3"
        android:toAlpha="0.2"
        />



</set>

转存失败,建议直接上传图片文件

设置动画

  /**
        *动画测试*
         * */
        //补间动画
        animation = AnimationUtils.loadAnimation(this, R.anim.animation_test);
        animation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                Toast.makeText(MainActivity.this, "补间动画开始", Toast.LENGTH_LONG).show();
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                Toast.makeText(MainActivity.this, "补间动画结束", Toast.LENGTH_LONG).show();
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
                Toast.makeText(MainActivity.this, "补间动画重复", Toast.LENGTH_LONG).show();
            }
        });

        testButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                testButton.startAnimation(animation);
            }
        });

转存失败,建议直接上传图片文件

动画效果:

转存失败,建议直接上传图片文件​编辑

​ ​

2.帧动画:

顺序播放一组预先设定好的图片,类似与电影的播放。系统提供AnimationDrawable类来使用帧动画

    先创建帧动画的xml布局,路径为res/drawable/anim_frame_test

<?xml version="1.0" encoding="utf-8"?>
<animation-list
    xmlns:android1="http://schemas.android.com/apk/res/android"
    android1:oneshot="false"
    >
    <item
        android1:drawable="@drawable/emoji1"
        android1:duration="200"
        />
    <item
        android1:drawable="@drawable/emoji2"
        android1:duration="200"
        />
    <item
        android1:drawable="@drawable/emoji3"
        android1:duration="200"
        />
    <item
        android1:drawable="@drawable/emoji4"
        android1:duration="200"
        />
    <item
        android1:drawable="@drawable/emoji5"
        android1:duration="200"
        />
    <item
        android1:drawable="@drawable/emoji6"
        android1:duration="200"
        />


</animation-list>

转存失败,建议直接上传图片文件

    设置动画

         ........
        //帧动画
        mAnimationDrawable = new AnimationDrawable();
        mAnimationDrawable.setOneShot(false);
        for(int i = 1; i<7; i++){
            int id = getResources().getIdentifier("emoji" + i, "drawable", getPackageName());
            Drawable drawable = ContextCompat.getDrawable(this, id);
            mAnimationDrawable.addFrame(drawable, 200);
        }
        testImage.setImageDrawable(mAnimationDrawable);

        startAnim.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mAnimationDrawable.start();
                
            }
        });

        stopAnim.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mAnimationDrawable.stop();
               
            }
        });

转存失败,建议直接上传图片文件

动画效果:

转存失败,建议直接上传图片文件​编辑

至此就实现了帧动画的完整过程

​ ​

3.属性动画:

3.0之前只有view动画和帧动画,这两种动画只改变view的视觉效果,对其属性无影响。所以加入了属性动画。

           在动画持续时间内,通过不断对值进行改变,并不断将该值赋给对象,从而实现该对象在任意属性上的动画效果。

利用属性动画组合实现view动画的四种操作。

 //propertyAnimationTest
    public void animatorSet(View view) {
        // 顺序执行
        AnimatorSet set1 = new AnimatorSet();
        ObjectAnimator translationAnimator1 = ObjectAnimator.ofFloat(view, "translationX", -400);
        ObjectAnimator translationAnimator2 = ObjectAnimator.ofFloat(view, "translationY", 400);
        ObjectAnimator translationAnimator3 = ObjectAnimator.ofFloat(view, "translationX", 300);
        ObjectAnimator translationAnimator4 = ObjectAnimator.ofFloat(view, "translationY", 0);
        ObjectAnimator translationAnimator5 = ObjectAnimator.ofFloat(view, "translationX", 0);

        set1.playSequentially(translationAnimator1, translationAnimator2, translationAnimator3, translationAnimator4, translationAnimator5);
        // 设置动画时长,这里的时长是每个子动画的时长
        set1.setDuration(5000);


        // 同时执行
        AnimatorSet set2 = new AnimatorSet();
        ObjectAnimator rotationAnimator = ObjectAnimator.ofFloat(view, "rotationY", 0, 360);
        ObjectAnimator scaleAnimator1 = ObjectAnimator.ofFloat(view, "scaleX", 0.2f, 1);
        ObjectAnimator scaleAnimator2 = ObjectAnimator.ofFloat(view, "scaleY", 0.2f, 1);
        ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(view, "alpha", 0.2f, 1);

        set2.playTogether(rotationAnimator, scaleAnimator1, scaleAnimator2, alphaAnimator);
        // 设置动画时长,这里的时长是每个子动画的时长
        set2.setDuration(5000);

      
        AnimatorSet set = new AnimatorSet();
        set.playTogether(set1,set2);
        set.start();
    }

转存失败,建议直接上传图片文件

  //属性动画
        slide_view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                animatorSet(slide_view);
            }
        });

转存失败,建议直接上传图片文件

动画效果:

转存失败,建议直接上传图片文件​编辑

4.插值器与估值器

TimeInterpolator:时间插值器,根据时间流逝的百分比来计算当前属性值改变的百分比。

AcclerateDecelerateInterpolator:加减速插值器,动画两头慢中间快

DecelerateInterpolator:减速插值器,动画越来越慢

TypeEvaluator:类型估值算法,也叫估值器,根据当前属性改变的百分比来计算改变后的属性值

IntEvaluator:(针对整形属性) FloatEvaluator(针对浮点型属性) ArgbEvalutor(针对Color属性)

属性动画中插值器和估值器是实现非匀速动画的重要手段。

5.属性动画的监听器

提供监听器用于监听动画的播放过程,主要提供了两个接口

AnimatorUpdataListener 和AnimatorListener

AnimatorUpdataListener 可监听动画的每一帧,AnimatorListener可监听动画的开始,结束,取消以及重复播放。