美文网首页
动画合集之补间动画

动画合集之补间动画

作者: 巫师Android | 来源:发表于2020-09-18 11:34 被阅读0次

前面学了帧动画:
动画合集之补间动画

和帧动画不同(帧动画是通过连续播放图片来模拟动画效果),补间动画只需要开发者提供动画开始动画结束时的“关键帧”,变化时的“中间帧”则由Android系统来计算并补齐。

一、补间动画的分类

补间动画共有以下五种:

  • AlphaAnimation:透明度渐变效果,对应<alpha/>标签。
    创建时指定开始以及结束透明度,透明度的变化范围(0,1),0是完全透明,1是完全不透明。
  • ScaleAnimation:缩放渐变效果,对应<scale/>标签。
    创建时指定开始以及结束的缩放比,以及缩放参考点。
  • TranslateAnimation:位移渐变效果,对应<translate/>标签。
    创建时指定起始以及结束位置即可。
  • RotateAnimation:旋转渐变效果,对应<rotate/>标签。
    创建时指定动画起始以及结束的旋转角度和旋转的轴心。
  • AnimationSet:组合渐变,对应<set/>标签,就是前面多种渐变的组合。

最后,就是所有动画都要指定以下持续的时间。

二、Interpolator(插值器)

在使用动画前,要先掌握一个知识点:Interpolator。
它可以用来控制动画的变化速度,Android中已经为我们提供了多个可供选择的实现类,我们也可以自己实现Interpolator 接口,用来自己控制动画的变化速度。下面看下系统的几个:

  • LinearInterpolator:动画以均匀的速度改变
  • AccelerateInterpolator:在动画开始的地方改变速度较慢,然后开始加速
  • AccelerateDecelerateInterpolator:在动画开始、结束的地方改变速度较慢,中间时加速
  • CycleInterpolator:动画循环播放特定次数,变化速度按正弦曲线改变: Math.sin(2 * mCycles * Math.PI * input)
  • DecelerateInterpolator:在动画开始的地方改变速度较快,然后开始减速
  • AnticipateInterpolator:反向,先向相反方向改变一段再加速播放
  • AnticipateOvershootInterpolator:开始的时候向后然后向前甩一定值后返回最后的值
  • BounceInterpolator: 跳跃,快到目的值时值会跳跃,如目的值100,后面的值可能依次为85,77,70,80,90,100
  • OvershottInterpolator:回弹,最后超出目的值然后缓慢改变到目的值

插值器也有对应的xml属性:android:interpolator。我们可以通过xml给动画添加插值器,示例:
@android:anim/accelerate_decelerate_interpolator。其他插值器也是类似的命名。

三、动画的定义和使用

我把动画的使用归纳为两个步骤:
1、定义动画(有静态的,即xml;也有动态代码的)
2、使用动画

下面先来看一下各种动画的静态(xml)定义:

首先自然是创建xml文件,如下:


image.png

1)AlphaAnimation(透明度渐变)
anim_alpha.xml:

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="5000"
    android:fromAlpha="1.0"
    android:toAlpha="0.0"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    >
    <!--
    fromAlpha :起始透明度
    toAlpha:结束透明度
    透明度的范围为:0-1,完全透明-完全不透明
    -->
</alpha>

2)ScaleAnimation(缩放渐变)
anim_scale.xml:

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fromXScale="0.2"
    android:fromYScale="0.2"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:pivotX="0.5"
    android:pivotY="0.5"
    android:toXScale="1.5"
    android:toYScale="1.5">
    <!--
        fromXScale/fromYScale:沿着X轴/Y轴缩放的起始比例
        toXScale/toYScale:沿着X轴/Y轴缩放的结束比例
        pivotX/pivotY:缩放的中轴点X/Y坐标,即距离自身左边缘的位置,比如50%就是以图像的 中心为中轴点
    -->
</scale>

3)TranslateAnimation(位移渐变)
anim_translate.xml:

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fromXDelta="0"
    android:fromYDelta="0"
    android:interpolator="@android:interpolator/accelerate_decelerate"
    android:toXDelta="320"
    android:toYDelta="320">

    <!--
    fromXDelta/fromYDelta:动画起始位置的X/Y坐标
    toXDelta/toYDelta:动画结束位置的X/Y坐标
    -->
</translate>

4)RotateAnimation(旋转渐变)
anim_rotate.xml:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/p1"
    android:duration="3000"
    android:fromDegrees="0"
    android:interpolator="@android:anim/anticipate_overshoot_interpolator"
    android:repeatCount="2"
    android:repeatMode="restart"
    android:toDegrees="360">

    <!--
    fromDegrees/toDegrees:旋转的起始/结束角度
    repeatCount:旋转的次数,默认值为0,代表一次,假如是其他值,比如3,则旋转4次 另外,值为-1或者infinite时,表示动画永不停止
    repeatMode:设置重复模式,默认restart,但只有当repeatCount大于0或者infinite或-1时 才有效。
                还可以设置成reverse,表示偶数次显示动画时会做方向相反的运动!
    -->
</rotate>

