炫酷的水滴ViewPagerIndicator章

作者簡(jiǎn)介 原創(chuàng)微信公眾號(hào)郭霖 WeChat ID: guolin_blog

本篇來(lái)自Ulez的投稿森爽,分享了一個(gè)炫酷的ViewPager指示器,彈性十足,希望大家喜歡行楞。

Ulez的博客地址:

http://blog.csdn.net/s122ktyt

正文

去年在是某個(gè)Android群了看到有人發(fā)了一個(gè)設(shè)計(jì)圖,覺(jué)得很好土匀。想自己實(shí)現(xiàn)一下子房,到上網(wǎng)搜了一些資料,比如參考:

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

這位兄弟已經(jīng)把如何繪制一個(gè)彈性的圓寫的很詳細(xì)了,在此對(duì)他表示感謝证杭。不過(guò)他沒(méi)有完整實(shí)現(xiàn)這個(gè)自定義控件田度,所以還是自己動(dòng)手實(shí)現(xiàn)一個(gè),但是我覺(jué)得效果和原設(shè)計(jì)還有差距解愤,一直沒(méi)寫博客镇饺。這幾天抽時(shí)間把里面的效果在改了改,順便也把博客寫了琢歇。先上效果圖:


下面開(kāi)始分析寫得思路兰怠,先來(lái)個(gè)方法截圖:

用貝塞爾曲線繪制一個(gè)圓需要12個(gè)點(diǎn),如上圖所示李茫。然后在繪制時(shí)用 mPath.cubicTo() 依次連接揭保,canvas.drawPath(mPath, mPaint) 就能繪制一個(gè)完整的圓了,彈性圓就是在此基礎(chǔ)上調(diào)整 p的參數(shù)魄宏。比如 {p2,p3,p4},增加X(jué)坐標(biāo)秸侣,會(huì)使圓向右凸起。

代碼中 XPoint 為x相同的一組點(diǎn):p2宠互,p3味榛,p4 和 p8,p9予跌,p10搏色,YPoint 同理。代碼中的mc對(duì)應(yīng)圖中的M券册,繪制圓時(shí)這個(gè)值是固定的频轿,理論參考:

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() 在完成選項(xiàng)切換時(shí)都需要調(diào)用一下航邢,重置繪制的圓形形狀,不然有時(shí)候會(huì)繪制不規(guī)則的圓骄蝇,造成這個(gè)的原因是view刷新頻率是有限的膳殷,有些臨界狀態(tài)直接就跳過(guò)了,導(dǎo)致參數(shù)沒(méi)跟著變化就繪制了圖像九火。

下面根據(jù)兩種切換viewpager的方式分析:

第一種情況赚窃,點(diǎn)擊 indicator 切換

在 onTouchEvent 計(jì)算將要切換的位置,調(diào)用 startAniTo(int currentPos, int toPos),? animator 監(jiān)聽(tīng) setTouchAble(!animating) 是禁止動(dòng)畫未結(jié)束用戶又去手動(dòng)滑動(dòng) viewpager 切換吃既。

下面是?dispatchDraw 方法,為了更簡(jiǎn)單看懂考榨,我就截取 position 從左向右的情況;處理臨界情況很重要鹦倚,沒(méi)處理好你會(huì)發(fā)現(xiàn)繪制出來(lái)的是什么鬼河质!

mCurrentTime 是動(dòng)畫變化時(shí)刷新的值,從0到1,根據(jù)這個(gè)值重繪時(shí)計(jì)算圓的坐標(biāo)掀鹅。我將mCurrentTime 分為下列幾種狀態(tài):

mCurrentTime == 0:

這個(gè)狀態(tài)就是根據(jù)position繪制正常的圓散休。

mCurrentTime > 0 && mCurrentTime <= 0.2:

這個(gè)此時(shí)圓向右凸起,但是原本的canvas.translate和上個(gè)狀態(tài)不變乐尊,所以是圓停止在當(dāng)前位置并且慢慢凸起的效果戚丸。

mCurrentTime > 0.2 && mCurrentTime <= 0.5:

這時(shí)圓開(kāi)始平移,canvas.translate(startX + (mCurrentTime - 0.2f) * distance / 0.7f, startY); 那為啥是除以0.7呢扔嵌?因?yàn)?到0.2沒(méi)平移限府,0.2到0.9平移完成,0.9到1處理回彈痢缎。平移時(shí)間只有0.9-0.2=0.7胁勺,這段時(shí)間要完成一個(gè)distance的距離的平移。同時(shí)之前圓向右凸起時(shí),p2組的點(diǎn)x坐標(biāo)總共增加了一個(gè)radius(這個(gè)決定凸起程度)《揽酰現(xiàn)在要把它弄回對(duì)稱橢圓署穗,所以p1組和p3組的點(diǎn)要右移半個(gè)radius,同時(shí)mc調(diào)整一下使橢圓不那么尖嵌洼;

