Android 抖音爱心动画,Android动画 - 仿抖音加载动画
在地铁中刷抖音,由于网络不通畅加载很慢,抖音会加载一个加载动画,感觉很有意思,于是分析了一下,自己写了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动画 - 仿抖音加载动画相关推荐
- Android仿搜狗浏览器加载动画
Android仿搜狗浏览器加载动画 周六,国庆放假调休,今天闲来无事,就看了下搜狗浏览器的加载动画.感觉结合前面学习的基础还是能做出来的,所以就简单的实现了下,然后写下这边博客给大家参考参考,权当巩固 ...
- android 今日头条加载动画,高仿今日头条加载动画
01 每每浏览手机app时,发现有的效果体验不错,作为一位程序员,总想要是自己来做,怎么实现. 今天我们来模仿今日头条的加载动画. 首先我们来看一下我们这个demo最终效果,有图有真相. 高仿今日头条 ...
- android 仿 动画,Android动画 - 仿58同城加载动画
Android动画 - 仿58同城加载动画 效果图 58LoadingView.gif 分析动画 首先分析动画,如上图所示: 动画分为三部分,分别为上方跳动部分,中间阴影部分,和下方文字部分. 上方跳 ...
- 加载html动画logo,仅CSS实现的加载动画 – Loader.css
仅CSS实现的加载动画 – Loader.css 4月 13, 2015 评论 (6) Sponsor 当网页的页面大小较大,用户加载可能需要较长的时间,在这些情况下,我们一般会用到(加载)loadi ...
- android 新闻应用、Xposed模块、酷炫的加载动画、下载模块、九宫格控件等源码...
Android精选源码 灵活的ShadowView,可替代CardView使用 基于Tesseract-OCR实现自动扫描识别手机号 Android播放界面仿QQ音乐开源音乐播放器 新闻应用项目采用了 ...
- android 新闻应用、Xposed模块、酷炫的加载动画、下载模块、九宫格控件等源码
Android精选源码 灵活的ShadowView,可替代CardView使用 基于Tesseract-OCR实现自动扫描识别手机号 Android播放界面仿QQ音乐开源音乐播放器 新闻应用项目采用了 ...
- android 新闻应用、Xposed模块、酷炫的加载动画、下载模块、九宫格控件等源码... 1
Android精选源码 灵活的ShadowView,可替代CardView使用 基于Tesseract-OCR实现自动扫描识别手机号 Android播放界面仿QQ音乐开源音乐播放器 新闻应用项目采用了 ...
- loading动画_超级简单的CSS加载动画(冰淇淋loading加载动画)
点击右上方红色按钮关注"web秀",让你真正秀起来 前言 昨天再次收到"月球居民爱丽丝"的投稿(非常感谢"月球居民爱丽丝"),希望做一个冰淇 ...
- 加载动画php,CSS3学习之页面加载动画(二)
本篇文章给大家分享6种css3的页面加载动画.有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. 在之前的文章[CSS3学习之页面加载动画(一)]中已经分享了四个CSS3的加载动画,今天 ...
- 安卓设置菊花动画_这种 “小菊花”式加载动画,会让人觉得等了很久
IT之家讯 9月3日消息,最近一项研究表明,当人们在看电视或者刷网页时,遇到网络不佳而出现的加载动画,有可能影响到人们等待过程的感受.例如我们常见的环形菊花状的加载动动画,当我们在等待视频或页面加载的 ...
最新文章
- 基于USEARCH或QIIME绘制Alpha多样性稀释曲线(rarefraction curve)
- Linux Rootkit 系列五:感染系统关键内核模块实现持久化
- linux下 LVM的应用
- 利用Android 8.0 ShortcutManager创建桌面快捷图标
- 前端那些事之原生 js实现贪吃蛇篇
- java性能分析工具_java性能分析工具
- 【李宏毅2020 ML/DL】P77 Generative Adversarial Network | Theory behind GAN
- hive 2.3 mysql_Hive(二)CentOS7.5安装Hive2.3.3
- arduino步进电机程序库_【MM32 eMiniBoard测评报告】+驱动步进电机
- 万物皆可DAO?一文带你全方位解读DAO类型
- 底部的footer导航栏被手机虚拟键盘顶起来如何解决
- 为什么信号源输出仅过一个电阻后,示波器测量出的输出电压会随输入频率增大而减小?----浅谈传输线分布电容与示波器的电容对信号传输的一种常见影响
- How Gradual Typing System Helps Us
- 【深度之眼PyTorch框架班第五期】作业打卡01:PyTorch简介及环境配置;PyTorch基础数据结构——张量
- springboot项目扫描不到controller中的解决方法
- UE4 Engine Fix-找回4.24后失去的Matinee
- 做国外LEAD需要一些邮箱怎么办
- openvas linux/window漏洞扫描和整改
- 私信基本功能数据库设计
- Unity 打包图集