一款炫酷Loading动画--载入失败
简单介绍
上一篇文章一款炫酷Loading动画–载入成功。给大家介绍了成功动画的绘制过程,这篇文章将接着介绍载入失败特效的制作。
相比成功动画,有了前面的经验,失败动画的过程就显得比較简单了。
动画结构分析
首先我们来看失败动画的一张图:
失败动画的状态转移描写叙述例如以下:
1、载入过程,画蓝色圆环,当进度为100%时。圆环完毕
2、从右側抛出蓝色小方块。小方块沿着曲线到达圆环正上方
3、小方块突然消失。红色感叹号逐渐出现
4、感叹号完整出现以后。圆环变红色。感叹号发生震动
因为前两个过程,和载入成功是一样的,所以我们主要来看过程3,4。
红色感叹号逐渐出现
“逐渐”,有这两个字。我们就应该知道这是一个动画效果。
将感叹号分成两个路径,较长的和较短的。剩下来的工作。就是我们将这个路径逐渐绘制出来。
这个思路和之前的绿色勾等的绘制是一样的。
我们须要一个计时器,两个路径Path,和相应的PathMeasure。
这里我们结合代码说得更清楚些。路径是这种:
//感叹号路径
Path commaPath1 = new Path();
Path commaPath2 = new Path();
commaPath1.moveTo(2f * radius+strokeWidth, 1.25f * radius+strokeWidth);
commaPath1.lineTo(2f * radius+strokeWidth, 2.25f * radius+strokeWidth);
commaPath2.moveTo(2f * radius+strokeWidth, 2.75f * radius+strokeWidth);
commaPath2.lineTo(2f * radius+strokeWidth, 2.5f * radius+strokeWidth);
commaPathMeasure1 = new PathMeasure(commaPath1,false);
commaPathMeasure2 = new PathMeasure(commaPath2,false);
计时器就简单了,是一个ValueAnimator
//感叹号动画
mCommaAnimation = ValueAnimator.ofFloat(0f, 1f);
mCommaAnimation.setDuration(500);
mCommaAnimation.setInterpolator(new AccelerateInterpolator());
mCommaAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
commaPrecent = (float) animation.getAnimatedValue();
invalidate();
}
});
最后,利用PathMeasure计算出的部分路径。就能够逐渐将完整路径绘制出来
/**
* 绘制感叹号
*/
private void drawComma(Canvas canvas) {
Path path1 = new Path();
commaPathMeasure1.getSegment(0, commaPrecent * commaPathMeasure1.getLength(), path1, true);
path1.rLineTo(0, 0);
Path path2 = new Path();
commaPathMeasure2.getSegment(0, commaPrecent * commaPathMeasure2.getLength(), path2, true);
path2.rLineTo(0, 0);
canvas.drawPath(path1, commaPaint);//较长
canvas.drawPath(path2, commaPaint);//较短
canvas.drawArc(mRectF, 0, 360, false, commaPaint);//红色圆环
}
红色感叹号震动
震动效果怎么实现了,我的思路是旋转画布!
细致观察震动效果,会发现过程是这种:
向左偏移-》回到中间-》向右偏移-》回到中间-》向左偏移-》。
。
。
这意味着震动事实上是一个高速偏移的过程,可是要偏移一定角度。再绘制感叹号会比較麻烦。我想出来的办法,就是将画布偏移,而不是将感叹号偏移。
于是我们的计时器是这种:
//震动动画
mshockAnimation = ValueAnimator.ofInt(-1, 0, 1, 0, -1, 0,1,0);
mshockAnimation.setDuration(1000);
mshockAnimation.setInterpolator(new LinearInterpolator());
mshockAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
shockPrecent = (int) animation.getAnimatedValue();
invalidate();
}
});
假设是-1,画布就向左旋转30度,0就不旋转。1就向右旋转30度。
/**
* 绘制震动效果
* @param canvas
*/
private void drawShockComma(Canvas canvas) {
Path path1 = new Path();
commaPathMeasure1.getSegment(0, commaPathMeasure1.getLength(), path1, true);
path1.rLineTo(0, 0);
Path path2 = new Path();
commaPathMeasure2.getSegment(0, commaPathMeasure2.getLength(), path2, true);
path2.rLineTo(0, 0);
if (shockPrecent!=0){
canvas.save();
if (shockPrecent==1)
canvas.rotate(shockDir, 2 * radius, 2 * radius);
else if(shockPrecent==-1)
canvas.rotate(-shockDir, 2 * radius, 2 * radius);
}
canvas.drawPath(path1, commaPaint);
canvas.drawPath(path2, commaPaint);
canvas.drawArc(mRectF, 0, 360, false, commaPaint);
if (shockPrecent!=0) {
canvas.restore();
}
}
当中注意,canvas.save()方法和canvas.restore()方法必须成对使用,然后我们调用canvas.rotate()方法,就能够旋转画布了。
写在最后
有了前面的经验,失败动画事实上就是新瓶装旧酒了。使用画布旋转来实现震动。这个思路也是比較有趣的。
对于API不熟悉的朋友,建议用到的时候去查官方文档。或者看看其它朋友的一些介绍基础的文章。
最后。提供源代码下载地址和github地址。欢迎大家下载和star。
一款炫酷Loading动画--载入失败的更多相关文章
- 一款炫酷Loading动画--载入成功
简单介绍 昨天在简书上看到一篇文章.介绍了一个载入动画的实现过程 一款Loading动画的实现思路(一) 仅仅可惜原动画是IOS上制作的.而看了一下.作者的实现思路比較复杂,于是趁着空暇写了一个And ...
- 推荐六款炫酷的HTML5效果插件
1. HTML5 3D图片阴影翻转动画 效果很酷 分享一款很酷的HTML5 3D动画特效,这款3D特效可以为你的图片增加阴影的效果,而且可以让图片在鼠标滑过的时候出现3D翻转的动画效果.这和HTML5 ...
- uwp - 做一个相对炫酷的动画按钮/按钮动画
原文:uwp - 做一个相对炫酷的动画按钮/按钮动画 看腻了系统自带的button animation何不尝试下自定义一个较为炫酷的动画顺便提升用户体验.效果图: 动画分为几个部分,分别是:内圆从中心 ...
- 手把手带你做一个超炫酷loading成功动画view Android自定义view
写在前面: 本篇可能是手把手自定义view系列最后一篇了,实际上我也是一周前才开始真正接触自定义view,通过这一周的练习,基本上已经熟练自定义view,能够应对一般的view需要,那么就以本篇来结尾 ...
- 一款炫酷的幻灯片播放框架介绍(附demo及使用方法)
废话不多说,先上demo(建议在chrome下打开 F键全屏 esc退出全屏): 我的demo-博客园简介 官网demo 更多demo 今天为大家介绍一款基于css3和JavaScript的幻灯片播放 ...
- Android ViewPager+属性动画 实现炫酷视差动画效果
ViewPager有一个setPageTransform()方法可以实现很多酷炫的动画效果 先来个仿QQ的侧滑面板效果 vp.setPageTransformer(true, new PageTran ...
- iOS开发之窥探UICollectionViewController(五) --一款炫酷的图片浏览组件
本篇博客应该算的上CollectionView的高级应用了,从iOS开发之窥探UICollectionViewController(一)到今天的(五),可谓是由浅入深的窥探了一下UICollectio ...
- WPF实现炫酷Loading控件
Win8系统的Loading效果还是很不错的,网上也有人用CSS3等技术实现,研究了一下,并打算用WPF自定义一个Loading控件实现类似的效果,并可以让用户对Loading的颗粒(Particle ...
- 炫酷线条动画--svg
我们经常可以在一些页面看到看起来很酷的线条动画,有些可以用css实现,有些css就无能为力了,今天来研究另一种实现方式,svg 如果对svg是什么还不了解的话,可以先去看看svg的基础教程: 一般对于 ...
随机推荐
- 学习RFT之:TestObject.find方法的了解与使用
第一部分:了解TestObject.find 一.TestObject.find方法的作用 1.测试过程中动态的找到测试对象(控件.标签等),使我们的测试用例不再依赖RFT自带的对象地图(Object ...
- 【转】jvm收集器
HotSpot JVM收集器 上面有7中收集器,分为两块,上面为新生代收集器,下面是老年代收集器.如果两个收集器之间存在连线,就说明它们可以搭配使用. Serial(串行GC)收集器 Serial收集 ...
- 使用antlr4及java实现snl语言的解释器
对于antlr4的基础使用,请参考我的前一篇文章<用antlr4来实现<按编译原理的思路设计的一个计算器>中的计算器>. 其实我对于antlr4的理解也仅限于那篇文章的范围,但 ...
- nginx--提供一键安装脚本
nginx特点 基于进程池实现的fastcgi 单一进程即可实现处理上千的连接 易于扩展的插件系统 安装篇 *下载源码 curl -O http://nginx.org/download/nginx- ...
- JavaScipt30(第二个案例)
承接上篇https://www.cnblogs.com/wangxi01/p/10641115.html,这是第二个案例 附上项目链接: https://github.com/wesbos/JavaS ...
- 模板—splay
#include<iostream> #include<cstdio> #define cin(x) scanf("%d",&x) using na ...
- ios8 UITableView设置 setSeparatorInset:UIEdgeInsetsZero不起作用的解决办法(去掉15px空白间距)
但是在ios8中,设置setSeparatorInset:UIEdgeInsetsZero 已经不起作用了.下面是解决办法: 首先在viewDidLoad方法加入以下代码: if(leftTable! ...
- 低版本ie兼容问题的解决方案
CSS hack \9 所有的IE10及之前 * IE7以及IE7以下版本的 _ IE6以及IE6以下版本的 !important 提升样式优先级权重 1.ie6,7 ...
- 字符串系列——KMP模板整理
KMP模板整理 KMP与扩展KMP: /*vs 2017/ vs code以外编译器,去掉windows.h头文件和system("pause");*/ #include<i ...
- 手写redis的docker文件,通过docker-compose配置redis
在前面一遍随笔,配置的是mysql主从的docker-compose配置.今天我们来学习配置编排容器redis. 准备环境: docker 18.06.1-ce docker-compose 1.23 ...