在地铁中刷抖音,由于网络不通畅加载很慢,抖音会加载一个加载动画,感觉很有意思,于是分析了一下,自己写了Demo,实现效果。

效果图

分析动画

首先分析动画,初始状态是由两个相切的圆形图案组成。

将动画拆解为两部分看。

从蓝色小球在左,红色小球在右作为起始位置,蓝色小球向右移动,红色小球向左移动(同时先缩小,在还原),两个小球相交的部分变黑。

同第一步相同,只是两小球变换位置。

进行绘制

主要运用Drawable动画进行绘制。

public class DouYinLoadingDrawable extends Drawable implements Animatable{

}

复制代码

首先准备三个Paint,和三个Path。为了绘制动画中的两个圆形图案和重合部分的图案。

private Paint leftBallPaint, rightBallPaint, coincideBallPaint;

private Path leftBallPath, rightBallPath, coincideBallPath;

复制代码

绘制分为两个过程,蓝色小球向左和蓝色小球向右,创建枚举来控制动画的过程。

public enum Direction{

LEFT,

RIGHT

}

复制代码

开始绘制,在ondraw()中进行绘制。

@Override

public void draw(@NonNull Canvas canvas){

if (mCurrentDirection == Direction.LEFT) {

canvas.save();

leftBallPath.reset();

leftBallPath.addCircle(centerX - radius + translate, centerY, radius, Path.Direction.CCW);

canvas.drawPath(leftBallPath, leftBallPaint);

canvas.restore();

canvas.save();

rightBallPath.reset();

rightBallPath.addCircle(centerX + radius - translate, centerY, radius * scale, Path.Direction.CCW);

canvas.drawPath(rightBallPath, rightBallPaint);

canvas.restore();

canvas.save();

coincideBallPath.reset();

coincideBallPath.op(leftBallPath, rightBallPath, Path.Op.INTERSECT);

canvas.drawPath(coincideBallPath, coincideBallPaint);

canvas.restore();

} else if (mCurrentDirection == Direction.RIGHT) {

canvas.save();

rightBallPath.reset();

rightBallPath.addCircle(centerX - radius + translate, centerY, 20, Path.Direction.CCW);

canvas.drawPath(rightBallPath, rightBallPaint);

canvas.restore();

canvas.save();

leftBallPath.reset();

leftBallPath.addCircle(centerX + radius - translate, centerY, 20 * scale, Path.Direction.CCW);

canvas.drawPath(leftBallPath, leftBallPaint);

canvas.restore();

canvas.save();

coincideBallPath.reset();

coincideBallPath.op(leftBallPath, rightBallPath, Path.Op.INTERSECT);

canvas.drawPath(coincideBallPath, coincideBallPaint);

canvas.restore();

}

}

复制代码

进行动画部分代码编写,主要运用ValueAnimator

首先开始向左部分动画,向左部分动画结束后,两小球交换圆心左边,重复向左部分动画。

private void leftAnimation(){

//平移动画

final ValueAnimator translateAnimator = ValueAnimator.ofFloat(0, 2 * radius);

translateAnimator.setStartDelay(200);

translateAnimator.setDuration(350);

translateAnimator.setInterpolator(new AccelerateDecelerateInterpolator());

translateAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

@Override

public void onAnimationUpdate(ValueAnimator animation){

translate = (float) translateAnimator.getAnimatedValue();

invalidateSelf();

}

});

//缩放动画

final ValueAnimator scaleAnimator = ValueAnimator.ofFloat(1, 0.5f, 1);

scaleAnimator.setStartDelay(200);

scaleAnimator.setDuration(350);

scaleAnimator.setInterpolator(new AccelerateDecelerateInterpolator());

scaleAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

@Override

public void onAnimationUpdate(ValueAnimator animation){

scale = (float) scaleAnimator.getAnimatedValue();

invalidateSelf();

}

});

translateAnimator.addListener(new AnimatorListenerAdapter() {

@Override

public void onAnimationEnd(Animator animation){

//每次动画结束后,改变Direction的值,进行反向动画

if (mCurrentDirection == Direction.LEFT)

mCurrentDirection = Direction.RIGHT;

else

mCurrentDirection = Direction.LEFT;

translate = 0;

leftAnimation();

}

});

animatorSet = new AnimatorSet();

animatorSet.playTogether(translateAnimator, scaleAnimator);

animatorSet.start();

}

复制代码

动画使用

在ImageView中设置drawable即可

DouYinLoadingDrawable douYinLoadingDrawable =new DouYinLoadingDrawable();

imageView.setImageDrawable(douYinLoadingDrawable);

douYinLoadingDrawable.start();

复制代码

GitHub地址

往期文章地址