5)AnimationSet(组合渐变)
anim_set.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/bounce_interpolator"
    android:shareInterpolator="true">

    <scale xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="2000"
        android:fromXScale="0.2"
        android:fromYScale="0.2"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:pivotX="0.5"
        android:pivotY="0.5"
        android:toXScale="1.5"
        android:toYScale="1.5">

    </scale>

    <alpha xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="2000"
        android:fromAlpha="1.0"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:toAlpha="0.0">

    </alpha>

    <translate xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="2000"
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:interpolator="@android:interpolator/accelerate_decelerate"
        android:toXDelta="320"
        android:toYDelta="320">

    </translate>

    <rotate xmlns:android="http://schemas.android.com/apk/res/android"
        android:drawable="@drawable/p1"
        android:duration="3000"
        android:fromDegrees="0"
        android:interpolator="@android:anim/anticipate_overshoot_interpolator"
        android:repeatCount="2"
        android:repeatMode="restart"
        android:toDegrees="360">

    </rotate>

</set>
定义完动画,接下来就是使用了:

使用动画的核心代码就两行:

animation = AnimationUtils.loadAnimation(this,
                    R.anim.anim_alpha);
                img_show.startAnimation(animation);

下面放一个完整的使用例子:

/**
 * @author Li Zongwei
 */
public class TweenAnimActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btn_alpha;
    private Button btn_scale;
    private Button btn_tran;
    private Button btn_rotate;
    private Button btn_set;
    private ImageView img_show;
    private Animation animation = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_tween_anim);

        bindViews();
    }

    private void bindViews() {
        btn_alpha = findViewById(R.id.btn_alpha);
        btn_scale = findViewById(R.id.btn_scale);
        btn_tran = findViewById(R.id.btn_tran);
        btn_rotate = findViewById(R.id.btn_rotate);
        btn_set = findViewById(R.id.btn_set);
        img_show = findViewById(R.id.img_show);

        btn_alpha.setOnClickListener(this);
        btn_scale.setOnClickListener(this);
        btn_tran.setOnClickListener(this);
        btn_rotate.setOnClickListener(this);
        btn_set.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_alpha:
                animation = AnimationUtils.loadAnimation(this,
                    R.anim.anim_alpha);
                img_show.startAnimation(animation);
                break;
            case R.id.btn_scale:
                animation = AnimationUtils.loadAnimation(this,
                        R.anim.anim_scale);
                img_show.startAnimation(animation);
                break;
            case R.id.btn_tran:
                animation = AnimationUtils.loadAnimation(this,
                        R.anim.anim_translate);
                animation.setFillAfter(true);
                img_show.startAnimation(animation);
                break;
            case R.id.btn_rotate:
                animation = AnimationUtils.loadAnimation(this,
                        R.anim.anim_rotate);
                img_show.startAnimation(animation);
                break;
            case R.id.btn_set:
                animation = AnimationUtils.loadAnimation(this,
                        R.anim.anim_set);
                img_show.startAnimation(animation);
                break;
            default:
        }
    }

}

另外,还可以为动画设置监听:
setAnimationListener(new AnimationListener())方法,重写下面的三个方法即可:

  • onAnimationStart():动画开始
  • onAnimtaionRepeat():动画重复
  • onAnimationEnd():动画结束

三、总结

补间动画主要得掌握五种动画的使用,它们的属性有什么,对应什么样的效果。

学习动画主要是为自定义View做准备,在自定义View的时候,经常使用到动画,掌握动画的基本使用,以及一些常见的属性,包括插值器等概念,对后面的学习大有益处。

不过这个东西嘛,也不用死记硬背,主要还是要多使用,用多了,各种api及其参数也就印象深刻了。

写于:2020/09/18

相关文章

  • 动画合集之补间动画

    前面学了帧动画:动画合集之补间动画 和帧动画不同(帧动画是通过连续播放图片来模拟动画效果),补间动画只需要开发者提...

  • Android动画合集之补间动画

    补间动画分类: TranslateAnimation(位移动画)RotateAnimation(旋转动画)Scal...

  • Android 基础动画之帧动画详解

    在上一篇 Android 基础动画之补间动画详解 主要介绍了补间动画的基本属性以及补间动画在Android起始设计...

  • Android回顾--(十六) 动画简析

    动画: 补间动画(Tween动画) 帧动画(Frame动画) 属性动画(Property动画) 补间动画 特点: ...

  • 动画之补间动画

    特性: 渐变动画支持四种类型:平移(Translate)、旋转(Rotate)、缩放(Scale)、不透明度 只是...

  • javaScript补间动画库

    补间动画库 补间动画介绍 补间动画指的是做FLASH、VIDEO动画时,在两个关键帧中间需要做“补间动画”,才能实...

  • Android动画

    Android动画分类: 视图动画:补间动画、逐帧动画 属性动画 视图动画 补间动画 可以在xml中定义动画,然后...

  • Android动画之视图动画

    补间动画 可以使用补间动画系统执行补间动画。补间动画计算动画相关的信息包括开始点、结束点、大小、旋转角度以及其他与...

  • Android 资源简介(五) AnimationDrawabl

    AnimationDrawable 代表动画资源。Android 既支持逐帧动画,也支持补间动画。 定义补间动画的...

  • Android 动画锦集

    Android 动画可分为逐帧动画、补间动画、属性动画。使用传统的逐帧动画、补间动画可以实现 Android 基本...

网友评论

      本文标题:动画合集之补间动画

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