一文解析 Android 貝塞爾曲線

姓名:唐來賓? 學號:17101223417

轉載http://mp.weixin.qq.com/s/-jUIIcdnx-BBPgb5AGnbEA

【嵌牛導讀】相信很多同學都知道“貝塞爾曲線”這個詞职抡,我們在很多地方都能經(jīng)称湔希看到叉瘩。利用“貝塞爾曲線”可以做出很多好看的UI效果只估,本篇博客就讓我們一起學習“貝塞爾曲線”。

【嵌牛鼻子】Android 貝塞爾曲線

【嵌牛鼻子】如何畫貝塞爾曲線?

【嵌牛正文】

相信很多同學都知道“貝塞爾曲線”這個詞税手,我們在很多地方都能經(jīng)忱党看到。利用“貝塞爾曲線”可以做出很多好看的UI效果宋欺,本篇博客就讓我們一起學習“貝塞爾曲線”轰豆。

1

貝塞爾曲線的原理

貝塞爾曲線是用一系列點來控制曲線狀態(tài)的,這些點簡單分為兩類:

類型作用

數(shù)據(jù)點確定曲線的起始和結束位置

控制點確定曲線的彎曲程度

一階貝塞爾曲線

一階曲線是沒有控制點的齿诞,僅有兩個數(shù)據(jù)點(A 和 B)酸休,最終效果一個線段。

動態(tài)過程可以參照下圖(貝塞爾曲線相關的動態(tài)演示圖片來自維基百科)祷杈。

一階曲線其實就是lineTo方法斑司。

二階貝塞爾曲線

在平面內(nèi)任選 3 個不共線的點,依次用線段連接但汞。

在第一條線段上任選一個點 D宿刮。計算該點到線段起點的距離 AD,與該線段總長 AB 的比例私蕾。

連接這兩點 DE僵缺。

從新的線段 DE 上再次找出相同比例的點 F,使得 DF:DE = AD:AB = BE:BC踩叭。

到這里磕潮,我們就確定了貝塞爾曲線上的一個點 F。接下來容贝,請稍微回想一下中學所學的極限知識自脯,讓選取的點 D 在第一條線段上從起點 A 移動到終點 B,找出所有的貝塞爾曲線上的點 F嗤疯。所有的點找出來之后冤今,我們也得到了這條貝塞爾曲線。

動態(tài)過程如下:

三階貝塞爾曲線

控制點個數(shù)為 4 時茂缚,就是三階的曲線

步驟都是相同的戏罢,只不過我們每確定一個貝塞爾曲線上的點屋谭,要進行三輪取點操作。如圖龟糕,AE:AB = BF:BC = CG:CD = EH:EF = FI:FG = HJ:HI桐磁,其中點 J 就是最終得到的貝塞爾曲線上的一個點。

這樣我們得到的是一條三次貝塞爾曲線讲岁。

動態(tài)圖如下:

三階曲線對應的方法是cubicTo

要繪制更復雜的曲線我擂,控制點的增加也僅僅是線性的。這一特點使其不光在工業(yè)設計領域大展拳腳缓艳,就連數(shù)學基礎不好的人也可以比較容易地掌握校摩,比如大多數(shù)平面美術設計師們。

2

學習貝塞爾曲線函數(shù)

一階曲線是一條線段阶淘,非常簡單衙吩,不再進行介紹,都是path的基本用法溪窒。

二階曲線:

首先坤塞,兩個數(shù)據(jù)點是控制貝塞爾曲線開始和結束的位置,而控制點則是控制貝塞爾的彎曲狀態(tài)

從上面的動態(tài)圖可以看出澈蚌,貝塞爾曲線在動態(tài)變化過程中有類似于橡皮筋一樣的彈性效果摹芙,因此在制作一些彈性效果的時候很常用。

代碼如下:

三階曲線:

三階曲線由兩個數(shù)據(jù)點和兩個控制點來控制曲線狀態(tài)宛瞄。

三階曲線相比于二階曲線可以制作更加復雜的形狀浮禾,但是對于高階的曲線,用低階的曲線組合也可達到相同的效果坛悉,就是傳說中的降階伐厌。因此我們對貝塞爾曲線的封裝方法一般最高只到三階曲線。

降階與升階

類型釋義變化

降階在保持曲線形狀與方向不變的情況下裸影,減少控制點數(shù)量,即降低曲線階數(shù)方法變得簡單军熏,數(shù)據(jù)點變多轩猩,控制點可能減少,靈活性變?nèi)?/p>

升階在保持曲線形狀與方向不變的情況下荡澎,增加控制點數(shù)量均践,即升高曲線階數(shù)方法更加復雜,數(shù)據(jù)點不變摩幔,控制點增加彤委,靈活性變強

3

貝塞爾曲線實例

一般使用貝塞爾曲線的情況如下:

