鴻蒙元服務(wù)實戰(zhàn)-笑笑五子棋(2)
章節(jié)導(dǎo)讀
本章節(jié)主要講解如何創(chuàng)建元服務(wù)和使用 canvas 描繪圖形
目標(biāo)
上一章最后講到了 笑笑五子棋 主要的技術(shù)棧如下:
- ArkTS API 12
- Canvas
- 元服務(wù)獨有的 AtomicServiceTabs
- 卡片開發(fā)
- 元服務(wù)的創(chuàng)建
- 元服務(wù)的上架
那么本章節(jié)就開始實現(xiàn)這個案例。
AGC 平臺上創(chuàng)建元服務(wù)
需要先在AGC平臺上項目,然后再新建元服務(wù)。一個項目可以對應(yīng)多個元服務(wù)。
DevEco Studio 創(chuàng)建元服務(wù)工程
AGC 平臺上創(chuàng)建好了項目,我們可以在本地創(chuàng)建元服務(wù)。
- 新建元服務(wù)
- 選擇 笑笑五子棋
- 選擇工程位置
- 元服務(wù)創(chuàng)建成功
Canvas 入門
Canvas提供畫布組件,用于自定義繪制圖形,開發(fā)者使用 CanvasRenderingContext2D 對象和 OffscreenCanvasRenderingContext2D
對象在 Canvas 組件上進行繪制,繪制對象可以是基礎(chǔ)形狀、文本、圖片等。
基本使用
canvas 的基本使用分為 4 步:
- 設(shè)置是否抗鋸齒抗鋸齒(Anti - aliasing)是一種在數(shù)字圖形處理中使用的技術(shù),主要用于減少圖像中因為像素有限而產(chǎn)生的鋸齒狀邊緣的現(xiàn)象
- 創(chuàng)建畫布上下文
- 渲染畫布組件
- 在畫布上描繪圖案
@Entry
@Component
struct Index {
// 1 用來配置CanvasRenderingContext2D對象的參數(shù),包括是否開啟抗鋸齒,true表明開啟抗鋸齒。
private settings: RenderingContextSettings = new RenderingContextSettings(true)
// 2 用來創(chuàng)建CanvasRenderingContext2D對象,通過在canvas中調(diào)用CanvasRenderingContext2D對象來繪制。
private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
build() {
// 3 在canvas中調(diào)用CanvasRenderingContext2D對象。
Column(){
Canvas(this.context)
.width('100%')
.height('100%')
.backgroundColor('#F5DC62')
.onReady(() = > {
// 4 可以在這里繪制內(nèi)容。
this.context.strokeRect(50, 50, 200, 150);
})
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center)
}
}
- 效果
canvas 常見用法
canvas 的核心思想是將想要的圖形如,直線、圓圈、矩形等圖形描繪到畫布上。如果想要呈現(xiàn)出比較酷炫的效果,做法是:
- 描繪圖形
- 擦除畫布
- 計算數(shù)值-重新描繪圖形
- 擦除畫布
- 。。。
通過以上過程實現(xiàn)動畫效果
canvas 的坐標(biāo)系
在 canvas 中畫圖形都是基于坐標(biāo)系來進行的。 左上角為起點。
描繪圖形
canvas 中內(nèi)置的常見的描繪圖形的方法有以下:
- 直線
- 矩形
- 弧形
- 文本
- 圖像
- ...
直線
描繪直線可以使用:
- 定起點
moveTo
- 定終點
lineTo
- 開始描繪
stroke
this.context.moveTo(10, 10);
this.context.lineTo(100, 100);
this.context.stroke();
矩形
可以使用直線lineTo
自己畫成一個矩形。也可以直接使用 strokeRect
直接生成矩形
lineTo 畫矩形
this.context.moveTo(10, 10);
this.context.lineTo(300, 10);
this.context.lineTo(300, 300);
this.context.lineTo(10, 300);
// 自動閉環(huán)
this.context.closePath();
// 開始描述 將路徑的當(dāng)前點移回到路徑的起點,當(dāng)前點到起點間畫一條直線
this.context.stroke();
strokeRect 畫矩形
// this.context.strokeRect(x, y, 寬度, 高度);
this.context.strokeRect(50, 50, 200, 150);
弧形
弧形可以使用 arc
和 arcTo
來描繪
arc
arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, counterclockwise?: boolean)
參數(shù)名 | 類型 | 必填 | 說明 |
---|---|---|---|
x | number | 是 | 弧線圓心的 x 坐標(biāo)值。默認(rèn)單位:vp。 |
y | number | 是 | 弧線圓心的 y 坐標(biāo)值。默認(rèn)單位:vp。 |
radius | number | 是 | 弧線的圓半徑。默認(rèn)單位:vp。 |
startAngle | number | 是 | 弧線的起始弧度。單位:弧度 |
endAngle | number | 是 | 弧線的終止弧度。單位:弧度 |
counterclockwise | boolean | 否 | 是否逆時針繪制圓弧。true:逆時針方向繪制橢圓。false:順時針方向繪制橢圓。默認(rèn)值:false。 |
這里需要注意的是 arc 使用的單位是弧度不是角度
一圈 = 360角度 = 2 * Math.PI
半圈 = 180角度 = Math.PI ≈ 3.14
觀察以下效果
100,75 是圓心坐標(biāo)
50 是半徑
0 是開始的弧度
6.28 ≈ 2 * Math.PI = 一圈
arc 是從正右方向開始旋轉(zhuǎn)的。
this.context.beginPath();
this.context.arc(100, 75, 50, 0, 3.14 / 2);
this.context.stroke();
arcTo
arcTo(x1: number, y1: number, x2: number, y2: number, radius: number)
參數(shù)名 | 類型 | 必填 | 說明 |
---|---|---|---|
x1 | number | 是 | 第一個控制點的 x 坐標(biāo)值。默認(rèn)單位:vp。 |
y1 | number | 是 | 第一個控制點的 y 坐標(biāo)值。默認(rèn)單位:vp。 |
x2 | number | 是 | 第二個控制點的 x 坐標(biāo)值。默認(rèn)單位:vp。 |
y2 | number | 是 | 第二個控制點的 y 坐標(biāo)值。默認(rèn)單位:vp。 |
radius | number | 是 | 圓弧的圓半徑值。默認(rèn)單位:vp。 |
this.context.beginPath();
this.context.strokeStyle = "#000000";
this.context.lineWidth = 3;
this.context.moveTo(360, 20);
this.context.arcTo(360, 170, 110, 170, 150);
this.context.stroke();
輔助理解
想象一下,我們有一個起點(即當(dāng)前路徑的最后一個點),然后有三個更多的點:兩個控制點 (x1, y1) 和 (x2, y2),以及由 radius
定義的一個圓心。arcTo
會創(chuàng)建一條從起點到第二個控制點 (x2, y2) 的圓弧,這條圓弧是位于以 radius
為半徑的圓周上的一部
分。該圓弧會在起點和第一個控制點 (x1, y1) 之間形成一個切線,并且也會在第二個控制點 (x2, y2) 和圓弧的終點之間形成一個切線。
文本
- strokeText表示描邊的圖形
- fillText 表示填充的圖形,還有其他 fill ,fillRect等也表示填充。
strokeText
this.context.font = '55px sans-serif'
this.context.strokeText("Hello World!", 20, 60)
fillText
this.context.font = '55px sans-serif'
this.context.fillText("Hello World!", 20, 60)
圖像
drawImage可以把圖像描繪到畫布上,很多的在線圖形合成效果都可以利用該功能實現(xiàn)
drawImage(image: ImageBitmap | PixelMap, dx: number, dy: number): void
drawImage(image: ImageBitmap | PixelMap, dx: number, dy: number, dw: number, dh: number): void
drawImage(image: ImageBitmap | PixelMap, sx: number, sy: number, sw: number, sh: number, dx: number, dy: number, dw: number, dh: number): void
參數(shù)名 | 類型 | 必填 | 說明 |
---|---|---|---|
image | ImageBitmap或PixelMap | 是 | 圖片資源,請參考 ImageBitmap 或 PixelMap。 |
sx | number | 是 | 裁切源圖像時距離源圖像左上角的 x 坐標(biāo)值。image 類型為 ImageBitmap 時,默認(rèn)單位:vp。image 類型為 PixelMap 時,單位:px。 |
sy | number | 是 | 裁切源圖像時距離源圖像左上角的 y 坐標(biāo)值。image 類型為 ImageBitmap 時,默認(rèn)單位:vp。image 類型為 PixelMap 時,單位:px。 |
sw | number | 是 | 裁切源圖像時需要裁切的寬度。image 類型為 ImageBitmap 時,默認(rèn)單位:vp。image 類型為 PixelMap 時,單位:px。 |
sh | number | 是 | 裁切源圖像時需要裁切的高度。image 類型為 ImageBitmap 時,默認(rèn)單位:vp。image 類型為 PixelMap 時,單位:px。 |
dx | number | 是 | 繪制區(qū)域左上角在 x 軸的位置。默認(rèn)單位:vp。 |
dy | number | 是 | 繪制區(qū)域左上角在 y 軸的位置。默認(rèn)單位:vp。 |
dw | number | 是 | 繪制區(qū)域的寬度。當(dāng)繪制區(qū)域的寬度和裁剪圖像的寬度不一致時,將圖像寬度拉伸或壓縮為繪制區(qū)域的寬度。默認(rèn)單位:vp。 |
dh | number | 是 | 繪制區(qū)域的高度。當(dāng)繪制區(qū)域的高度和裁剪圖像的高度不一致時,將圖像高度拉伸或壓縮為繪制區(qū)域的高度。默認(rèn)單位:vp。 |
@Entry
@Component
struct Index {
private settings: RenderingContextSettings = new RenderingContextSettings(true)
private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
private img: ImageBitmap = new ImageBitmap("/images/example.jpg")
build() {
Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
Canvas(this.context)
.width('100%')
.height('100%')
.backgroundColor('#ffff00')
.onReady(() = > {
this.context.drawImage(this.img, 0, 0)
this.context.drawImage(this.img, 0, 150, 300, 100)
this.context.drawImage(this.img, 0, 0, 500, 500, 0, 300, 400, 200)
})
}
.width('100%')
.height('100%')
}
}
canvas 淺嘗動態(tài)效果 1
const width = px2vp(display.getDefaultDisplaySync().availableWidth) * 0.9;
const height = width;
let x = 0;
let y = 0;
setInterval(() = > {
this.context.strokeRect(x, y, 100, 100);
x++;
y++;
}, 20);
canvas 淺嘗動態(tài)效果 2
const width = px2vp(display.getDefaultDisplaySync().availableWidth) * 0.9;
const height = width;
let x = 0;
let y = 0;
setInterval(() = > {
// 清理畫布
this.context.strokeRect(x, y, 100, 100);
x++;
y++;
}, 20);
canvas 屬性 一覽
名稱 | 說明 |
---|---|
fillStyle | 設(shè)置繪制的填充色,支持多種類型及對應(yīng)創(chuàng)建方式,有默認(rèn)值。 |
lineWidth | 設(shè)置繪制線條的寬度,有默認(rèn)值及取值限制。 |
strokeStyle | 設(shè)置線條的顏色,支持多種類型及對應(yīng)創(chuàng)建方式,有默認(rèn)值。 |
lineCap | 指定線端點的樣式,有可選值及默認(rèn)值。 |
lineJoin | 指定線段間相交的交點樣式,有可選值及默認(rèn)值。 |
miterLimit | 設(shè)置斜接面限制值,有默認(rèn)值及取值限制。 |
font | 設(shè)置文本繪制中的字體樣式,包含多種可選參數(shù)及默認(rèn)值。 |
textAlign | 設(shè)置文本繪制中的文本對齊方式,有可選值及默認(rèn)值。 |
textBaseline | 設(shè)置文本繪制中的水平對齊方式,有可選值及默認(rèn)值。 |
globalAlpha | 設(shè)置透明度,有默認(rèn)值。 |
lineDashOffset | 設(shè)置畫布的虛線偏移量,有默認(rèn)值。 |
globalCompositeOperation | 設(shè)置合成操作的方式,有可選值及默認(rèn)值。 |
shadowBlur | 設(shè)置繪制陰影時的模糊級別,有默認(rèn)值及取值限制。 |
shadowColor | 設(shè)置繪制陰影時的陰影顏色,有默認(rèn)值。 |
shadowOffsetX | 設(shè)置繪制陰影時和原有對象的水平偏移值,有默認(rèn)值。 |
shadowOffsetY | 設(shè)置繪制陰影時和原有對象的垂直偏移值,有默認(rèn)值。 |
imageSmoothingEnabled | 設(shè)置繪制圖片時是否進行圖像平滑度調(diào)整,有默認(rèn)值。 |
height | 表示組件高度,有默認(rèn)單位。 |
width | 表示組件寬度,有默認(rèn)單位。 |
imageSmoothingQuality | 設(shè)置圖像平滑度,有默認(rèn)值。 |
direction | 設(shè)置繪制文字時使用的文字方向,有默認(rèn)值。 |
filter | 設(shè)置圖像的濾鏡,支持多種濾鏡效果,有默認(rèn)值。 |
canvas | 獲取和 CanvasRenderingContext2D 關(guān)聯(lián)的 Canvas 組件的 FrameNode 實例,可監(jiān)聽可見狀態(tài),默認(rèn)值為 null。 |
canvas 方法 一覽
名稱 | 說明 |
---|---|
fillRect | 推測用于進行圖形填充相關(guān)操作(通常是填充矩形區(qū)域) |
strokeRect | 推測用于繪制矩形邊框相關(guān)操作(通常是繪制矩形的輪廓) |
clearRect | 推測用于清除指定矩形區(qū)域的內(nèi)容 |
fillText | 推測用于對文本進行填充操作(比如設(shè)置文本填充顏色等相關(guān)樣式填充) |
strokeText | 推測用于繪制文本的輪廓相關(guān)操作 |
measureText | 推測用于測量文本相關(guān)的尺寸等屬性 |
stroke | 一般用于繪制圖形的輪廓、線條等(按常規(guī)語義理解) |
beginPath | 通常用于開始定義一個新的路徑,后續(xù)可基于此路徑進行圖形繪制等操作 |
moveTo | 常用來將畫筆移動到指定坐標(biāo)位置,作為繪制路徑的起始點等操作 |
lineTo | 一般用于從當(dāng)前畫筆位置繪制直線到指定坐標(biāo)位置,構(gòu)建路徑內(nèi)容 |
closePath | 通常用于閉合當(dāng)前正在繪制的路徑,使路徑形成封閉圖形 |
createPattern | 可能用于創(chuàng)建某種圖案(比如重復(fù)平鋪的圖案等)用于繪制等 |
bezierCurveTo | 大概率用于繪制貝塞爾曲線,通過控制點來定義曲線形狀 |
quadraticCurveTo | 推測用于繪制二次貝塞爾曲線,指定控制點來確定曲線走向 |
arc | 一般用于繪制圓弧,通過圓心、半徑、起始角度、結(jié)束角度等參數(shù)來定義 |
arcTo | 常用來繪制與兩條切線相切的圓弧,按給定條件確定圓弧形狀 |
ellipse | 用于繪制橢圓圖形,需指定相關(guān)參數(shù)如圓心坐標(biāo)、長半軸、短半軸等 |
rect | 可用于繪制矩形,指定矩形的左上角坐標(biāo)、寬度、高度等參數(shù) |
fill | 用于對已繪制的圖形或者指定區(qū)域進行填充操作 |
clip | 可能用于設(shè)置裁剪區(qū)域,后續(xù)繪制內(nèi)容只在裁剪區(qū)域內(nèi)顯示 |
reset12+ | 從名稱看可能是在特定版本(12+)中用于重置某些狀態(tài)或設(shè)置的操作 |
saveLayer12+ | 在特定版本(12+)里可能用于保存圖層相關(guān)狀態(tài)等操作 |
restoreLayer12+ | 在特定版本(12+)里對應(yīng)于之前保存圖層狀態(tài)進行恢復(fù)的操作 |
resetTransform | 推測用于重置圖形變換相關(guān)的設(shè)置(比如旋轉(zhuǎn)、縮放等變換) |
rotate | 用于將圖形進行旋轉(zhuǎn)操作,需指定旋轉(zhuǎn)角度等參數(shù) |
scale | 用于對圖形進行縮放操作,指定橫向和縱向的縮放比例 |
transform | 一般用于對圖形進行多種變換(如平移、旋轉(zhuǎn)、縮放等組合變換)的設(shè)置 |
setTransform | 可能用于設(shè)置圖形的變換矩陣,來確定圖形的變換情況 |
getTransform | 推測用于獲取當(dāng)前圖形的變換相關(guān)信息(比如變換矩陣等) |
translate | 用于將圖形進行平移操作,指定在橫、縱坐標(biāo)方向平移的距離 |
drawImage | 通常用于在畫布上繪制圖像,指定圖像源及繪制位置等參數(shù) |
createImageData | 可能用于創(chuàng)建圖像數(shù)據(jù)對象(比如像素數(shù)據(jù)等相關(guān)內(nèi)容) |
getPixelMap | 推測用于獲取像素映射相關(guān)的數(shù)據(jù)(比如圖像像素的分布等情況) |
setPixelMap | 大概是用于設(shè)置像素映射相關(guān)數(shù)據(jù),改變圖像像素表現(xiàn)等 |
getImageData | 一般用于獲取圖像的像素數(shù)據(jù)等具體信息內(nèi)容 |
putImageData | 通常是將獲取到的圖像數(shù)據(jù)(如像素數(shù)據(jù))重新應(yīng)用到畫布等位置 |
setLineDash | 可能用于設(shè)置線條的虛線樣式,指定虛線的長度、間隔等參數(shù) |
getLineDash | 推測用于獲取當(dāng)前線條所設(shè)置的虛線樣式相關(guān)參數(shù) |
transferFromImageBitmap | 從名稱看可能是與從圖像位圖進行數(shù)據(jù)轉(zhuǎn)移相關(guān)操作 |
toDataURL | 通常用于將畫布等內(nèi)容轉(zhuǎn)換為可以表示圖像數(shù)據(jù)的 URL 格式 |
restore | 一般用于恢復(fù)之前保存的某些狀態(tài)(如畫布狀態(tài)等) |
save | 常用來保存當(dāng)前畫布等相關(guān)的狀態(tài),以便后續(xù)恢復(fù)使用 |
createLinearGradient | 用于創(chuàng)建線性漸變對象,可用于圖形的漸變填充等操作 |
createRadialGradient | 用于創(chuàng)建徑向漸變對象,定義從中心向外擴散的漸變效果 |
createConicGradient | 用于創(chuàng)建圓錐漸變對象,實現(xiàn)類似圓錐形狀的漸變效果 |
總結(jié)
這篇文章主要是介紹了元服務(wù)的創(chuàng)建和基本 canvas 的使用
如果你興趣想要了解更多的鴻蒙應(yīng)用開發(fā)細(xì)節(jié)和最新資訊,歡迎在評論區(qū)留言或者私信或者看我個人信息,可以加入技術(shù)交流群。
審核編輯 黃宇
-
AGC
+關(guān)注
關(guān)注
0文章
166瀏覽量
52247 -
Canvas
+關(guān)注
關(guān)注
0文章
20瀏覽量
11143 -
鴻蒙
+關(guān)注
關(guān)注
57文章
2469瀏覽量
43642
發(fā)布評論請先 登錄
相關(guān)推薦
labview五子棋程序
用Verilog寫的一個五子棋
Delphi教程_使用DrawGrid控件制作五子棋
基于LabVIEW的五子棋博弈算法
鴻蒙元服務(wù)實戰(zhàn)-笑笑五子棋(1)

評論