Animator

目录

  1. 思维导图
  2. 帧动画
    • 使用方式
    • 优缺点
    • 应用场景
  3. 补间动画
    • 位移、旋转、缩放、透明度动画
    • 优缺点
    • 应用场景
  4. 属性动画
    • 层次关系
    • ValueAnimator
      • ObjectAnimator
      • TimeAnimator
    • AnimatorSet
  5. 插值器、估值器
    • TypeEvaluator

      • IntEvaluator
      • FloutEvaluator
      • ArgbEvaluator
    • TimeInterpolator / Interpolator / BaseInterpolator
      • LinearInterpolator
      • AccelerateDecelerateInterpolator
  6. 参考

思维导图

帧动画

使用方式
  1. xml 定义方式

    在 drawable 目录下定义一个 drawable-list,然后给图片设置 res 就好了。

    <?xml version="1.0" encoding="utf-8"?>
    <animation-list xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@drawable/ic_vip" android:duration="100"/><item android:drawable="@drawable/ic_account" android:duration="100"/><item android:drawable="@drawable/ic_clouse" android:duration="100"/>//...
    </animation-list>
    
    mIvFrame.setImageResource(R.drawable.anim_frame);
    AnimationDrawable drawable = (AnimationDrawable) mIvFrame.getDrawable();
    drawable.start();
    drawable.stop();
    
  2. Java 代码实现

    其实就是用代码构建 AnimationDrawable。

    mAnimationDrawable=new AnimationDrawable();
    for (int i = 0; i < 10; i++) {if (i<5){mAnimationDrawable.addFrame(getDrawable(R.drawable.ic_vip),100);}else {mAnimationDrawable.addFrame(getDrawable(R.drawable.ic_clouse),100);}
    }
    mIvFrame.setImageDrawable(mAnimationDrawable);
    mAnimationDrawable.start();
    mAnimationDrawable.stop();
    
优缺点

优点:使用简单

缺点:图片是全部加载到内存中,可能导致 OOM。

应用场景

基本上很少使用,可以看成 GIF 图。

补间动画

位移动画
  1. xml 定义方式

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"><translateandroid:duration="1000"android:toXDelta="100"android:toYDelta="100"android:fromYDelta="0"android:fromXDelta="0"/>
    </set>
    
    mAnimation = AnimationUtils.loadAnimation(mContext, R.anim.anim_trans);
    mIvFrame.startAnimation(mAnimation);
    
  2. Java 代码实现方式

    TranslateAnimation animation = new TranslateAnimation(0, 100, 0, 100);
    animation.setDuration(1000);
    animation.setFillAfter(true);
    mIvFrame.startAnimation(animation);
    
其他动画

类似,不举例了。

优缺点

优点:使用简单

缺点:只改变显示,不改变实际属性

应用场景

基本上大部分动画都能实现,常见于 Activity 转场动画等等

属性动画

层次关系

Animator

  • AnimatorSet
  • ValueAnimator
    • ObjectAnimator
    • TimeAnimator
ValueAnimator

常用使用方式:

    private void setAnimator() {mValueAnimator = new ValueAnimator();mValueAnimator.setIntValues(0, 500);mValueAnimator.setDuration(2000);mValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {Log.i(TAG, "onAnimationUpdate: " + animation.getAnimatedValue());float y = ((int) animation.getAnimatedValue()) * 1.0f;mIvFrame.setTranslationY(y);}});mValueAnimator.start();}
ObjectAnimator
        ObjectAnimator animator = ObjectAnimator.ofFloat(mBtnStart, "translationY", 0, 200).setDuration(2000);animator.start();

ObjectAnimator 在每次更新的时候会自动走 setXxx 方法,所以就不需要像 ValueAnimator 一样手动添加监听器,但是 ValueAnimator 的灵活性更好。

TimeAnimator