至于只需要一個靜態(tài)的曲線圖形的情況,用圖片豈不是更好或衡,大量的計算會很不劃算焦影。

如果是顯示SVG矢量圖的話车遂,已經(jīng)有相關的解析工具了(內(nèi)部依舊運用的有貝塞爾曲線),不需要手動計算斯辰。

貝塞爾曲線的主要優(yōu)點是可以實時控制曲線狀態(tài)舶担,并可以通過改變控制點的狀態(tài)實時讓曲線進行平滑的狀態(tài)變化。

4

QQ紅點的實現(xiàn)效果

qq的紅點去除效果彬呻,其實就是用了兩條貝塞爾曲線衣陶。

基本理論:只要在拖動的時候 去改變輔助點的Y,和固定圓的半徑闸氮, 就可以出來效果剪况。

創(chuàng)建畫筆

繪制動圓和固定圓

獲取兩個圓之間的距離:

onDraw()方法繪制圓

處理onTouch()方法,讓紅點隨手勢動起來

修改onDraw()判斷

isOutToRange和isDisappear分別為true和false的情況

5

漂浮的心

漂浮軌跡就是一條三階貝塞爾曲線蒲跨,結合屬性動畫中的估值器進行設置拯欧。

首先定義一個屬性動畫的估值器

之后自定義一個view可以生成愛心,添加透明度财骨,縮放等動畫和根據(jù)貝塞爾曲線改變其位置的屬性動畫镐作。

初始化愛心圖片和多個插值器等,到時隨即選取

入場動畫

貝塞爾曲線動畫

結合動畫添加愛心

6

彈性的圓

還有一個實例隆箩,就是特別出名的彈性的圓

將這個圓的動畫效果拆解開看的畫该贾,可以分為5個狀態(tài)。

這里寫圖片描述

這個動畫效果的實現(xiàn)就是不同狀態(tài)之間的轉化加上水平位移的實現(xiàn)捌臊。

我們需要先了解一下如何用貝塞爾曲線畫一個圓杨蛋,因為我的做法是通過貝塞爾曲線來實現(xiàn)的。

就是所需要的數(shù)值c約等于0.551915024494f理澎,具體可以參考這篇文章逞力,http://spencermortensen.com/articles/bezier-circle/,那么這個c的值的作用糠爬,就是把圖中的1理解為圓的半徑寇荧,那么對應的另外個值就應該是半徑乘以0.551915024494f。

坐標軸也就是Android中的坐標軸了执隧,如果我們打算用貝塞爾曲線來畫這么一個圓的話揩抡,我們需要知道這個圓的半徑,以及圖中的M的值镀琉,知道這兩個值的話就能夠知道圖中12個點的坐標峦嗤,知道坐標就能夠用Path的cubicTo方法來使用貝塞爾曲線畫出圓了。

這樣我們就知道如何使用貝塞爾曲線來繪制一個圓了屋摔。也就是狀態(tài)1和狀態(tài)5我們都會繪制了烁设,接下來看看狀態(tài)2如何繪制。

狀態(tài)2其實就是把右邊的點向右移動點距離

狀態(tài)3的實現(xiàn)就是在狀態(tài)2的基礎上修改了個值钓试,一個是M的值加大装黑,讓圓看起來跟肥一點副瀑,還有就是圈住的那些點向右移動,做到居中曹体。

實現(xiàn)如下:

來自:CSDN-伯努力不努力

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末俗扇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子箕别,更是在濱河造成了極大的恐慌铜幽,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件串稀,死亡現(xiàn)場離奇詭異除抛,居然都是意外死亡,警方通過查閱死者的電腦和手機母截,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門到忽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人清寇,你說我怎么就攤上這事喘漏。” “怎么了华烟?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵翩迈,是天一觀的道長。 經(jīng)常有香客問我盔夜,道長负饲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任喂链,我火速辦了婚禮返十,結果婚禮上,老公的妹妹穿的比我還像新娘椭微。我一直安慰自己洞坑,他們只是感情好,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布赏表。 她就那樣靜靜地躺著检诗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瓢剿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天悠轩,我揣著相機與錄音间狂,去河邊找鬼。 笑死火架,一個胖子當著我的面吹牛鉴象,可吹牛的內(nèi)容都是我干的忙菠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼纺弊,長吁一口氣:“原來是場噩夢啊……” “哼牛欢!你這毒婦竟也來了?” 一聲冷哼從身側響起淆游,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤傍睹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后犹菱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拾稳,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年腊脱,在試婚紗的時候發(fā)現(xiàn)自己被綠了访得。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡陕凹,死狀恐怖悍抑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情杜耙,我是刑警寧澤搜骡,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站泥技,受9級特大地震影響浆兰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜珊豹,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一簸呈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧店茶,春花似錦蜕便、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間杠园,已是汗流浹背栖茉。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓油湖,卻偏偏與公主長得像吠昭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子劫拢,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

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