手把手带你做一个超炫酷loading成功动画view Android自定义view
写在前面:
本篇可能是手把手自定义view系列最后一篇了,实际上我也是一周前才开始真正接触自定义view,通过这一周的练习,基本上已经熟练自定义view,能够应对一般的view需要,那么就以本篇来结尾告一段落,搞完毕设的开题报告后去学习新的内容。
有人对我说类似的效果网上已经有了呀,直接拿来就可以用,为什么还要写。我个人的观点是:第三方控件多数不能完全满足UI的要求,如果需要修改,那么必须理解他的实现,所以很有必要自己去写一款出来,成为程序的创造者,而不单单是使用者。所以,写一写已经实现的效果,对学习来说还是很重要的。我相信,等从使用者变成创造者之后,会有很大的提高。
每一篇博客都是建立在之前博客的基础知识上的,如果你刚接触自定义view。可以来说说自定义view简单学习的方式这里看我以前的文章。记录了我学习自定义view的过程,而且前几篇博客或多或少犯了一些错误(重复绘制,onDraw里new对象等等)。这里我并不想改正博文中的错误,因为些错误是大家经常会犯的,后来的博客都有指出这些错误,以及不再犯,这是一个学习的过程。所以我想把错误的经历记录下来。等成为高手
 回头看看当年的自己是多么菜。。也会有成就感。。
转载请注明出处:http://blog.csdn.net/wingichoy/article/details/50482271
好了,前面说的有点多。。那么开始正题,这次实现的是一个带有动画效果的loading, 难度比之前的所有文章都要复杂。但是其实一步一步分解做下来,用心去做还是不难的。
为了美观一些,我把它放到了dialog里面 上效果图:
怎么样!是不是很炫酷,自我感觉很融入系统,像原生的东西#王婆卖瓜#
开始之前。我想说一下我的大体思路,不知道有没有更好的方法。欢迎拍砖指点交流!
对于动画效果,我全局采用一种percent,和标记位思想。也就是绘制分段,如果不达到100%,就一直画到底。如:对于一条线,从一端画到另一端,他的第二个点的坐标不断变化,我就用 最终的长度 * 百分比 来作为过度时期的变量, 即canvas.drawLine(0,0,x * percent /100,y * percent /100);    标记位的话就一一个boolean值,如果来判断该怎么画。 缺点也很明显:每次都要if
 他percent到没到100%  嵌套太多次,不知道有没有解决办法。
现在来分析一下动画的过程。基础的坐标计算一下就好,这里就不多说,如果你这些还不熟练,你可以看看我之前的文章:手把手带你绘制一个时尚仪表盘
1.首先要做的是绘制出来刚开始静态的圆和箭头, 箭头用path画。
2.是竖线缩短的过程,变成一个点。
3.箭头变横线。
4.点被横线抛出到圆。
5.按百分比绘制的弧,同时直线变对勾。
之后我们就一个一个来画。构造函数测量的就省去了。
那么 拿起你的paint 开始跟我一起draw吧
初始化一下画笔
 Paint p = new Paint();
        Path path = new Path();
        p.setColor(Color.parseColor("#2EA4F2"));
        p.setStyle(Paint.Style.STROKE);
        p.setStrokeWidth(8);
        p.setAntiAlias(true);
        //百分比弧的矩形
        RectF rectF = new RectF(5, 5, mWidth - 5, mHeight - 5);
        //绘制圆
        canvas.drawCircle(mWidth / 2, mHeight / 2, mWidth / 2 - 5, p);
