繪制幾何圖形(Shape)

2024-01-25 13:21 更新

繪制組件用于在頁面繪制圖形,Shape組件是繪制組件的父組件,父組件中會描述所有繪制組件均支持的通用屬性。具體用法請參考Shape。

創(chuàng)建繪制組件

繪制組件可以由以下兩種形式創(chuàng)建:

  • 繪制組件使用Shape作為父組件,實現(xiàn)類似SVG的效果。接口調(diào)用為以下形式:
    1. Shape(value?: PixelMap)

    該接口用于創(chuàng)建帶有父組件的繪制組件,其中value用于設置繪制目標,可將圖形繪制在指定的PixelMap對象中,若未設置,則在當前繪制目標中進行繪制。

    1. Shape() {
    2. Rect().width(300).height(50)
    3. }
  • 繪制組件單獨使用,用于在頁面上繪制指定的圖形。有7種繪制類型,分別為Circle(圓形)、Ellipse(橢圓形)、Line(直線)、Polyline(折線)、Polygon(多邊形)、Path(路徑)、Rect(矩形)。以Circle的接口調(diào)用為例:
    1. Circle(options?: {width?: string | number, height?: string | number}
    該接口用于在頁面繪制圓形,其中width用于設置圓形的寬度,height用于設置圓形的高度,圓形直徑由寬高最小值確定。
    1. Circle({ width: 150, height: 150 })

形狀視口viewport

  1. viewPort{ x?: number | string, y?: number | string, width?: number | string, height?: number | string }

形狀視口viewport指定用戶空間中的一個矩形,該矩形映射到為關聯(lián)的 SVG 元素建立的視區(qū)邊界。viewport屬性的值包含x、y、width和height四個可選參數(shù),x 和 y 表示視區(qū)的左上角坐標,width和height表示其尺寸。

以下3個示例講解Viewport具體用法:

  • 通過形狀視口對圖形進行放大與縮小。
    1. // 畫一個寬高都為150的圓
    2. Text('原始尺寸Circle組件')
    3. Circle({width: 75, height: 75}).fill('#E87361')
    4. Row({space:10}) {
    5. Column() {
    6. // 創(chuàng)建一個寬高都為150的shape組件,背景色為黃色,一個寬高都為75的viewport。用一個藍色的矩形來填充viewport,在viewport中繪制一個直徑為75的圓。
    7. // 繪制結束,viewport會根據(jù)組件寬高放大兩倍
    8. Text('shape內(nèi)放大的Circle組件')
    9. Shape() {
    10. Rect().width('100%').height('100%').fill('#0097D4')
    11. Circle({width: 75, height: 75}).fill('#E87361')
    12. }
    13. .viewPort({x: 0, y: 0, width: 75, height: 75})
    14. .width(150)
    15. .height(150)
    16. .backgroundColor('#F5DC62')
    17. }
    18. Column() {
    19. // 創(chuàng)建一個寬高都為150的shape組件,背景色為黃色,一個寬高都為300的viewport。用一個綠色的矩形來填充viewport,在viewport中繪制一個直徑為75的圓。
    20. // 繪制結束,viewport會根據(jù)組件寬高縮小兩倍。
    21. Text('Shape內(nèi)縮小的Circle組件')
    22. Shape() {
    23. Rect().width('100%').height('100%').fill('#BDDB69')
    24. Circle({width: 75, height: 75}).fill('#E87361')
    25. }
    26. .viewPort({x: 0, y: 0, width: 300, height: 300})
    27. .width(150)
    28. .height(150)
    29. .backgroundColor('#F5DC62')
    30. }
    31. }

  • 創(chuàng)建一個寬高都為300的shape組件,背景色為黃色,一個寬高都為300的viewport。用一個藍色的矩形來填充viewport,在viewport中繪制一個半徑為75的圓。
    1. Shape() {
    2. Rect().width("100%").height("100%").fill("#0097D4")
    3. Circle({ width: 150, height: 150 }).fill("#E87361")
    4. }
    5. .viewPort({ x: 0, y: 0, width: 300, height: 300 })
    6. .width(300)
    7. .height(300)
    8. .backgroundColor("#F5DC62")

  • 創(chuàng)建一個寬高都為300的shape組件,背景色為黃色,創(chuàng)建一個寬高都為300的viewport。用一個藍色的矩形來填充viewport,在viewport中繪制一個半徑為75的圓,將viewport向右方和下方各平移150。
    1. Shape() {
    2. Rect().width("100%").height("100%").fill("#0097D4")
    3. Circle({ width: 150, height: 150 }).fill("#E87361")
    4. }
    5. .viewPort({ x: -150, y: -150, width: 300, height: 300 })
    6. .width(300)
    7. .height(300)
    8. .backgroundColor("#F5DC62")

自定義樣式

繪制組件支持通過各種屬性對組件樣式進行更改。

  • 通過fill可以設置組件填充區(qū)域顏色。
    1. Path()
    2. .width(100)
    3. .height(100)
    4. .commands('M150 0 L300 300 L0 300 Z')
    5. .fill("#E87361")

  • 通過stroke可以設置組件邊框顏色。
    1. Path()
    2. .width(100)
    3. .height(100)
    4. .fillOpacity(0)
    5. .commands('M150 0 L300 300 L0 300 Z')
    6. .stroke(Color.Red)

  • 通過strokeOpacity可以設置邊框透明度。
    1. Path()
    2. .width(100)
    3. .height(100)
    4. .fillOpacity(0)
    5. .commands('M150 0 L300 300 L0 300 Z')
    6. .stroke(Color.Red)
    7. .strokeWidth(10)
    8. .strokeOpacity(0.2)

  • 通過strokeLineJoin可以設置線條拐角繪制樣式。拐角繪制樣式分為Bevel(使用斜角連接路徑段)、Miter(使用尖角連接路徑段)、Round(使用圓角連接路徑段)。
    1. Polyline()
    2. .width(100)
    3. .height(100)
    4. .fillOpacity(0)
    5. .stroke(Color.Red)
    6. .strokeWidth(8)
    7. .points([[20, 0], [0, 100], [100, 90]])
    8. // 設置折線拐角處為圓弧
    9. .strokeLineJoin(LineJoinStyle.Round)

  • 通過strokeMiterLimit設置斜接長度與邊框寬度比值的極限值。
    斜接長度表示外邊框外邊交點到內(nèi)邊交點的距離,邊框寬度即strokeWidth屬性的值。strokeMiterLimit取值需大于等于1,且在strokeLineJoin屬性取值LineJoinStyle.Miter時生效。
    1. Polyline()
    2. .width(100)
    3. .height(100)
    4. .fillOpacity(0)
    5. .stroke(Color.Red)
    6. .strokeWidth(10)
    7. .points([[20, 0], [20, 100], [100, 100]])
    8. // 設置折線拐角處為尖角
    9. .strokeLineJoin(LineJoinStyle.Miter)
    10. // 設置斜接長度與線寬的比值
    11. .strokeMiterLimit(1/Math.sin(45))
    12. Polyline()
    13. .width(100)
    14. .height(100)
    15. .fillOpacity(0)
    16. .stroke(Color.Red)
    17. .strokeWidth(10)
    18. .points([[20, 0], [20, 100], [100, 100]])
    19. .strokeLineJoin(LineJoinStyle.Miter)
    20. .strokeMiterLimit(1.42)

  • 通過antiAlias設置是否開啟抗鋸齒,默認值為true(開啟抗鋸齒)。
    1. //開啟抗鋸齒
    2. Circle()
    3. .width(150)
    4. .height(200)
    5. .fillOpacity(0)
    6. .strokeWidth(5)
    7. .stroke(Color.Black)

    1. //關閉抗鋸齒
    2. Circle()
    3. .width(150)
    4. .height(200)
    5. .fillOpacity(0)
    6. .strokeWidth(5)
    7. .stroke(Color.Black)
    8. .antiAlias(false)

場景示例

  • 在Shape的(-80, -5)點繪制一個封閉路徑,填充顏色0x317AF7,線條寬度10,邊框顏色紅色,拐角樣式銳角(默認值)。
    1. @Entry
    2. @Component
    3. struct ShapeExample {
    4. build() {
    5. Column({ space: 10 }) {
    6. Shape() {
    7. Path().width(200).height(60).commands('M0 0 L400 0 L400 150 Z')
    8. }
    9. .viewPort({ x: -80, y: -5, width: 500, height: 300 })
    10. .fill(0x317AF7)
    11. .stroke(Color.Red)
    12. .strokeWidth(3)
    13. .strokeLineJoin(LineJoinStyle.Miter)
    14. .strokeMiterLimit(5)
    15. }.width('100%').margin({ top: 15 })
    16. }
    17. }

  • 繪制一個直徑為150的圓,和一個直徑為150、線條為紅色虛線的圓環(huán)(寬高設置不一致時以短邊為直徑)。
    1. @Entry
    2. @Component
    3. struct CircleExample {
    4. build() {
    5. Column({ space: 10 }) {
    6. //繪制一個直徑為150的圓
    7. Circle({ width: 150, height: 150 })
    8. //繪制一個直徑為150、線條為紅色虛線的圓環(huán)
    9. Circle()
    10. .width(150)
    11. .height(200)
    12. .fillOpacity(0)
    13. .strokeWidth(3)
    14. .stroke(Color.Red)
    15. .strokeDashArray([1, 2])
    16. }.width('100%')
    17. }
    18. }

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號