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

写在前面:

本篇可能是手把手自定义view系列最后一篇了,实际上我也是一周前才开始真正接触自定义view,通过这一周的练习,基本上已经熟练自定义view,能够应对一般的view需要,那么就以本篇来结尾告一段落,搞完毕设的开题报告后去学习新的内容。

有人对我说类似的效果网上已经有了呀,直接拿来就可以用,为什么还要写。我个人的观点是:第三方控件多数不能完全满足UI的要求,如果需要修改,那么必须理解他的实现,所以很有必要自己去写一款出来,成为程序的创造者,而不单单是使用者。所以,写一写已经实现的效果,对学习来说还是很重要的。我相信,等从使用者变成创造者之后,会有很大的提高。

转载请注明出处: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系列就基本完结了  祝我毕业找个好工作。

时间: 2024-10-20 18:44:45

手把手带你做一个超炫酷loading成功动画view Android自定义view的相关文章

8个超炫酷仿HTML5动画源码

1.jQuery万年历插件 带农历老皇历功能 这是一款基于jQuery的日历插件,这款日历插件和之前分享的日历控件有很大差异,它是一本万年历,包含了农历已经老皇历的功能,是一个挑好日子的工具.同时日历还可以查看本年度的放假安排,功能非常强大.有兴趣的朋友可以下载学习. 在线演示 源码下载 2.CSS3发光进度条动画 超炫酷的样式 这次我们要来分享一款非常炫酷的CSS3进度条动画,其样式风格类似于星球大战里面的那些激光剑效果.页面初始化时,可以设定进度条的值,但是我们也可以利用其配套的借口来动态改

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

看腻了系统自带的button animation何不尝试下自定义一个较为炫酷的动画顺便提升用户体验.效果图: 动画分为几个部分,分别是:内圆从中心放大(1)并同时渐隐(2),外圆从中心放大(3)并同时渐隐(4),按钮整体从中心缩小放大(5),非常简单对吧,代码也是. 为了方便调用,我用一个自定义用户控件来做,图标是用iconfont,这样可以在任何地方使用,首先新建[AnimationButton.xaml]用户控件,前台代码将自动生成的部分替换: <UserControl.Resources>

手把手带你画一个漂亮蜂窝view Android自定义view

上一篇做了一个水波纹view  不知道大家有没有动手试试呢点击打开链接 这个效果做起来好像没什么意义,如果不加监听回调 图片就能直接替代.写这篇博客的目的是锻炼一下思维能力,以更好的面多各种自定义view需求. 转载请注明出处:http://blog.csdn.net/wingichoy/article/details/50554058 本文是和代码同步写的.也就是说在写文章的时候才敲的代码.这样会显得文章有些许混乱.但是我想这样记录下来,一个自定义view的真正的制作过程,是一点一点,一步步跟

手把手教你打造一个心电图效果View Android自定义View

大家好,看我像不像蘑菇-因为我在学校呆的发霉了. 思而不学则殆 丽丽说得对,我有奇怪的疑问,大都是思而不学造成的,在我书读不够的情况下想太多,大多等于白想,所以革命没成功,同志仍需努力. 好了废话不说了,由于布总要做一个心电图的玩意,所以做来练练手,总之拿到的UI图如下: 做好的效果如下: 拿到图,先做一些简单的分析.呃.. 背景表格的绘制 心电图的绘制 背景表格的绘制: 首先drawColor黑色,然后用循环来画线. 心电图的绘制: 看样子是path,应该没问题. 于是就大干一番,按照这俩步骤

超炫酷的jQuery/HTML5应用效果及源码

jQuery非常强大,我们之前也用jQuery分享过很多实用的插件.HTML5可以让网页变得更加绚丽多彩,将HTML5和jQuery结合使用那将发挥更棒的效果. 今天向大家收集了一些关于HTML5和jQuery的应用及其源码,一起来看看. HTML5动感的火焰燃烧动画特效 这又是一款基于HTML5的超炫动画特效,是一款动感的火焰燃烧动画效果.这款HTML5动画火焰燃烧非常逼真. 核心jQuery代码: $( document ).ready(function() { // Set canvas

3D HTML5 Logo标志 超炫酷旋转特效

今天又要为大家带来一款超酷的HTML5 Canvas 3D动画特效,是一款可以旋转的HTML5 Logo标志.画面上一共有两块可旋转的区域,第一是可旋转的背景,第二则是可旋转的Logo标志.Logo标志在旋转的时候还有3D的视觉效果,这一切我们都是在canvas上实现的.具体演示和实现过程可以看下文. 你也可以在这里查看在线演示 下面我们来简单分析一下实现这款3D动画的过程及其部分核心代码,主要由HTML代码以及Javascript代码组成. HTML代码: <canvas id="can

CSS3绘制8种超炫的加载动画

CSS3绘制8种超炫的加载动画     逛前端开发网站的时候,偶尔发现一组非常炫酷的CSS3加载动画,遂迫不及待的做个Demo保存下来. 这些加载动画用到了CSS3的旋转transform属性,颜色透明度设置和伪元素操作等CSS技术.奇妙的组合,产生了意想不到的效果. 1.上下起伏波动的加载动画: #loader1, #loader1:before, #loader1:after { background: #f2fa08; -webkit-animation: load1 1s infinit

一款炫酷Loading动画--载入失败

简单介绍 上一篇文章一款炫酷Loading动画–载入成功.给大家介绍了成功动画的绘制过程,这篇文章将接着介绍载入失败特效的制作. 相比成功动画,有了前面的经验,失败动画的过程就显得比較简单了. 动画结构分析 首先我们来看失败动画的一张图: 失败动画的状态转移描写叙述例如以下: 1.载入过程,画蓝色圆环,当进度为100%时.圆环完毕 2.从右側抛出蓝色小方块.小方块沿着曲线到达圆环正上方 3.小方块突然消失.红色感叹号逐渐出现 4.感叹号完整出现以后.圆环变红色.感叹号发生震动 因为前两个过程,和

一款炫酷Loading动画--加载失败

简介 上一篇文章一款炫酷Loading动画–加载成功,给大家介绍了成功动画的绘制过程,这篇文章将接着介绍加载失败特效的制作. 相比成功动画,有了前面的经验,失败动画的过程就显得比较简单了. 动画结构分析 首先我们来看失败动画的一张图: 失败动画的状态转移描述如下: 1.加载过程,画蓝色圆环,当进度为100%时,圆环完成 2.从右侧抛出蓝色小方块,小方块沿着曲线到达圆环正上方 3.小方块突然消失,红色感叹号逐渐出现 4.感叹号完整出现以后,圆环变红色,感叹号发生震动 由于前两个过程,和加载成功是一