android用貝塞爾曲線完成viewpager輪播指示器

效果圖


實(shí)現(xiàn)

要實(shí)現(xiàn)上圖的效果其實(shí)不難欢策,首先我們要獲取指示器所畫(huà)圓的個(gè)數(shù),這個(gè)可以通過(guò)viewpager獲壬吞省:

然后就是通過(guò)畫(huà)布來(lái)繪制需要畫(huà)的圓踩寇,在自定義view中,通過(guò)重寫(xiě)onDraw方法來(lái)獲取畫(huà)布進(jìn)行繪制六水。

繪制

繪制靜態(tài)圓:


如圖所示俺孙,由于手機(jī)的原點(diǎn)起點(diǎn)位置為左上角,所以此圖將坐標(biāo)系調(diào)整為了跟手機(jī)一樣的方向掷贾,方便查看

畫(huà)靜態(tài)圓是以原點(diǎn)為起始圓的圓心睛榄,圓與圓的間隔為div,代碼如下所示:


如此畫(huà)出的圓的效果如下所示:



你會(huì)發(fā)現(xiàn)第一個(gè)圓只有右下一部分想帅,第二场靴,三個(gè)圓只有下面的一般,這是因?yàn)楫?huà)布的起始點(diǎn)為左上角港准,而我繪制的圓是以原點(diǎn)為圓心憎乙,向右間隔div畫(huà)圓的,這時(shí)就會(huì)產(chǎn)生坐標(biāo)抽只會(huì)展示第一象限叉趣,及上圖的x軸以下泞边,y軸的郵編的部分,這時(shí)為了將完成的圓展示出來(lái)疗杉,我們只需在畫(huà)布開(kāi)始繪制的時(shí)候向右平移圓的半徑(radius)阵谚,向下平移圓的半徑(radius),代碼:


canvas.translate(x,y);//此方法為畫(huà)布平移方法此處要注意烟具,一定要先調(diào)用畫(huà)布平移方法梢什,再畫(huà)圓,否則平移是無(wú)效的朝聋,及


此寫(xiě)法調(diào)用平移是無(wú)效的

以上部分已經(jīng)完成了靜態(tài)圓的繪制嗡午,接下來(lái)將利用貝塞爾曲線繪制圓,及圓的運(yùn)動(dòng)狀態(tài)

1.繪制圓

貝塞爾曲線繪制圓的原理很簡(jiǎn)單冀痕,只需要確定12個(gè)頂點(diǎn)荔睹,就能確定一個(gè)完整的圓狸演,如上圖所示:

p0—p11表示這12個(gè)頂點(diǎn)其特殊性在于其中8(p0,p2,p3,p5,p6,p8,p9,p11)個(gè)頂點(diǎn)的位置,位置取決于數(shù)值c約等于0.551915024494f僻他;數(shù)值c的作用是用來(lái)獲取這8個(gè)特殊頂點(diǎn)的位置及其中p0-p1的長(zhǎng)度為radius*c

為了更好的管理這12個(gè)頂點(diǎn)宵距,將他們分為四部分(上,下吨拗,左满哪,右),其中上劝篷,下部分y坐標(biāo)是不變的哨鸭,左右部分x坐標(biāo)是不變的,由此得出兩個(gè)工具類(lèi):


這兩個(gè)工具類(lèi)用于設(shè)置這12個(gè)點(diǎn)的坐標(biāo)娇妓,方便下一步的移動(dòng)安卓中貝塞爾曲線的繪制方法通過(guò)Path類(lèi)來(lái)設(shè)置頂點(diǎn)像鸡,通過(guò)canvas.drawPath繪制代碼如下:


2.移動(dòng)

移動(dòng)結(jié)合viewpager來(lái)完成,通過(guò)viewPager.addOnPageChangeListener();來(lái)獲取移動(dòng)的狀態(tài)峡蟋。

重寫(xiě)onPageScrolled(int position, float positionOffset, int positionOffsetPixels)

主要利用position和positionOffset參數(shù)來(lái)設(shè)置圓的運(yùn)動(dòng)狀態(tài)坟桅,

運(yùn)動(dòng)主要分為四個(gè)階段,positionOffset等于0-0.2;0.2-0.4;0.4-0.8;0.8-1

