Android自定义view基础之Animation(动画)-视图动画篇

199 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情

在讲解动画之前来一张思维导图

image.png Android的动画大体分为视图动画和属性动画两种,帧动画是一种特殊的动画。

  • 视图动画

    • 动画效果实际位置没有发生改变,只是视觉上的变化(布局没有发生改变)
    • 其主要用途是发生在一些视图切换的场景
  • 属性动画

    • 可以实现一个view其位置的真正改变
  • 帧动画

    • 可以理解为一组图片进行轮播,当速度很快的时候就形成了动画

视图动画

视图动画既可以以xml的格式来写,也可以在java代码中动态配置

xml方式

基础流程

  1. 在res目录下新建名为anim的文件夹

    然后新建Animation Resouse File image.png

    之后选择动画类型(对应思维导图)

2.编写动画

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

3.在Java代码中使用动画

Animation anmiation=AnimationUtils.loadAnimation(this,R.anim.scale);
view.startAnimation(animation);

之后就可以看到实际的动画效果了,这就是使用视图动画的基础流程

动画类型讲解

1.Scale放缩动画

fromXScale/fromYScale 动画起始时在X/Y方向上相对自身的放缩比例

toXscale/toYScale 与上一个属性相反

此属性的值为一个浮点值 eg:0.5代表缩小一倍

PivotX/Y :放缩的起始轴心 一般取值为百分数 例如50%从中心开始放缩

但是除此之外,他也有其他类型的取值如 50 和 50%p 均有不同的涵义

  • 百分比 :相对于当前View的百分比,例如50%就在当前View中心
  • 数值:相对于Android坐标系的位置

    android坐标系取左上角为原点,向右为x的正方向,向下为y的正方向

  • 百分比p: p为Parent的意思,表示在当前控件的左上角加上父控件宽 50%作为缩放起始点 坐标

2.Alpha透明度动画

  • fromAlpha/toAlpha 取值在0-1之间,也是一个浮点数

3.rotate旋转动画

  • fromDegrees/toDegrees

正值代表顺时针,反之亦然

  • pivotX/pivotY

旋转中心,与Scale里面的属性类似

4.translate 平移动画

fromXDelta/fromYDelta 平移的起始位置 toXDelta/toYDelta 结束时的位置

取值依然是三种取值 (数值 百分比 百分比P)

5.set

set动画就是以上动画合集,可以让动画以组合的形式同时播放

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha 
        android:fromAlpha="1.0"
        android:toAlpha="0.1"
        android:duration="1000"/>
    <translate 
        android:fromXDelta="-100%"
        android:toXDelta="0"
        android:duration="200">
    </translate>
    <scale 
        android:fromYScale="100%"
        android:fromXScale="100%"
        android:toYScale="30%"
        android:toXScale="30%"
        android:pivotY="0.5"
        android:pivotX="0.5"
        android:duration="1000"
        />
</set>

属性动画的其他API

duration:动画时间

fillAfter:动画是否保持结束时的样子

fillBefore:动画是否还原到原来的样子

repeatCount:动画的重复次数

repeatMode:动画重复类型 ,可选:reverse 和restart

代码实现

实现代码

ScaleAnimation animation=new ScaleAnimation(0,0,10,10);
animation.setDuration(200);
imageView.startAnimation(animation);

方法的重载参数和前面介绍的基本类似 image.png

而前面的对动画配置的一些api在代码中可以用一系列的set方法实现

image.png

其他类型的动画类型也是一样如法炮制

动画监听

ScaleAnimation animation=new ScaleAnimation(0,0,10,10);
animation.setDuration(200);
imageView.startAnimation(animation);
animation.setAnimationListener(new Animation.AnimationListener() {
    @Override
    public void onAnimationStart(Animation animation) {
        
    }

    @Override
    public void onAnimationEnd(Animation animation) {

    }

    @Override
    public void onAnimationRepeat(Animation animation) {

    }
});

动画插值器

动画插值器用来决定动画随时间的速度 ,有匀速的、加速的、减速的、弹跳的 也是在set类函数中实现的

alphaAnim . setinterpolator (new Linearinterpolator ());

image.png 具体可以参考官方文档 Interpolator  |  Android Developers (google.cn)