Android 抖音爱心动画,Android动画 - 仿抖音加载动画相关推荐

  1. Android仿搜狗浏览器加载动画

    Android仿搜狗浏览器加载动画 周六,国庆放假调休,今天闲来无事,就看了下搜狗浏览器的加载动画.感觉结合前面学习的基础还是能做出来的,所以就简单的实现了下,然后写下这边博客给大家参考参考,权当巩固 ...

  2. android 今日头条加载动画,高仿今日头条加载动画

    01 每每浏览手机app时,发现有的效果体验不错,作为一位程序员,总想要是自己来做,怎么实现. 今天我们来模仿今日头条的加载动画. 首先我们来看一下我们这个demo最终效果,有图有真相. 高仿今日头条 ...

  3. android 仿 动画,Android动画 - 仿58同城加载动画

    Android动画 - 仿58同城加载动画 效果图 58LoadingView.gif 分析动画 首先分析动画,如上图所示: 动画分为三部分,分别为上方跳动部分,中间阴影部分,和下方文字部分. 上方跳 ...

  4. 加载html动画logo,仅CSS实现的加载动画 – Loader.css

    仅CSS实现的加载动画 – Loader.css 4月 13, 2015 评论 (6) Sponsor 当网页的页面大小较大,用户加载可能需要较长的时间,在这些情况下,我们一般会用到(加载)loadi ...

  5. android 新闻应用、Xposed模块、酷炫的加载动画、下载模块、九宫格控件等源码...

    Android精选源码 灵活的ShadowView,可替代CardView使用 基于Tesseract-OCR实现自动扫描识别手机号 Android播放界面仿QQ音乐开源音乐播放器 新闻应用项目采用了 ...

  6. android 新闻应用、Xposed模块、酷炫的加载动画、下载模块、九宫格控件等源码

    Android精选源码 灵活的ShadowView,可替代CardView使用 基于Tesseract-OCR实现自动扫描识别手机号 Android播放界面仿QQ音乐开源音乐播放器 新闻应用项目采用了 ...

  7. android 新闻应用、Xposed模块、酷炫的加载动画、下载模块、九宫格控件等源码... 1

    Android精选源码 灵活的ShadowView,可替代CardView使用 基于Tesseract-OCR实现自动扫描识别手机号 Android播放界面仿QQ音乐开源音乐播放器 新闻应用项目采用了 ...

  8. loading动画_超级简单的CSS加载动画(冰淇淋loading加载动画)

    点击右上方红色按钮关注"web秀",让你真正秀起来 前言 昨天再次收到"月球居民爱丽丝"的投稿(非常感谢"月球居民爱丽丝"),希望做一个冰淇 ...

  9. 加载动画php,CSS3学习之页面加载动画(二)

    本篇文章给大家分享6种css3的页面加载动画.有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. 在之前的文章[CSS3学习之页面加载动画(一)]中已经分享了四个CSS3的加载动画,今天 ...

  10. 安卓设置菊花动画_这种 “小菊花”式加载动画,会让人觉得等了很久

    IT之家讯 9月3日消息,最近一项研究表明,当人们在看电视或者刷网页时,遇到网络不佳而出现的加载动画,有可能影响到人们等待过程的感受.例如我们常见的环形菊花状的加载动动画,当我们在等待视频或页面加载的 ...

最新文章

  1. 基于USEARCH或QIIME绘制Alpha多样性稀释曲线(rarefraction curve)
  2. Linux Rootkit 系列五:感染系统关键内核模块实现持久化
  3. linux下 LVM的应用
  4. 利用Android 8.0 ShortcutManager创建桌面快捷图标
  5. 前端那些事之原生 js实现贪吃蛇篇
  6. java性能分析工具_java性能分析工具
  7. 【李宏毅2020 ML/DL】P77 Generative Adversarial Network | Theory behind GAN
  8. hive 2.3 mysql_Hive(二)CentOS7.5安装Hive2.3.3
  9. arduino步进电机程序库_【MM32 eMiniBoard测评报告】+驱动步进电机
  10. 万物皆可DAO?一文带你全方位解读DAO类型
  11. 底部的footer导航栏被手机虚拟键盘顶起来如何解决
  12. 为什么信号源输出仅过一个电阻后,示波器测量出的输出电压会随输入频率增大而减小?----浅谈传输线分布电容与示波器的电容对信号传输的一种常见影响
  13. How Gradual Typing System Helps Us
  14. 【深度之眼PyTorch框架班第五期】作业打卡01:PyTorch简介及环境配置;PyTorch基础数据结构——张量
  15. springboot项目扫描不到controller中的解决方法
  16. UE4 Engine Fix-找回4.24后失去的Matinee
  17. 做国外LEAD需要一些邮箱怎么办
  18. openvas linux/window漏洞扫描和整改
  19. 私信基本功能数据库设计
  20. Unity 打包图集

热门文章

  1. C语言 ACLLib键盘方向键控制图形移动以及鼠标控制图形移动
  2. SQL触发器新增自动生成唯一编号
  3. 回应张逸老师(二)小甜甜和牛夫人?
  4. oracle怎么声明nvl函数,[转载]Oracle中的NVL函数
  5. virtual box 6.1不支持云主机安装、运行虚拟机 改为低版本即可 4.1.0
  6. 排列矩阵和三角矩阵——Matlab解线性方程组(2)
  7. rabbitmq死信队列详解与使用
  8. python urlparse模块的用法
  9. 深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接
  10. 我的网易微博也搬家一下