mCurrentTime > 0.5 && mCurrentTime <= 0.8:

p1和p3的X坐標(biāo)繼續(xù)往右移案疲,mc逐漸重置為原來(lái)大小,效果就是圓的最右端固定不變麻养,左邊的凸起縮回去

mCurrentTime > 0.8 && mCurrentTime <= 0.9:

左邊的p4.組點(diǎn)往右平移過(guò)頭褐啡,圓形成凹陷

mCurrentTime > 0.9 && mCurrentTime < 1:

這個(gè)階段是處理回彈,p4.組點(diǎn)x逐漸恢復(fù)正常鳖昌。表現(xiàn)為回彈恢復(fù)為標(biāo)準(zhǔn)圓春贸。

mCurrentTime == 1:

position 此時(shí)真實(shí)改變了,重置為正常的圓遗遵。

以上的每個(gè)階段在進(jìn)入下個(gè)階段時(shí),都需要重置一下p坐標(biāo)逸嘀,因?yàn)関iew刷新頻率是有限的车要,有些結(jié)束的臨界狀態(tài)值直接就跳過(guò)了,導(dǎo)致參數(shù)沒(méi)跟著變化就繪制了圖像崭倘。

第二種情況翼岁,拖動(dòng)viewpager切換

viewPager.addOnPageChangeListener,在 onPageScrolled 中調(diào)用?updateDrop(position, positionOffset, positionOffsetPixels),更新位置。這里需要注意的是點(diǎn)擊 indicator 也會(huì)回調(diào)司光, 若不進(jìn)行判斷會(huì)造成重復(fù)的移動(dòng)琅坡,所以之前在動(dòng)畫開(kāi)啟的監(jiān)聽(tīng)時(shí)設(shè)置 boolean animating 值。

這里我用 mCurrentTime = position + positionOffset - (int) (position + positionOffset); 然而這樣計(jì)算是有問(wèn)題的残家,比如向左滑動(dòng)榆俺,它是從0到0.9幾,然后突變?yōu)?,為了這個(gè)判斷添加了一個(gè) lastCurrentTime 茴晋,根據(jù)接近接近0或1更改為0或1陪捷。

總結(jié)一下,需要注意的是 mCurrentTime?狀態(tài)的劃分诺擅、臨界狀態(tài)的處理市袖、以及在合適的位置重置p坐標(biāo),在寫的過(guò)程幾次碰到繪制的圖像莫名其妙烁涌,這是p的坐標(biāo)問(wèn)題苍碟,查找原因一般也是狀態(tài)沒(méi)重置。

源碼地址:

https://github.com/Ulez/DropIndicator


完撮执。微峰。。二打。县忌。。继效。症杏。。瑞信。厉颤。。凡简。逼友。。秤涩。帜乞。稳析。豌拙。。蒜焊。

文章原創(chuàng)作者GuoLin 書籍推薦

郭林大神原創(chuàng)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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末匀谣,一起剝皮案震驚了整個(gè)濱河市照棋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌武翎,老刑警劉巖烈炭,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異宝恶,居然都是意外死亡符隙,警方通過(guò)查閱死者的電腦和手機(jī)趴捅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)膏执,“玉大人驻售,你說(shuō)我怎么就攤上這事「祝” “怎么了欺栗?”我有些...
    開(kāi)封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)征峦。 經(jīng)常有香客問(wèn)我迟几,道長(zhǎng),這世上最難降的妖魔是什么栏笆? 我笑而不...
    開(kāi)封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任类腮,我火速辦了婚禮,結(jié)果婚禮上蛉加,老公的妹妹穿的比我還像新娘蚜枢。我一直安慰自己,他們只是感情好针饥,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布厂抽。 她就那樣靜靜地躺著,像睡著了一般丁眼。 火紅的嫁衣襯著肌膚如雪筷凤。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天苞七,我揣著相機(jī)與錄音藐守,去河邊找鬼。 笑死蹂风,一個(gè)胖子當(dāng)著我的面吹牛卢厂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播惠啄,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼足淆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了礁阁?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤族奢,失蹤者是張志新(化名)和其女友劉穎姥闭,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體越走,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡棚品,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年靠欢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铜跑。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡门怪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锅纺,到底是詐尸還是另有隱情掷空,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布囤锉,位于F島的核電站坦弟,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏官地。R本人自食惡果不足惜酿傍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望驱入。 院中可真熱鬧赤炒,春花似錦、人聲如沸亏较。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)宴杀。三九已至癣朗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間旺罢,已是汗流浹背旷余。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扁达,地道東北人正卧。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像跪解,于是被迫代替她去往敵國(guó)和親炉旷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容