这里设置一个标志位,用于标记是否可以开始绘制动画。
        if (canStartDraw) {
            isDrawing = true;
如果不可以,则绘制静态的箭头。
else {
            //绘制静态箭头
            p.setColor(Color.WHITE);
            canvas.drawLine(mWidth / 2, mHeight / 4, mWidth / 2, mHeight * 0.75f, p);
//            Path path = new Path();
            path.moveTo(mWidth / 4, mHeight * 0.5f);
            path.lineTo(mWidth / 2, mHeight * 0.75f);
            path.lineTo(mWidth * 0.75f, mHeight * 0.5f);
            canvas.drawPath(path, p);
        }
现在的效果是这样的
2.线变成一个点。 这里的效果其实就是不断绘制一个线,基本上坐标的变化可以用如下表示: x,y1+percent,x,y2-percent.
那么这里就开始drawLine 用百分比控制具体的变化量。 这里为什么percent 不自增到100呢,原因是线最终要缩短成和点一样的大小,并非消失。这里就完成了第一阶段的动画。
isDrawing = true;
//开始变形
p.setColor(Color.WHITE); //如果小于95 就继续缩短。 95是微调值 和point大小相等
if (mLineShrinkPercent < 95) {
//线段逐渐缩短(终点为mWidth/2,mHeight/2)
float tmp = (mWidth / 2 - mHeight / 4) * mLineShrinkPercent / 100;
canvas.drawLine(mWidth / 2, mHeight / 4 + tmp, mWidth / 2, mHeight * 0.75f - tmp, p);
mLineShrinkPercent += 5;
} else {
3.箭头变横线 由于箭头是Path画的,所以我们只要改变path中间那个点的y坐标就可以了。 这里需要注意的是 在变成西线的过程中,点是一直存在的,所以要画一个circle上去(为什么不point,因为他很方= =),也是用一个百分比来控制。
//path变成直线
isPathToLine = true;
if (mPathPercent < 100) { path.moveTo(mWidth / 4, mHeight * 0.5f);
path.lineTo(mWidth / 2, mHeight * 0.75f - mPathPercent / 100f * 0.25f * mHeight);
path.lineTo(mWidth * 0.75f, mHeight * 0.5f);
canvas.drawPath(path, p);
mPathPercent += 5; //在变成直线的过程中这个点一直存在
canvas.drawCircle(mWidth / 2, mHeight / 2,2.5f, p);
} else {
4.点被横线抛出到圆弧上,同样也是百分比控制。 最终的圆心坐标为 mWidth/2,0
//绘制把点上弹的直线
                    //画上升的点
                    if (mRisePercent < 100) {
                        //在点移动到圆弧上的时候 线是一直存在的
                        canvas.drawLine(mWidth / 4, mHeight * 0.5f, mWidth * 0.75f, mHeight * 0.5f, p);
                        canvas.drawCircle(mWidth / 2, mHeight / 2 - mHeight / 2 * mRisePercent / 100 + 5,2.5f, p);
                        mRisePercent += 5;
                    } else
5.按百分比绘制的弧,同时直线变对勾。 弧的话,注意一下起始弧度是270, 绘制弧度为360*percent就可以。对勾跟上面一样,因为本身是一条Path,这次同时改变第二个点和第三个点就可以了。
//上升的点最终的位置
canvas.drawPoint(mWidth / 2, 5, p);
isRiseDone = true; //改变对勾形状
if (mLinePercent < 100) { path.moveTo(mWidth / 4, mHeight * 0.5f);
path.lineTo(mWidth / 2, mHeight * 0.5f+ mLinePercent/100f * mHeight * 0.25f);
path.lineTo(mWidth * 0.75f, mHeight * 0.5f - mLinePercent / 100f * mHeight * 0.3f);
canvas.drawPath(path, p);
mLinePercent += 5; //动态绘制圆形百分比
if (mCirclePercent < 100) {
canvas.drawArc(rectF, 270, -mCirclePercent / 100.0f * 360, false, p);
mCirclePercent += 5;
}
6.(为什么有6??) 很重要的一点,切忌不要忘记。如果你只写了以上代码,你运行完会发现所有绘图都消失了! 那是因为percent超过100就不进行绘制了,所以在最外面的else里需要绘制一个圆加一个对号。完成之后直接 postInvalidateDelayed(10);
<pre name="code" class="java">else {
                            //绘制最终的path
                            path.moveTo(mWidth / 4, mHeight * 0.5f);
                            path.lineTo(mWidth / 2, mHeight * 0.75f);
                            path.lineTo(mWidth * 0.75f, mHeight * 0.3f);
                            canvas.drawPath(path, p);
//                            绘制最终的圆
                            canvas.drawArc(rectF, 270, -360, false, p);
                            isDrawing = false;
                        }
7.(还有7,你逗我?)加一个start方法 用于重置各种标记位
  public void start() {
        if (isDrawing == false) {
            canStartDraw = true;
            isRiseDone = false;
            mRisePercent = 0;
            mLineShrinkPercent = 0;
            mCirclePercent = 0;
            mPathPercent = 0;
            mLinePercent = 0;
            invalidate();
        }
    }
之后就大功告成了!!!
本项目地址: 点击打开链接 求关注 求评论 求star 那么,手把手带你写view系列就基本完结了。
手把手番外篇:手把手教你画一个 逼格满满圆形水波纹loadingview Android
手把手带你做一个超炫酷loading成功动画view Android自定义view的更多相关文章
- uwp - 做一个相对炫酷的动画按钮/按钮动画
		
原文:uwp - 做一个相对炫酷的动画按钮/按钮动画 看腻了系统自带的button animation何不尝试下自定义一个较为炫酷的动画顺便提升用户体验.效果图: 动画分为几个部分,分别是:内圆从中心 ...
 - 8个超炫酷仿HTML5动画源码
		
1.jQuery万年历插件 带农历老皇历功能 这是一款基于jQuery的日历插件,这款日历插件和之前分享的日历控件有很大差异,它是一本万年历,包含了农历已经老皇历的功能,是一个挑好日子的工具.同时日历 ...
 - 手把手带你画一个漂亮蜂窝view Android自定义view
		
上一篇做了一个水波纹view 不知道大家有没有动手试试呢点击打开链接 这个效果做起来好像没什么意义,如果不加监听回调 图片就能直接替代.写这篇博客的目的是锻炼一下思维能力,以更好的面多各种自定义vi ...
 - 手把手教你打造一个心电图效果View Android自定义View
		
大家好,看我像不像蘑菇-因为我在学校呆的发霉了. 思而不学则殆 丽丽说得对,我有奇怪的疑问,大都是思而不学造成的,在我书读不够的情况下想太多,大多等于白想,所以革命没成功,同志仍需努力. 好了废话不说 ...
 - HTML5 Canvas 超炫酷烟花绽放动画教程
		
这是一个很酷的HTML5 Canvas动画,它将模拟的是我们现实生活中烟花绽放的动画特效,效果非常逼真,但是毕竟是电脑模拟,带女朋友看就算了,效果还是差了点,呵呵.这个HTML5 Canvas动画有一 ...
 - 程序猿必备的10款超炫酷HTML5 Canvas插件
		
1.超炫酷HTML5 Canvas 3D旋转地球动画 这是一款基于HTML5 Canvas的3D地球模拟动画,动画以太空作为背景,地球在太空中旋转,同时我们也可以拖拽鼠标来从不同的角度观察地球.另外我 ...
 - 我用 CSS3 实现了一个超炫的 3D 加载动画
		
今天给大家带来一个非常炫酷的CSS3加载Loading动画,它的特别之处在于,整个Loading动画呈现出了3D的视觉效果.这个Loading加载动画由12个3D圆柱体围成一个椭圆形,同时这12个圆柱 ...
 - 8个超炫酷的纯CSS3动画及源码分享
		
在现代网页中,我们已经越来越习惯使用大量的CSS3元素,而现在的浏览器也基本都支持CSS3,所以很多时候我们不妨思考一下是否可以用纯CSS3制作一些有趣或者实用的网页.本文要分享8个超炫酷的纯CSS3 ...
 - R数据分析:跟随top期刊手把手教你做一个临床预测模型
		
临床预测模型也是大家比较感兴趣的,今天就带着大家看一篇临床预测模型的文章,并且用一个例子给大家过一遍做法. 这篇文章来自护理领域顶级期刊的文章,文章名在下面 Ballesta-Castillejos ...
 
随机推荐
- MySQL PHP 语法
			
MySQL PHP 语法 MySQL 可应用于多种语言,包括 PERL, C, C++, JAVA 和 PHP. 在这些语言中,MySQL在PHP的web开发中是应用最广泛. 在本教程中我们大部分实例 ...
 - javascript:void(0) 含义
			
javascript:void(0) 含义 我们经常会使用到 javascript:void(0) 这样的代码,那么在 JavaScript 中 javascript:void(0) 代表的是什么意思 ...
 - JavaScript If…Else 语句
			
条件语句用于基于不同的条件来执行不同的动作. 条件语句 通常在写代码时,您总是需要为不同的决定来执行不同的动作.您可以在代码中使用条件语句来完成该任务. 在 JavaScript 中,我们可使用以下条 ...
 - 用js来实现那些数据结构13(树01-二叉搜索树的实现)
			
前一篇文章我们学会了第一个非顺序数据结构hashMap,那么这一篇我们来学学树,包括树的概念和一些相关的术语以及二叉搜索树的实现.唉?为什么不是树的实现,不是二叉树的实现.偏偏是二叉搜索树的实现?嗯, ...
 - 安卓高级3 Android应用Design Support Library完全使用实例
			
原作者:http://www.open-open.com/lib/view/open1433385856119.html 1 背景 上周一年一度的Google IO全球开发者大会刚刚结束,Google ...
 - iOS 中的类属性
			
转自:iOS 知识小集 从Xcode 8开始,LLVM已经支持Objective-C显式声明类属性了,这是为了与Swift中的类属性互操作而引入的.在WWDC 2016 What's New in L ...
 - ORACLE数据库学习之备份与恢复
			
 oracle数据库的备份与恢复 第一部分:数据库的备份 备份的必要性 因为各种人为或外界的因素可能会造成数据库中灾难性的数据丢失,为了保证数据库中数据的安全,必须采取备份措施保证RDBMS中包含 ...
 - Swift延迟加载的一种用途
			
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 有以下一种情况: 我们试图用Cocoa的语音合成类NSSpee ...
 - TraceView性能分析工具介绍
			
一.TraceView简介 TraceView是AndroidSDK里面自带的工具,用于对Android的应用程序以及Framework层的代码进行性能分析. TraceView是图形化的工具,最终它 ...
 - SSH深度历险(十一) AOP原理及相关概念学习+xml配置实例(对比注解方式的优缺点)
			
接上一篇 SSH深度历险(十) AOP原理及相关概念学习+AspectJ注解方式配置spring AOP,本篇我们主要是来学习使用配置XML实现AOP 本文采用强制的CGLB代理方式 Security ...