炫酷的水滴ViewPagerIndicator章

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

本篇来自Ulez的投稿,分享了一个炫酷的ViewPager指示器,弹性十足,希望大家喜欢。

Ulez的博客地址:

http://blog.csdn.net/s122ktyt

正文

去年在是某个Android群了看到有人发了一个设计图,觉得很好。想自己实现一下,到上网搜了一些资料,比如参考:

http://www.jianshu.com/p/791d3a791ec2

这位兄弟已经把如何绘制一个弹性的圆写的很详细了,在此对他表示感谢。不过他没有完整实现这个自定义控件,所以还是自己动手实现一个,但是我觉得效果和原设计还有差距,一直没写博客。这几天抽时间把里面的效果在改了改,顺便也把博客写了。先上效果图:


下面开始分析写得思路,先来个方法截图:

用贝塞尔曲线绘制一个圆需要12个点,如上图所示。然后在绘制时用 mPath.cubicTo() 依次连接,canvas.drawPath(mPath, mPaint) 就能绘制一个完整的圆了,弹性圆就是在此基础上调整 p的参数。比如 {p2,p3,p4},增加X坐标,会使圆向右凸起。

代码中 XPoint 为x相同的一组点:p2,p3,p4 和 p8,p9,p10,YPoint 同理。代码中的mc对应图中的M,绘制圆时这个值是固定的,理论参考:

How to create circle with Bézier curves?

http://stackoverflow.com/questions/1734745/how-to-create-circle-with-b%C3%A9zier-curves

p1={p5,p6,p7}.,p3={p11,p0,p1},p2={p2,p3,p4},p4={p8,p9,p10},radius 为圆半径。

resetP() 在完成选项切换时都需要调用一下,重置绘制的圆形形状,不然有时候会绘制不规则的圆,造成这个的原因是view刷新频率是有限的,有些临界状态直接就跳过了,导致参数没跟着变化就绘制了图像。

下面根据两种切换viewpager的方式分析:

第一种情况,点击 indicator 切换

在 onTouchEvent 计算将要切换的位置,调用 startAniTo(int currentPos, int toPos),  animator 监听 setTouchAble(!animating) 是禁止动画未结束用户又去手动滑动 viewpager 切换。

下面是 dispatchDraw 方法,为了更简单看懂,我就截取 position 从左向右的情况;处理临界情况很重要,没处理好你会发现绘制出来的是什么鬼!

mCurrentTime 是动画变化时刷新的值,从0到1,根据这个值重绘时计算圆的坐标。我将mCurrentTime 分为下列几种状态:

mCurrentTime == 0:

这个状态就是根据position绘制正常的圆。

mCurrentTime > 0 && mCurrentTime <= 0.2:

这个此时圆向右凸起,但是原本的canvas.translate和上个状态不变,所以是圆停止在当前位置并且慢慢凸起的效果。

mCurrentTime > 0.2 && mCurrentTime <= 0.5:

这时圆开始平移,canvas.translate(startX + (mCurrentTime - 0.2f) * distance / 0.7f, startY); 那为啥是除以0.7呢?因为0到0.2没平移,0.2到0.9平移完成,0.9到1处理回弹。平移时间只有0.9-0.2=0.7,这段时间要完成一个distance的距离的平移。同时之前圆向右凸起时,p2组的点x坐标总共增加了一个radius(这个决定凸起程度)。现在要把它弄回对称椭圆,所以p1组和p3组的点要右移半个radius,同时mc调整一下使椭圆不那么尖;

mCurrentTime > 0.5 && mCurrentTime <= 0.8:

p1和p3的X坐标继续往右移,mc逐渐重置为原来大小,效果就是圆的最右端固定不变,左边的凸起缩回去

mCurrentTime > 0.8 && mCurrentTime <= 0.9:

左边的p4.组点往右平移过头,圆形成凹陷

mCurrentTime > 0.9 && mCurrentTime < 1:

这个阶段是处理回弹,p4.组点x逐渐恢复正常。表现为回弹恢复为标准圆。

mCurrentTime == 1:

position 此时真实改变了,重置为正常的圆。

以上的每个阶段在进入下个阶段时,都需要重置一下p坐标,因为view刷新频率是有限的,有些结束的临界状态值直接就跳过了,导致参数没跟着变化就绘制了图像。

第二种情况,拖动viewpager切换

viewPager.addOnPageChangeListener,在 onPageScrolled 中调用 updateDrop(position, positionOffset, positionOffsetPixels),更新位置。这里需要注意的是点击 indicator 也会回调, 若不进行判断会造成重复的移动,所以之前在动画开启的监听时设置 boolean animating 值。

这里我用 mCurrentTime = position + positionOffset - (int) (position + positionOffset); 然而这样计算是有问题的,比如向左滑动,它是从0到0.9几,然后突变为0,为了这个判断添加了一个 lastCurrentTime ,根据接近接近0或1更改为0或1。

总结一下,需要注意的是 mCurrentTime 状态的划分、临界状态的处理、以及在合适的位置重置p坐标,在写的过程几次碰到绘制的图像莫名其妙,这是p的坐标问题,查找原因一般也是状态没重置。

源码地址:

https://github.com/Ulez/DropIndicator


完。。。。。。。。。。。。。。。。。。。。。

文章原创作者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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容