Android知识库自定义View系列Android 自定义view

仿360手机助手下载按钮

2017-05-12  本文已影响171人  木木00

作者简介  原创微信公众号郭霖 WeChat ID: guolin_blog

本篇来自的一幕的投稿,分享了一个仿照360手机助手的炫酷下载按钮,感兴趣的朋友赶快来看一看吧!

的一幕的博客地址:

http://blog.csdn.net/u010429219

正文

最近在学习Android的高级view的绘制,再结合值动画的数据上的改变,自己撸了个360手机助手的下载按钮。先看下原版的360手机助手的下载按钮是长啥样子吧:

再来看看自己demo吧,你们尽情的吐槽吧,哈哈:

细心的朋友可能发现 loading状态 下左边几个运动圆的最高点和最低点都越界了,这是因为在规定正弦函数的最高点时没考虑圆的半径的长度,因此近两天做了点修改了,效果图如下:

细节分析步骤图

咱们的整个过程可以分为这么几个状态,在这里我用枚举类进行了归纳:

Normal(还没进行开始的状态,也就是我们的默认状态,也就是我们还没执行 onTouch 的时候了):

Start(点击 onTouch 改变为该状态):

那咱们再来看看 collectAnimator 做了些什么呢:

其实核心的就是在这个过程中改变了全局变量 currentLength 而已,此时我们回到 onDraw 里面吧,看看在Start状态下 currentLength 都做了些什么:

为了便于我们分析每一个状态,我们就看下每个状态下的绘制动作吧:

大家看到变量currentLength了没,其实这里就是去改变背景的 right 坐标,正好上面动画里面也是从 width 减小的一个值,那么此时的动画大家脑海里能想象得出来了吧:

Start状态结束都就是进入到Pre状态了:

上面 collectAnimator 动画结束后启动的动画是: angleAnimator 了,我们再去看看该动画都做了些啥:

改变的还是全局的变量 angle,再来看看该变量在 onDraw方法 里面都做了些啥吧:

画了几个圆,然后通过上面的 angle 变量来旋转 canvas,而且几个圆的圆心都与view的中心点有关,因此大家从示例图中应该看出来了:

pre状态 结束后,就是 Expand状态 了,大家可以看 pre状态 下动画结束的代码:

可以看出下一个动画 tranlateAnimation 了,还是一样定位到该动画的代码吧,看看都做了些啥:

可以看出此时改变的全局变量有两个: currentLength 和 translateX,想必大家知道 currentLength 是什么作用了吧,下面就来看看 onDraw 吧:

一个是改变背景的 right坐标,再个就是 canvas.translate 几个中心点的圆了:

expand状态 结束后就是正式进入到下载状态了,这里的枚举我定义是 Load,

看下 expand 结束的动画代码吧:

大家可以看到该处有两个动画的启动了 (loadRotateAnimation.start() 和 movePointAnimation.start()),说明此处有两个动画在同时执行罢了,先来看 loadRotateAnimation 动画里面都做了些啥吧:

还是一个角度改变的动画啊,那就看看 loadAngle 是改变谁的动画吧,还是照常我们进入到 onDraw 方法吧:

还是一个圆的旋转啊,其实这几个点是有规律去绘制的,他们几个圆心应该是内圆的弧度上的,并且半径是依次增大的。这里调了 getCircleY()方法,该方法就是算圆弧上几个点的y坐标。

这里看似方法很复杂,其实就是初中定义圆的方程式:(x-cx)^2+(y-cy)^2=r^2

下面再来看看 movePointAnimation 动画都做了些啥吧:

这里首先定义了四个 MovePoint,分别定义了他们的半径,圆心,然后在该动画里面不断地改变四个 point 的圆心,其实这里核心就是如何求出四个点运行的轨迹了,把轨迹弄出来一切就都呈现出来了,可以看看该动画的 onAnimationUpdate方法 里面调用的 drawMovePoints方法:

这里就是一个数学里面经常用的正弦函数了,求出周期、x轴上的偏移量、y轴上的便宜量、顶点,还有一个注意点,该处求顶点的时候,需要减去这几个圆中的最大半径,之前我就是没注意到这点,最后出来的轨迹就是一个圆会跑到view的外面了。效果图如下:

最后一个状态就是Complete了,也就是当前的进度到了100,可见代码:

这里要做的就是改变状态,停止一切动画了,到此代码的讲解就到这里了,赶快start起来吧。

属性也没怎么整理,就抽取出了一些比较常用的几个了:

代码使用:

好了介绍就到这里了,如果觉得行的话,进入github的传送门:

https://github.com/1002326270xc/360Downloading-master

文章原创作者GuoLin 书籍推荐

郭林大神原创android 书籍:《第一行代码 android》

淘宝链接: https://s.click.taobao.com/t?e=m%3D2%26s%3DgKUfuKdAZKocQipKwQzePOeEDrYVVa64K7Vc7tFgwiHjf2vlNIV67p2n%2BQBNMyE6Rku8%2Bpj6eJall3bs%2B3NRhNHnsKI%2BqxhyM0iVZhTFBom4YIorMPnmg8G0g2OJi%2FzmXHfenomYtn5EW9vzeG8LzfPUwktUBEmkxg5p7bh%2BFbQ%3D&pvid=10_106.6.161.154_3367_1490163222155

上一篇下一篇

猜你喜欢

热点阅读