1. 程式人生 > >放肆地用 UIBezierPath 和 CAShapeLayer 畫各種圖形

放肆地用 UIBezierPath 和 CAShapeLayer 畫各種圖形

CAShapeLayer 是 CALayer 的子類,但是比 CALayer 更靈活,可以畫出各種圖形,當然,你也可以使用其他方式來畫,隨你。

雜談

在 CAShapeLayer 中,也可以像 CALayer 一樣指定它的 frame 來畫,就像這樣:

Objective-C
12345 let layer=CAShapeLayer()layer.frame=CGRectMake(110,100,150,100)layer.backgroundColor=UIColor.blackColor().CGColorview.layer.addSublayer(layer)

然後你就會得到如圖這樣的黑色矩形

但是,CAShapeLayer 有一個神奇的屬性 path 用這個屬性配合上 UIBezierPath 這個類就可以達到超神的效果。

UIBezierPath 顧名思義,這是用貝塞爾曲線的方式來構建一段弧線,你可以用任意條弧線來組成你想要的形狀,比如,你想用它來和上面一樣畫一個矩形,那就可以這樣子來做:

Objective-C
12345 let path=UIBezierPath
(rect: CGRectMake(110,100,150,100))let layer=CAShapeLayer()layer.path=path.CGPathlayer.fillColor=UIColor.blackColor().CGColorview.layer.addSublayer(layer)

要注意的是,這裡就不要用backgroundColor 這個屬性了,而要使用 fillColorstrokeColor ,前者代表設定這個 Layer 的填充色,後者代表設定它的邊框色

Objective-C
12 layer.fillColor=UIColor.clearColor().CGColorlayer.strokeColor=UIColor.blackColor().CGColor

可以試一下把上面程式碼設定顏色的部分改成這個樣子,那麼執行程式的時候就會是這種樣子

玩一下UIBezierPath

在說回 UIBezierPath ,在 UIBezierPath 的 init 方法中,就有很多方便你畫各種圖形的方法,比如你可以畫一個帶圓角的圖形

Objective-C
12345 let path=UIBezierPath(roundedRect: CGRectMake(110,100,150,100),cornerRadius:50)let layer=CAShapeLayer()layer.path=path.CGPathlayer.fillColor=UIColor.clearColor().CGColorlayer.strokeColor=UIColor.blackColor().CGColor

還可以指定起始角和半徑畫圓

Objective-C
12345678 letradius: CGFloat=60.0letstartAngle: CGFloat=0.0letendAngle: CGFloat=CGFloat(M_PI*2)let path=UIBezierPath(arcCenter: view.center,radius: radius,startAngle: startAngle,endAngle: endAngle,clockwise: true)let layer=CAShapeLayer()layer.path=path.CGPathlayer.fillColor=UIColor.clearColor().CGColorlayer.strokeColor=UIColor.blackColor().CGColor

在這裡涉及到角度的問題,起始角和結束角,這裡的角度使使用弧度制來表示,這裡我收藏了一張圖片,以方便參考

怎麼畫曲線

貝塞爾曲線的畫法是由起點、終點、控制點三個引數來畫的,為了解釋清楚這個點,我寫了幾行程式碼來解釋它

Objective-C
123456789101112131415161718192021222324252627282930 let startPoint=CGPointMake(50,300)let endPoint=CGPointMake(300,300)let controlPoint=CGPointMake(170,200)let layer1=CALayer()layer1.frame=CGRectMake(startPoint.x,startPoint.y,5,5)layer1.backgroundColor=UIColor.redColor().CGColorlet layer2=CALayer()layer2.frame=CGRectMake(endPoint.x,endPoint.y,5,5)layer2.backgroundColor=UIColor.redColor().CGColorlet layer3=CALayer()layer3.frame=CGRectMake(controlPoint.x,controlPoint.y,5,5)layer3.backgroundColor=UIColor.redColor().CGColorlet path=UIBezierPath()let layer=CAShapeLayer()path.moveToPoint(startPoint)path.addQuadCurveToPoint(endPoint,controlPoint: controlPoint)layer.path=path.CGPathlayer.fillColor=UIColor.clearColor().CGColorlayer.strokeColor=UIColor.blackColor().CGColorview.layer.addSublayer(layer)view.layer.addSublayer(layer1)view.layer.addSublayer(layer2)view.layer.addSublayer(layer3)

我很隨意的定義了三個點,為了清楚顯示它們的位置,我放了三個矩形在上面以便觀察,然後呼叫 path.moveToPoint(startPoint) 讓它移動到起始點,然後呼叫path.addQuadCurveToPoint(endPoint, controlPoint: controlPoint) 這個方法告訴它結束點和控制點,這樣它就能畫出一條有弧度的線條了,如果把fillColor設定一個顏色,那麼它就會變成一個很醜的形狀了,示例圖如下

