一款炫酷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的基础教程: 一般对于 ...
随机推荐
- 关于vue构建项目的一些指令
第一步: brew install nodejs(MAC机子下) Windows直接官网下载对应版本node.js 第二步: 获取nodejs模块安装目录访问权限(Windows系统忽略)sudo ...
- Windows开启ICMP包回显
- 16位/32位/64位CPU的位究竟是说啥
平时,我们谈论CPU,都会说某程序是32位编译,可以跑在32位机或64位机,或则是在下载某些开源包时,也分32位CPU版本或64CPU位版本,又或者在看计算机组成相关书籍时,特别时谈到X86 CPU时 ...
- js一般用法
<1> 通过id查找html元素 var x=document.getElementById("intro"); <2> 通过标签名查找html元素 v ...
- 13jsp、javaWeb开发模式
13jsp.javaWeb开发模式-2018/07/25 1.jsp jsp实际上就是servlet.jsp=html+java,为用户提供动态内容 不适合编写Java逻辑 2.JSP原理 翻译(生成 ...
- [Algorithm] 3. Digit Counts
Description Count the number of k's between 0 and n. k can be 0 - 9. Example if n = 12, k = 1 in [0, ...
- UVA - 808 Bee Breeding (建立坐标系&找规律)
题目: 输入两个格子的编号a和b(a,b≤10000),求最短距离.例如,19和30的距离为5(一条最短路是19-7-6-5-15-30). 思路: 如图建立坐标系,然后看两个点的向量如果位于二四象限 ...
- UVA - 10603 Fill(BFS求最小值问题)
题目: 给出三个杯子(没有刻度线)的容量,起初之后第三个杯子是满的,其他的两个杯子是空的,容量分别是a.b.c.问最少需要倒多少升水才能让某一个杯子中的水有d升?如果不能恰好做到d升,就让某一个杯子里 ...
- 访问请求参数request.getParameter()
访问请求参数request.getParameter() 制作人:全心全意 getParameter() 例: 传递参数页: <%@ page language="java" ...
- Python selenium chrome打包exe后禁用控制台输出滚动日志
Python selenium chrome打包exe后,在运行的过程中,如果遇到需要input()输入时,会发现被不断滚动刷新的日志把命令行输入快速顶掉了,通过查阅资料不断实践,发现以下方法有效: ...