简单介绍

上一篇文章一款炫酷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动画--载入失败的更多相关文章

  1. 一款炫酷Loading动画--载入成功

    简单介绍 昨天在简书上看到一篇文章.介绍了一个载入动画的实现过程 一款Loading动画的实现思路(一) 仅仅可惜原动画是IOS上制作的.而看了一下.作者的实现思路比較复杂,于是趁着空暇写了一个And ...

  2. 推荐六款炫酷的HTML5效果插件

    1. HTML5 3D图片阴影翻转动画 效果很酷 分享一款很酷的HTML5 3D动画特效,这款3D特效可以为你的图片增加阴影的效果,而且可以让图片在鼠标滑过的时候出现3D翻转的动画效果.这和HTML5 ...

  3. uwp - 做一个相对炫酷的动画按钮/按钮动画

    原文:uwp - 做一个相对炫酷的动画按钮/按钮动画 看腻了系统自带的button animation何不尝试下自定义一个较为炫酷的动画顺便提升用户体验.效果图: 动画分为几个部分,分别是:内圆从中心 ...

  4. 手把手带你做一个超炫酷loading成功动画view Android自定义view

    写在前面: 本篇可能是手把手自定义view系列最后一篇了,实际上我也是一周前才开始真正接触自定义view,通过这一周的练习,基本上已经熟练自定义view,能够应对一般的view需要,那么就以本篇来结尾 ...

  5. 一款炫酷的幻灯片播放框架介绍(附demo及使用方法)

    废话不多说,先上demo(建议在chrome下打开 F键全屏 esc退出全屏): 我的demo-博客园简介 官网demo 更多demo 今天为大家介绍一款基于css3和JavaScript的幻灯片播放 ...

  6. Android ViewPager+属性动画 实现炫酷视差动画效果

    ViewPager有一个setPageTransform()方法可以实现很多酷炫的动画效果 先来个仿QQ的侧滑面板效果 vp.setPageTransformer(true, new PageTran ...

  7. iOS开发之窥探UICollectionViewController(五) --一款炫酷的图片浏览组件

    本篇博客应该算的上CollectionView的高级应用了,从iOS开发之窥探UICollectionViewController(一)到今天的(五),可谓是由浅入深的窥探了一下UICollectio ...

  8. WPF实现炫酷Loading控件

    Win8系统的Loading效果还是很不错的,网上也有人用CSS3等技术实现,研究了一下,并打算用WPF自定义一个Loading控件实现类似的效果,并可以让用户对Loading的颗粒(Particle ...

  9. 炫酷线条动画--svg

    我们经常可以在一些页面看到看起来很酷的线条动画,有些可以用css实现,有些css就无能为力了,今天来研究另一种实现方式,svg 如果对svg是什么还不了解的话,可以先去看看svg的基础教程: 一般对于 ...

随机推荐

  1. 安装ipython notebook及基本命令(快捷键)

    转载自:http://121.42.47.99/yuenshome/wordpress/?p=2622 目前基本上是Pycharm和ipython notebook结合起来做东西,ipython no ...

  2. DatePickerDialog和TimePickerDialog(基于对话框显示时间和日期)

    public class MainActivity extends Activity implements android.view.View.OnClickListener{ private But ...

  3. 【C++】智能指针简述(四):shared_ptr

    在开始本文内容之前,我们再来总结一下,前文内容: 1.智能指针采用RAII机制,在构造对象时进行资源的初始化,析构对象时进行资源的清理及汕尾. 2.auto_ptr防止拷贝后析构释放同一块内存,采用& ...

  4. ajax的底层前后台交互

    为什么用ajax或者它的优点: 异步加载数据,无需切换页面 更加的用户体验,局部刷新,及时验证,操作步骤简化: 节省流量 js控制数据的加载,更加灵活多用. 底层就是XMLHttpRequest对象: ...

  5. Redis应用场景[分享]

    Redis应用场景[分享] 1.取最新N个数据的操作2.排行榜应用 取TOPN操作3.需要精确设定过期时间的应用4.计数器应用(文章阅读数.评论数)5.Uniq操作,获取某段时间所有数据排重值6.实时 ...

  6. Springboot + SLF4j + Log4j2 打印异常日志时,耗时要5-6秒

    1.使用jps -l 查看springboot项目的进程ID 2.使用命令jstack -l 进程ID > log.txt 打印堆栈信息到文件,内容如下: "http-nio-8065 ...

  7. 查询条件中,不进sql语句 也不进后台bug

    前端代码:本来代码中少写了value="1",后来加上value值之后,可以正常进方法 <div class="row"> <label cl ...

  8. idea安装及使用

    使用:https://blog.csdn.net/qq_42303709/article/details/81983208 安装教程:https://blog.csdn.net/yl171272518 ...

  9. php利用32进制实现对id加密解密

    前言 最近在项目中遇到一个问题,当前用户分享一个邀请码给好友,好友根据邀请码注册成为新用户之后,则成为当前用户的下级,特定条件下,可以得到下级用户的一系列返利.这里要实现的就是根据当前用户的id,生成 ...

  10. 3. Python中的分支判断、循环

    本文利用的是Python 3.x版本,建议学习3.x版本 Python中的分支判断.循环 1. 分支条件判断 1.1 比较操作 以下是数之间常见的比较操作,例如5>3就是数学意义上的比较,5是大 ...