第一階段:0-0.2


此圖不好畫(huà)蕊蝗,所以盜的別人的圖...

此階段主要讓右邊的線段向右平移仅乓,及改變p3,p4,p5的x坐標(biāo),達(dá)到向右平滑移動(dòng)效果及x=當(dāng)前x坐標(biāo)(radius)+此圓的右邊坐標(biāo)到下一個(gè)圓的右邊坐標(biāo)要移動(dòng)的距離(div+2 * radius) * 移動(dòng)系數(shù)(positionOffset) + 之前移動(dòng)的距離((div+2 * radius) * position)及x = radius + (div + 2 * radius) * (position + positionOffset);代碼如下:



第二階段:0.2-0.4第一階段右移不變蓬戚,將上夸楣,下兩段的y坐標(biāo)按比例縮小,左側(cè)線段跟隨右側(cè)線段同樣的速度向右平移及p0,p1,p2,p6,p7,p8的y高度縮小縮小系數(shù)為1-positionOffset+0.2;應(yīng)為positionOffset是從0.2開(kāi)始的子漩,為了避免突然縮短豫喧,故采用平滑縮小代碼如下:


其中加減0.2是因?yàn)?positionOffset是從0.2開(kāi)始的,為了達(dá)到平滑的效果

第三階段:0.4-0.8此階段只是第二階段完了之后整體向右平滑代碼:


第四階段:0.8-1此階段為了還原到圓的形狀幢泼,在第一階段右側(cè)向右滑動(dòng)0.2個(gè)系數(shù)紧显,左側(cè)的線段沒(méi)有滑動(dòng)。故左側(cè)線段比右側(cè)線段慢了0.2個(gè)系數(shù)缕棵,在第二階段上下線段y軸各壓縮了0.2個(gè)系數(shù)孵班,所以設(shè)置第四階段為0.2個(gè)系數(shù),方便還原圓招驴;故在此階段左側(cè)滑動(dòng)要補(bǔ)回那慢的0.2個(gè)系數(shù)篙程,即在上個(gè)階段滑動(dòng)的基礎(chǔ)上加上補(bǔ)回的坐標(biāo)上下線段位置還原操作,代碼:


橫線部分為補(bǔ)回的操作别厘,減去0.8是因?yàn)閺?.8開(kāi)始的0.8到1剛好0.2個(gè)系數(shù)

本項(xiàng)目有瑕疵虱饿,僅文章來(lái)說(shuō)明制作思路

demo地址:github.com/dengzhi00/BzCircle

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子氮发,更是在濱河造成了極大的恐慌渴肉,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件折柠,死亡現(xiàn)場(chǎng)離奇詭異宾娜,居然都是意外死亡批狐,警方通過(guò)查閱死者的電腦和手機(jī)扇售,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)嚣艇,“玉大人承冰,你說(shuō)我怎么就攤上這事∈沉悖” “怎么了困乒?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)贰谣。 經(jīng)常有香客問(wèn)我娜搂,道長(zhǎng),這世上最難降的妖魔是什么吱抚? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任百宇,我火速辦了婚禮,結(jié)果婚禮上秘豹,老公的妹妹穿的比我還像新娘携御。我一直安慰自己,他們只是感情好既绕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布啄刹。 她就那樣靜靜地躺著,像睡著了一般凄贩。 火紅的嫁衣襯著肌膚如雪誓军。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,578評(píng)論 1 305
  • 那天疲扎,我揣著相機(jī)與錄音昵时,去河邊找鬼。 笑死评肆,一個(gè)胖子當(dāng)著我的面吹牛债查,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瓜挽,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼盹廷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了久橙?” 一聲冷哼從身側(cè)響起俄占,我...
    開(kāi)封第一講書(shū)人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤管怠,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后缸榄,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體渤弛,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年甚带,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了她肯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鹰贵,死狀恐怖晴氨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情碉输,我是刑警寧澤籽前,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站敷钾,受9級(jí)特大地震影響枝哄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜阻荒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一挠锥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧财松,春花似錦瘪贱、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至舶掖,卻和暖如春球昨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背眨攘。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工主慰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鲫售。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓共螺,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親情竹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子藐不,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

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