控制點決定了它的曲率,曲線的頂點不等於控制點的位置,具體可以看一下貝塞爾曲線的定義,你還可以使用兩個控制點來畫,兩個控制點可以使用方法 path.addCurveToPoint(endPoint, controlPoint1: controlPoint, controlPoint2: controlPoint2)來搞定

這樣它會是這個樣子

再來說說 CAShapeLayer

CAShapeLayer 是個神奇的東西,給它一個path它就能變成你想要的形狀,它還有很多可以玩的地方。綜合使用可以組合成不同的動畫,比如下面這樣:

demo1.gif demo2.gif demo3.gif

這三個動畫就是使用了 strokeEnd strokeStart lineWidth 三個屬性,第一個動畫用了strokeEnd這個屬性的值範圍是0-1,動畫顯示了從0到1之間每一個值對這條曲線的影響,strokeStart的方法則是相反的,如果把這兩個值首先都設定成0.5然後慢慢改變成0和1的時候就會變成第二個動畫,配合lineWidth則曲線會慢慢變粗,這裡的很多屬性都是支援動畫的。

示例程式碼

Objective-C
123456789101112131415161718192021222324252627282930313233 private func animation1(){let animation=CABasicAnimation(keyPath:"strokeEnd")animation.fromValue=0animation.toValue=1animation.duration=2layer.addAnimation(animation, forKey:"")}private func animation2(){layer.strokeStart=0.5layer.strokeEnd=0.5let animation=CABasicAnimation(keyPath:"strokeStart")animation.fromValue=0.5animation.toValue=0animation.duration=2let animation2=CABasicAnimation(keyPath:"strokeEnd")animation2.fromValue=0.5animation2.toValue=1animation2.duration=2layer.addAnimation(animation, forKey:"")layer.addAnimation(animation2, forKey:"")}private func animation3(){let animation=CABasicAnimation(keyPath:"lineWidth")animation.fromValue=1animation.toValue=10animation.duration=2layer.addAnimation(animation,forKey:"")}

應用一下

前一陣子在仿時光網這個APP,其中有一個Layer的形狀很怪異,是這樣的

很明顯它可以用 CAShapeLayer + UIBezierPath 來做,思路大概是這樣,先移動到左上方的位置,然後向下劃線,然後往右劃線,然後往上劃線,還剩一個蓋子,這個蓋子就用一個控制點控制曲率,非常簡單,程式碼如下

Objective-C
12345678910111213 let finalSize=CGSizeMake(CGRectGetWidth(view.frame),400)let layerHeight=finalSize.height *0.2let layer=CAShapeLayer()let bezier=UIBezierPath()bezier.moveToPoint(CGPointMake(0,finalSize.height-layerHeight))bezier.addLineToPoint(CGPointMake(0,finalSize.height-1))bezier.addLineToPoint(CGPointMake(finalSize.width,finalSize.height-1))bezier.addLineToPoint(CGPointMake(finalSize.width,finalSize.height-layerHeight))bezier.addQuadCurveToPoint(CGPointMake(0,finalSize.height-layerHeight),controlPoint: CGPointMake(finalSize.width/2,(finalSize.height-layerHeight)-40))layer.path=bezier.CGPathlayer.fillColor=UIColor.blackColor().CGColorview.layer.addSublayer(layer)

就能畫出這樣的形狀來

再來一個複雜點的,微信下拉拍小視訊的那隻眼睛很有趣,來模仿一下那個效果吧,它是這樣的

首先你得畫出這隻眼睛,這是眼睛包括5個部分組成(這個是用OC寫的)

Objective-C

相關推薦

放肆 UIBezierPath CAShapeLayer 各種圖形

CAShapeLayer 是 CALayer 的子類,但是比 CALayer 更靈活,可以畫出各種圖形,當然,你也可以使用其他方式來畫,隨你。 雜談 在 CAShapeLayer 中,也可以像 CALayer 一樣指定它的 frame 來畫,就像這樣:

放肆的使用UIBezierPathCAShapeLayer各種圖形

CAShapeLayer 是 CALayer 的子類,但是比 CALayer 更靈活,可以畫出各種圖形,當然,你也可以使用其他方式來畫,隨你。 雜談 在 CAShapeLayer 中,也可以像 CALayer 一樣指定它的 frame 來畫,就像這樣: let layer = CASha

iOS UIBezierPathCAShapeLayer一條多顏色的線條

專案需要做一個有多個色值的進度條,笨辦法是建立多個檢視,給每個檢視設定不同顏色,當然還是畫圖更高階點。本次記錄利用UIBezierPath和CAShapeLayer來畫一條多顏色的線條。 首先我們要先知道整個線條的所有色值,和當前的結果,也就是偏高然後建立顏色線條類,呼

