Shape 圖形規範的類型,是由畫筆(Path)描繪線條輪廓,就像在心中打草圖一樣,並不涉及色彩,通常也不會固定大小,而是等到畫布圖層或視圖之中顯示時,才決定具體的顏色與寬高尺寸,這樣可以讓 Shape 圖形提供最有彈性的運用。

上一節的正多邊形 Shape,稍作變化,就可變成多角星形,例如五邊形變成五角星,只要在邊線中點往內凹即可。程式碼僅需增加一組內凹的「內頂點」,原來頂點改稱「外頂點」,再加一個參數 r (半徑比)表示內凹程度,如下圖:

截圖 2022-05-25 上午9.38.17.png

Shape 圖形的邊線與內部,在畫布圖層或視圖中可用 stroke() 與 fill() 分別上色,除了單色之外,還可以使用「漸層色」(Gradient),所謂「漸層」是指兩色或多色之間加以過渡所顯示的效果,怎麼做呢?以下範例將用同一組配色做出三種漸層效果,如下圖:

截圖 2022-05-25 下午8.01.06.png

上面Shape圖形的顏色,均採用「藍-黃」雙色漸層,不過,在 SwiftUI 中有多種不同的漸層過渡方式,包括:

  1. 線性漸層 linearGradient — 如上圖九宮格,均由左上角(藍)線性過渡到右下角(黃)
  2. 放射狀漸層 radialGradient — 如上方五角星,由中心點(黃)向外放射過渡到邊線(藍)
  3. 扇形或圓錐形漸層 conicGradient/angularGradient — 如16角星,由右側(藍)扇形過渡到左側(黃)
  4. 橢圓漸層 ellipticalGradient — 橢圓放射狀的過渡,下一節(4-8c)再展示

套用漸層色可分成兩個步驟,第一、先用 Gradient() 物件定義好漸層色,第二、再指定上述過渡方式。用法是不是跟第1課動畫(Animation)很像?例如:

let 黃藍漸層 = Gradient(colors: [.yellow, .blue])
let 藍黃藍 = Gradient(colors: [.blue, .yellow, .blue])

圖層.fill(
    多角星(5, r: 0.75).path(in: 左半框), 
    with: .radialGradient(
        黃藍漸層, 
        center: 左中心, 
        startRadius: .zero, 
        endRadius: 半徑))
圖層.fill(
    多角星(16, r: 0.9).path(in: 右半框),
    with: .conicGradient(藍黃藍, center: 右中心))

先以 Gradient 物件定義由黃、藍雙色構成「黃藍漸層」,Gradient 的參數為一組顏色陣列,裡面可任意包含2個以上的顏色。

再以「黃藍漸層」加到放射狀漸層 radialGradient() 之中即可,放射狀漸層還須額外指定中心點與半徑等參數。