View繪製系列(8)-Canvas貝塞爾曲線繪製

Canvas貝塞爾曲線繪製

寧從直中來,不從曲中求,雖然直線應用不少,但曲線亦然。在Path類說明的部分,咱們就聊到其主要做用是用來描述直線段,二次曲線及三次曲線所組成的複合幾何路徑,在前面咱們已經瞭解到了直線段組合的描述方法而且進行了簡單應用,接下來一塊兒來看下曲線的複合路徑描述。web

貝塞爾曲線簡介

在正式編碼前,咱們首先來了解下什麼是貝塞爾曲線,貝塞爾曲線由起始點,終點及控制點三種元素構成,經過改變控制點的位置,貝塞爾曲線的形狀會發生變化。canvas

以二階貝塞爾曲線爲例說明曲線造成過程:c#

步驟一:在平面內選三個不一樣的點並依次鏈接,以下圖所示:微信

步驟二:在ABBC線段上分別尋找點DE,使得AD/AB = CE/CB,以下圖:ide

步驟三: 鏈接 DE ,在 DE 上尋找點 F ,使得 DF / DE = AD / AB = BE / BC ,以下圖:


步驟四: 重複步驟2到3,獲得的全部F點依次鏈接起來就構成了咱們的二階貝塞爾曲線,在實際繪製中咱們只須要肯定 P0 P1 P2 這三個點座標便可,其中 P1 被稱爲控制點。


二階貝塞爾曲線和三階貝塞爾曲線的原理相同,不一樣的是控制點個數,二階貝塞爾曲線有兩個控制點,三階貝塞爾曲線有三個控制點,一階貝塞爾曲線繪製出來是直線,這裏不作贅述,更多關於貝塞爾曲線的說明信息可參閱文末的參考連接。

二階貝塞爾曲線繪製

咱們以OFO App裏面的黃色背景,爲你們演示下二階貝塞爾曲線的繪製函數

如上圖所示, BC View 寬度,能夠經過 getRight() - getLeft() 獲得, View 高度能夠經過 getBottom() - getTop() 得到,取 A‘ 位於 View 高度的十分之一處,則 A' 的座標爲( getLeft() , getTop() +( View 高度)/10),同理 D‘ 座標爲( getLeft() +( View 寬度), getTop() +( View 高度)/10),取 BC 中線與 AD 交點上 View 高度十分之一處爲控制點,則控制點座標爲( getLeft()``+View 寬度/2, getTop() - View 高度/10),進而咱們能夠獲得繪製代碼以下:
Path path = new Path();

//選取整個View的寬高繪製背景
path.moveTo(getLeft(), getTop()+(getBottom()-getTop())/10);
//繪製A'D',控制點在AD平分線上,quadTo函數的前兩個值爲控制點的x,y座標,後兩個值爲終點座標
path.quadTo(getLeft()+(getRight()-getLeft())/2 , getTop()-(getBottom()-getTop())/10,getRight() , getTop()+(getBottom()-getTop())/10);

//繪製D'C
path.lineTo(getRight(), getBottom());
//繪製CB
path.lineTo(getLeft(), getBottom());

//閉合曲線,自動繪製BA'
path.close();

運行後效果:flex

因爲咱們尚未講到獲取 View 寬高的方法,因此暫時用已知方法獲取數據。

三階貝塞爾曲線繪製

三階貝塞爾曲線有兩個控制點,咱們取(0,0)點爲起點,(600,500)爲終點,(100,500)和(600,50)爲控制點,繪製一條貝塞爾曲線,代碼以下:編碼

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    Path path = new Path();
    path.cubicTo(100,500,600,50,600,500);
    Paint paint = new Paint();
    paint.setStyle(Paint.Style.STROKE);
    paint.setColor(Color.BLUE);
    paint.setStrokeWidth(20);
    canvas.drawPath(path,paint);
}

運行效果:url

若是咱們不指定Paint的Style爲STROKE,則默認爲FILL,繪製效果以下:


往期推薦spa

View繪製系列(1)-View簡介

OpenCV SDK下載及Android Java環境搭建


本文分享自微信公衆號 - 小海編碼日記(gh_1f87b8c00ede)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索