同样是继承至 ValueAnimator,但是它只做一件事:提供一个时间流,每 18ms 回调一次。

        mTimeAnimator = new TimeAnimator();mTimeAnimator.setTimeListener(new TimeAnimator.TimeListener() {@Overridepublic void onTimeUpdate(TimeAnimator animation, long totalTime, long deltaTime) {//动画执行的总时间_动画从上一桢到当前桢的间隔时间,单位都是毫秒Log.i(TAG, "onTimeUpdate: " + totalTime + "   " + deltaTime);}});

运行结果:

2021-01-20 15:01:54.344 6656-6656/com.example.animator I/AnimatorActivity: onTimeUpdate: 0   0
2021-01-20 15:01:54.346 6656-6656/com.example.animator I/AnimatorActivity: onTimeUpdate: 0   0
2021-01-20 15:01:54.356 6656-6656/com.example.animator I/AnimatorActivity: onTimeUpdate: 7   7
2021-01-20 15:01:54.375 6656-6656/com.example.animator I/AnimatorActivity: onTimeUpdate: 24   17
2021-01-20 15:01:54.388 6656-6656/com.example.animator I/AnimatorActivity: onTimeUpdate: 42   18
2021-01-20 15:01:54.407 6656-6656/com.example.animator I/AnimatorActivity: onTimeUpdate: 60   18
2021-01-20 15:01:54.424 6656-6656/com.example.animator I/AnimatorActivity: onTimeUpdate: 78   18
2021-01-20 15:01:54.444 6656-6656/com.example.animator I/AnimatorActivity: onTimeUpdate: 96   18

估值器、插值器

估值器表示属性的从初始值过渡到结束值变化的具体数值,而插值器则表示变化率,比如先加速后减速(默认)、匀速等等。

估值器

估值器都需要实现 TypeEvaluator 接口:

public interface TypeEvaluator<T> {public T evaluate(float fraction, T startValue, T endValue);
}

其实就是根据初始值和结束值算出一个值。

系统已经有几个默认实现,比如 ArgbEvaluator、IntEvaluator、FloatEvaluator 等等。其实我们在用 ValueAnimator.ofArgb() 的时候,内部就是用 ArgbEvaluator 实现的,那对于 ValueAnimator.ofInt()、ValueAnimator.ofFloat() 方法是不是也是一样的道理呢?

下面将介绍如何自定义估值器,所实现的功能:

首先定义按钮所需要的属性:

public class ButtonInfo {public int color;public int x;public int y;public ButtonInfo(int color, int x, int y) {this.color = color;this.x = x;this.y = y;}public ButtonInfo() {}
}

自定义估值器:

public class ButtonEvaluator implements TypeEvaluator {@Overridepublic Object evaluate(float fraction, Object startValue, Object endValue) {ButtonInfo start = (ButtonInfo) startValue;ButtonInfo end = (ButtonInfo) endValue;ButtonInfo buttonInfo = new ButtonInfo();ArgbEvaluator argbEvaluator = new ArgbEvaluator();buttonInfo.color = (int) argbEvaluator.evaluate(fraction, ((ButtonInfo) startValue).color, ((ButtonInfo) endValue).color);buttonInfo.x = (int) (fraction * (end.x - start.x) + start.x);buttonInfo.y = (int) (fraction * (end.y - start.y) + start.y);return buttonInfo;}
}

运用:

    private void setTransAnimator() {mValueAnimator = ValueAnimator.ofObject(new ButtonEvaluator(), new ButtonInfo(0xff94E1F7, 0, 0), new ButtonInfo(0xffF35519, 500, 500));mValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {ButtonInfo buttonInfo = (ButtonInfo) animation.getAnimatedValue();mBtnStart.setBackgroundColor(buttonInfo.color);mBtnStart.setTranslationX(buttonInfo.x);mBtnStart.setTranslationY(buttonInfo.y);}});mValueAnimator.setDuration(5000);mValueAnimator.start();}

可以,看出,实际上自定义估值器还是很简单。

插值器

插值器需要实现 TimeInterpolator 或 Interpolator:

public interface TimeInterpolator {float getInterpolation(float input);
}public interface Interpolator extends TimeInterpolator {}

Android 系统内置了几种实现,默认是先加速后减速,即 AccelerateDecelerateInterpolator ,看一下源码实现:

public class AccelerateDecelerateInterpolator extends BaseInterpolatorimplements NativeInterpolatorFactory {public float getInterpolation(float input) {return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;}//...
}

四五十行代码,首先明确的就是 value 值是 0 ~ 1,所以以上就是表示余旋函数在 pi/2 和 pi 之间,就是先加速后减速。

那我们在看一下 LinearInterpolator 的源码:

/*** An interpolator where the rate of change is constant*/
@HasNativeInterpolator
public class LinearInterpolator extends BaseInterpolator implements NativeInterpolatorFactory {public float getInterpolation(float input) {return input;}//...
}

那在自定义插值器就易如反掌了呀,定义一个先减速后加速的插值器,如下:

public class DeceAcceInterpolator implements TimeInterpolator {@Overridepublic float getInterpolation(float input) {//余旋函数 0 ~ PI/2return (float) Math.cos(input * Math.PI / 2);}
}

然后给 ValueAnimator 设置自定义的插值器:

mValueAnimator.setInterpolator(new DeceAcceInterpolator());

啊?怎么反向了?看来设置变化率需要在 x 轴的下方呀。至于为什么?留个坑。

参考

Android 动画 Animator 家族使用指南

Android 动画 Animator 家族相关推荐

  1. Android 动画 Animator 家族使用指南

    零.前言:本文知识点 ValueAnimator的认识与使用 估值器TypeEvaluator的自定义与使用 插值器TimeInterpolator的自定义与使用 Path与Animator的结合使用 ...

  2. Android动画Animator家族使用指南

    零.前言:本文知识点 ValueAnimator的认识与使用 估值器TypeEvaluator的自定义与使用 插值器TimeInterpolator的自定义与使用 Path于Animator的结合使用 ...

  3. animator android,Android动画Animator开发问题

    在开发Android的Animator时遇到如下问题: 1. 关于Animator的循环播放: 在Animator动画中有循环的设置方法setRepeatCount(ValueAnimator.INF ...

  4. android 属性动画实例,Android 属性动画Animator工具类代码案例

    代码分享-> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ packa ...

  5. Android Animator(Android动画)

    前言:又是很久没有写blog了,原本想看完<Android群英转>在来总结一下的,但是看到后面突然发现前面看过的东西都忘记了.突然发现还是要总结一下....一定要总结!一定要总结!因为我发 ...

  6. Android动画特效之Animator属性动画实现

    Android动画特效之自定义view: Android动画特效之自定义view_Angel-杭州的博客-CSDN博客_android view 设置动画 由于上期Android动画特效之自定义Vie ...

  7. android jason动画,Android 动画之Lottie动画使用

    Android 动画之Lottie动画使用 一:简介 Lottie是Airbnb开源的一套跨平台的完整解决方案,设计师只需要使用After Effects(简称AE)设计动画之后,使用Lottic提供 ...

  8. android动画封装,Android属性动画封装,快速构建动画

    Android实现动画效果的方式主要有帧动画.补间动画.属性动画.关于安桌动画的基础知识可以查看这篇文章Android属性动画完全解析 这里我要讲的是如何快速构建出一个动画效果,如下图: 如果我们用属 ...

  9. android+动画队列,Android属性动画详解

    前言 属性动画是Android 3.0(API 11)新加入的动画框架,属性动画弥补了视图动画的很多短板,因此已经成为大多数动画场景的首选框架. 目录 目录 1. 属性动画出现的原因 在属性动画出现以 ...

最新文章

  1. R对数秩检验(log rank test)
  2. Java开发,月薪30k需要掌握哪些主流技术?
  3. GAN——UNIT简单梳理
  4. 【哈利波特】Sherbert Lemon对HP的解读之11
  5. redis setnx原子性_不支持原子性的 Redis 事务也叫事务吗?
  6. jQuery1.6性能评测
  7. PbootCMS V1.1.4 正式发布
  8. Javascript从零开始学习第一天
  9. Excel催化剂开源第4波-ClickOnce部署要点之导入数字证书及创建EXCEL信任文件夹
  10. su的2019面试准备
  11. 效果图什么网站赚零花钱_为什么你赚的钱少
  12. 基于无线网络的环境监测系统
  13. Ubantu16.04.6下使用petalinux2020.1定制Linux系统
  14. Task 编程中的异常处理
  15. css 上中下三行布局 4种方式
  16. 【烈日炎炎战后端】JAVA基础(3.4万字)
  17. Windows系统中文版切换英文版教程
  18. content root修改问题
  19. SpringAOP中@within和@annotation的区别
  20. echars的简单使用

热门文章

  1. 【机器人】“市场很冷,从业者很拼” | 众多国内机器人厂商热议当前市场状态|人工智能...
  2. 如何编译Linux kernel
  3. 打造超酷的PHP数据饼图
  4. 格罗方德今年有望提高汽车芯片产量,并将投入60亿美元扩大产能
  5. 2022年推出?特斯拉人形机器人被批就是个笑话
  6. 10元/小时?大涨价后,共享充电宝行业迎来“大地震”!
  7. “洗净净”、“洗香香”、“洗爽爽” 京东又申请了这些商标
  8. 理想汽车,重新定义“召回”
  9. 英国四大运营商联合发文:驳斥“新冠病毒与5G有关”谣言
  10. 汽车行业持续亏损?奥迪:不存在的