pythonmatplotlib雙座標系曲線

 有時候寫論文的時候不免會遇到畫曲線圖,而且還有可能需要畫雙座標系(雙Y軸)的曲線圖,在百度中找了許久,先mark一下,以下程式碼就是我論文中用到的,以後應該還會用到,先儲存在這裡。結果圖如下: im

canvasjs了個鐘錶,跟大家分享一下

<pre name="code" class="javascript">(function () { var mycanvas=document.getElementById("mycanvas"); var otex=mycanvas.getContext("

Struts2萬字元它的各種

Struts2和Servlet相比有幾個牛逼的地方。對OGNL表示式的整合以及萬用字元的運用就是其中兩個。 而J2EE標準中,與這兩個對應的分別是JSP中EL表示式的運用,以及urlPattern中的萬用字元。 前面的一篇文章中,講述了OGNL的使用(OGN

RPA社區化ID,請“放肆起來!

註冊賬號 發生 必須 免費試用 機器 有一個 流程 開始 互動 藝賽旗RPA全面免費下載中點擊下載http://www.i-search.com.cn/index.html?from=line27我們以往提供的在線註冊方式,不夠符合大家習慣,也不能把大家團結在藝賽旗生態周邊

Android利用canvas各種圖形(點、直線、弧、圓、橢圓、文字、矩形、多邊形、曲線、圓角矩形)

DrawView.java public class DrawView extends View { public DrawView(Context context) { super(context); } @Override protected void onDraw(Canvas c

Python3tkinter開發簡單圖形介面程式 2018-09-28

原始碼庫: program-in-chinese/wubi_code_editor 起因在這裡. 由於此專案和漢字相關, 個人也想嘗試Python的圖形介面開發, 於是開始嘗試. 遇到的一個坑. 使用者測試時, 發現png圖片載入不了, 後發現是由於tkinter版本問題: T

Android 利用canvas各種圖形(點、直線、弧、圓、橢圓、文字、矩形、多邊形、曲線、圓角矩形)

1、首先說一下canvas類: Class Overview The Canvas class holds the “draw” calls. To draw something, you need 4 basic components: A Bitmap

Canvas各種圖形及控制元件在螢幕中的座標-android

我們已經介紹了Canvas,在那裡,已經學習瞭如何建立自己的View。在第7章中也使用了Canvas來為MapView標註覆蓋。  畫布(Canvas)是圖形程式設計中一個很普通的概念,通常由三個基本的繪圖元件組成: Canvas  提供了繪圖方法,可以向底層的點陣圖繪製基本圖形。     

第二次PythonPlotly成功繪製圖形

import pymysql import plotly import plotly.graph_objs plotly.tools.set_credentials_file(username='JaneGinkgo', api_key='IDOV3Q7jOtABYvw7

Android利用canvas各種圖形 及Paint用法

Class Overview The Canvas class holds the "draw" calls. To draw something, you need 4 basic components: A Bitmap to hold the pixels, a Canvas to host the

第一次PythonPlotly成功繪製圖形

import plotly import plotly.plotly as py from plotly.graph_objs import * plotly.tools.set_credentials_file(username='JaneGinkgo', api_k

border 屬性 各種邊框

text blog 屬性 .cn itl 效果 border items head 嗯,如圖,想要個類似這樣的效果 <!DOCTYPE html> <html lang="en"> <head> <meta charse

沉澱再出發:python各種圖表

畫座標系沉澱再出發:用python畫各種圖表 一、前言     最近需要用python來做一些統計和畫圖,因此做一些筆記。 二、python畫各種圖表  2.1、使用turtle來畫圖 1 import turtle as t #turtle庫是pyt

python學習--python2python3共存時如何優雅pip安裝模組?

參考網頁: 1. 同時裝了Python3和Python2,怎麼用pip? 2. How to install pip for Python 3 on Mac OS X? 自己試了一下,發現其實解決方案很簡單。 在python2時,使用語句: pip install xxx

實戰 | 教你Python各種版本的聖誕樹

專案介紹 大家好呀,這是一份遲到的聖誕節Python專輯專案。 我們一起看看如何用Python做出超級炫酷的聖誕樹吧~ 1.入門版本 height = 5 stars = 1 for i in range(height): print((' ' * (height - i

【R語言 視覺化】我教你15分鐘學會R各種統計圖

data:2015-10-17 author:laidefa 有同學讓我開始教他R語言,就先分享點東西把。學習R的曲線是陡峭的,有人教你才是正道,沒人教你你至少要安靜學習三個月甚至遠遠不止,才會駕輕

pythonhtml5在畫布上個車子笑臉

 畫汽車 python提供了tutle(海龜)模組。這個模組提供了編寫向量圖的方法,基本上就是畫直線,點和曲線。 海龜是怎樣工作的,首先讓python匯入turtle模組。 import turtle 引入turtle模組後,呼叫turle模組中的Pen函式,它會自動建立一