在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

鴻蒙元服務實戰-笑笑五子棋(2)

萬少 ? 來源:jf_22972444 ? 作者:jf_22972444 ? 2025-03-31 09:20 ? 次閱讀

鴻蒙元服務實戰-笑笑五子棋(2)

章節導讀

本章節主要講解如何創建元服務和使用 canvas 描繪圖形

目標

img

上一章最后講到了 笑笑五子棋 主要的技術棧如下:

  1. ArkTS API 12
  2. Canvas
  3. 元服務獨有的 AtomicServiceTabs
  4. 卡片開發
  5. 元服務的創建
  6. 元服務的上架

那么本章節就開始實現這個案例。

AGC 平臺上創建元服務

需要先在AGC平臺上項目,然后再新建元服務。一個項目可以對應多個元服務。

image-20250104215412454

DevEco Studio 創建元服務工程

AGC 平臺上創建好了項目,我們可以在本地創建元服務。

  1. 新建元服務

image-20250104215538468


  1. 選擇 笑笑五子棋

image-20250104215654355

  1. 選擇工程位置

image-20250104215718600

  1. 元服務創建成功
    image-20250104220153486

Canvas 入門

Canvas提供畫布組件,用于自定義繪制圖形,開發者使用 CanvasRenderingContext2D 對象和 OffscreenCanvasRenderingContext2D

對象在 Canvas 組件上進行繪制,繪制對象可以是基礎形狀、文本、圖片等。

基本使用

canvas 的基本使用分為 4 步:

  1. 設置是否抗鋸齒抗鋸齒(Anti - aliasing)是一種在數字圖形處理中使用的技術,主要用于減少圖像中因為像素有限而產生的鋸齒狀邊緣的現象
  2. 創建畫布上下文
  3. 渲染畫布組件
  4. 在畫布上描繪圖案
@Entry
@Component
struct Index {
  // 1 用來配置CanvasRenderingContext2D對象的參數,包括是否開啟抗鋸齒,true表明開啟抗鋸齒。
  private settings: RenderingContextSettings = new RenderingContextSettings(true)
  // 2 用來創建CanvasRenderingContext2D對象,通過在canvas中調用CanvasRenderingContext2D對象來繪制。
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)

  build() {
      // 3 在canvas中調用CanvasRenderingContext2D對象。
    Column(){
      Canvas(this.context)
        .width('100%')
        .height('100%')
        .backgroundColor('#F5DC62')
        .onReady(() = > {
          // 4 可以在這里繪制內容。
          this.context.strokeRect(50, 50, 200, 150);
        })
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
  }
}
  1. 效果

image-20250104222001043

canvas 常見用法

canvas 的核心思想是將想要的圖形如,直線、圓圈、矩形等圖形描繪到畫布上。如果想要呈現出比較酷炫的效果,做法是:

  1. 描繪圖形
  2. 擦除畫布
  3. 計算數值-重新描繪圖形
  4. 擦除畫布
  5. 。。。

通過以上過程實現動畫效果

image-20250104223622772

canvas 的坐標系

在 canvas 中畫圖形都是基于坐標系來進行的。 左上角為起點。

image-20250104224722034

描繪圖形

canvas 中內置的常見的描繪圖形的方法有以下:

  1. 直線
  2. 矩形
  3. 弧形
  4. 文本
  5. 圖像
  6. ...

直線

描繪直線可以使用:

  1. 定起點 moveTo
  2. 定終點 lineTo
  3. 開始描繪 stroke
this.context.moveTo(10, 10);
this.context.lineTo(100, 100);
this.context.stroke();

image-20250104224216771

矩形

可以使用直線lineTo自己畫成一個矩形。也可以直接使用 strokeRect直接生成矩形

lineTo 畫矩形

this.context.moveTo(10, 10);
this.context.lineTo(300, 10);
this.context.lineTo(300, 300);
this.context.lineTo(10, 300);
//   自動閉環
this.context.closePath();
//   開始描述 將路徑的當前點移回到路徑的起點,當前點到起點間畫一條直線
this.context.stroke();

image-20250104225516822

strokeRect 畫矩形

// this.context.strokeRect(x, y, 寬度, 高度);
this.context.strokeRect(50, 50, 200, 150);

image-20250104225643875

弧形

弧形可以使用 arcarcTo 來描繪

arc

arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, counterclockwise?: boolean)

參數名類型必填說明
xnumber弧線圓心的 x 坐標值。默認單位:vp。
ynumber弧線圓心的 y 坐標值。默認單位:vp。
radiusnumber弧線的圓半徑。默認單位:vp。
startAnglenumber弧線的起始弧度。單位:弧度
endAnglenumber弧線的終止弧度。單位:弧度
counterclockwiseboolean是否逆時針繪制圓弧。true:逆時針方向繪制橢圓。false:順時針方向繪制橢圓。默認值:false。

這里需要注意的是 arc 使用的單位是弧度不是角度

一圈 = 360角度 =  2 * Math.PI
半圈 = 180角度 =  Math.PI ≈ 3.14

觀察以下效果

image-20250104230514600

100,75 是圓心坐標

50 是半徑

0 是開始的弧度

6.28 ≈ 2 * Math.PI = 一圈


arc 是從正右方向開始旋轉的。

this.context.beginPath();
this.context.arc(100, 75, 50, 0, 3.14 / 2);
this.context.stroke();

image-20250104230945457

arcTo

arcTo(x1: number, y1: number, x2: number, y2: number, radius: number)

參數名類型必填說明
x1number第一個控制點的 x 坐標值。默認單位:vp。
y1number第一個控制點的 y 坐標值。默認單位:vp。
x2number第二個控制點的 x 坐標值。默認單位:vp。
y2number第二個控制點的 y 坐標值。默認單位:vp。
radiusnumber圓弧的圓半徑值。默認單位:vp。

image-20250104235451185

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();

輔助理解

想象一下,我們有一個起點(即當前路徑的最后一個點),然后有三個更多的點:兩個控制點 (x1, y1) 和 (x2, y2),以及由 radius

定義的一個圓心。arcTo 會創建一條從起點到第二個控制點 (x2, y2) 的圓弧,這條圓弧是位于以 radius 為半徑的圓周上的一部

分。該圓弧會在起點和第一個控制點 (x1, y1) 之間形成一個切線,并且也會在第二個控制點 (x2, y2) 和圓弧的終點之間形成一個切線。

image-20250104234845265

文本

  1. strokeText表示描邊的圖形
  2. fillText 表示填充的圖形,還有其他 fillfillRect等也表示填充。

strokeText

this.context.font = '55px sans-serif'
  this.context.strokeText("Hello World!", 20, 60)

image-20250104235533508

fillText

this.context.font = '55px sans-serif'
this.context.fillText("Hello World!", 20, 60)

image-20250104235642059

圖像

drawImage可以把圖像描繪到畫布上,很多的在線圖形合成效果都可以利用該功能實現

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

參數名類型必填說明
imageImageBitmapPixelMap圖片資源,請參考 ImageBitmap 或 PixelMap。
sxnumber裁切源圖像時距離源圖像左上角的 x 坐標值。image 類型為 ImageBitmap 時,默認單位:vp。image 類型為 PixelMap 時,單位:px。
synumber裁切源圖像時距離源圖像左上角的 y 坐標值。image 類型為 ImageBitmap 時,默認單位:vp。image 類型為 PixelMap 時,單位:px。
swnumber裁切源圖像時需要裁切的寬度。image 類型為 ImageBitmap 時,默認單位:vp。image 類型為 PixelMap 時,單位:px。
shnumber裁切源圖像時需要裁切的高度。image 類型為 ImageBitmap 時,默認單位:vp。image 類型為 PixelMap 時,單位:px。
dxnumber繪制區域左上角在 x 軸的位置。默認單位:vp。
dynumber繪制區域左上角在 y 軸的位置。默認單位:vp。
dwnumber繪制區域的寬度。當繪制區域的寬度和裁剪圖像的寬度不一致時,將圖像寬度拉伸或壓縮為繪制區域的寬度。默認單位:vp。
dhnumber繪制區域的高度。當繪制區域的高度和裁剪圖像的高度不一致時,將圖像高度拉伸或壓縮為繪制區域的高度。默認單位: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%')
  }
}

image-20250105000141244

canvas 淺嘗動態效果 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);

PixPin_2025-01-05_00-07-08

canvas 淺嘗動態效果 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);

PixPin_2025-01-05_00-08-20

canvas 屬性 一覽

名稱說明
fillStyle設置繪制的填充色,支持多種類型及對應創建方式,有默認值。
lineWidth設置繪制線條的寬度,有默認值及取值限制。
strokeStyle設置線條的顏色,支持多種類型及對應創建方式,有默認值。
lineCap指定線端點的樣式,有可選值及默認值。
lineJoin指定線段間相交的交點樣式,有可選值及默認值。
miterLimit設置斜接面限制值,有默認值及取值限制。
font設置文本繪制中的字體樣式,包含多種可選參數及默認值。
textAlign設置文本繪制中的文本對齊方式,有可選值及默認值。
textBaseline設置文本繪制中的水平對齊方式,有可選值及默認值。
globalAlpha設置透明度,有默認值。
lineDashOffset設置畫布的虛線偏移量,有默認值。
globalCompositeOperation設置合成操作的方式,有可選值及默認值。
shadowBlur設置繪制陰影時的模糊級別,有默認值及取值限制。
shadowColor設置繪制陰影時的陰影顏色,有默認值。
shadowOffsetX設置繪制陰影時和原有對象的水平偏移值,有默認值。
shadowOffsetY設置繪制陰影時和原有對象的垂直偏移值,有默認值。
imageSmoothingEnabled設置繪制圖片時是否進行圖像平滑度調整,有默認值。
height表示組件高度,有默認單位。
width表示組件寬度,有默認單位。
imageSmoothingQuality設置圖像平滑度,有默認值。
direction設置繪制文字時使用的文字方向,有默認值。
filter設置圖像的濾鏡,支持多種濾鏡效果,有默認值。
canvas獲取和 CanvasRenderingContext2D 關聯的 Canvas 組件的 FrameNode 實例,可監聽可見狀態,默認值為 null。

canvas 方法 一覽

名稱說明
fillRect推測用于進行圖形填充相關操作(通常是填充矩形區域)
strokeRect推測用于繪制矩形邊框相關操作(通常是繪制矩形的輪廓)
clearRect推測用于清除指定矩形區域的內容
fillText推測用于對文本進行填充操作(比如設置文本填充顏色等相關樣式填充)
strokeText推測用于繪制文本的輪廓相關操作
measureText推測用于測量文本相關的尺寸等屬性
stroke一般用于繪制圖形的輪廓、線條等(按常規語義理解)
beginPath通常用于開始定義一個新的路徑,后續可基于此路徑進行圖形繪制等操作
moveTo常用來將畫筆移動到指定坐標位置,作為繪制路徑的起始點等操作
lineTo一般用于從當前畫筆位置繪制直線到指定坐標位置,構建路徑內容
closePath通常用于閉合當前正在繪制的路徑,使路徑形成封閉圖形
createPattern可能用于創建某種圖案(比如重復平鋪的圖案等)用于繪制等
bezierCurveTo大概率用于繪制貝塞爾曲線,通過控制點來定義曲線形狀
quadraticCurveTo推測用于繪制二次貝塞爾曲線,指定控制點來確定曲線走向
arc一般用于繪制圓弧,通過圓心、半徑、起始角度、結束角度等參數來定義
arcTo常用來繪制與兩條切線相切的圓弧,按給定條件確定圓弧形狀
ellipse用于繪制橢圓圖形,需指定相關參數如圓心坐標、長半軸、短半軸等
rect可用于繪制矩形,指定矩形的左上角坐標、寬度、高度等參數
fill用于對已繪制的圖形或者指定區域進行填充操作
clip可能用于設置裁剪區域,后續繪制內容只在裁剪區域內顯示
reset12+從名稱看可能是在特定版本(12+)中用于重置某些狀態或設置的操作
saveLayer12+在特定版本(12+)里可能用于保存圖層相關狀態等操作
restoreLayer12+在特定版本(12+)里對應于之前保存圖層狀態進行恢復的操作
resetTransform推測用于重置圖形變換相關的設置(比如旋轉、縮放等變換)
rotate用于將圖形進行旋轉操作,需指定旋轉角度等參數
scale用于對圖形進行縮放操作,指定橫向和縱向的縮放比例
transform一般用于對圖形進行多種變換(如平移、旋轉、縮放等組合變換)的設置
setTransform可能用于設置圖形的變換矩陣,來確定圖形的變換情況
getTransform推測用于獲取當前圖形的變換相關信息(比如變換矩陣等)
translate用于將圖形進行平移操作,指定在橫、縱坐標方向平移的距離
drawImage通常用于在畫布上繪制圖像,指定圖像源及繪制位置等參數
createImageData可能用于創建圖像數據對象(比如像素數據等相關內容)
getPixelMap推測用于獲取像素映射相關的數據(比如圖像像素的分布等情況)
setPixelMap大概是用于設置像素映射相關數據,改變圖像像素表現等
getImageData一般用于獲取圖像的像素數據等具體信息內容
putImageData通常是將獲取到的圖像數據(如像素數據)重新應用到畫布等位置
setLineDash可能用于設置線條的虛線樣式,指定虛線的長度、間隔等參數
getLineDash推測用于獲取當前線條所設置的虛線樣式相關參數
transferFromImageBitmap從名稱看可能是與從圖像位圖進行數據轉移相關操作
toDataURL通常用于將畫布等內容轉換為可以表示圖像數據的 URL 格式
restore一般用于恢復之前保存的某些狀態(如畫布狀態等)
save常用來保存當前畫布等相關的狀態,以便后續恢復使用
createLinearGradient用于創建線性漸變對象,可用于圖形的漸變填充等操作
createRadialGradient用于創建徑向漸變對象,定義從中心向外擴散的漸變效果
createConicGradient用于創建圓錐漸變對象,實現類似圓錐形狀的漸變效果

總結

這篇文章主要是介紹了元服務的創建和基本 canvas 的使用

如果你興趣想要了解更多的鴻蒙應用開發細節和最新資訊,歡迎在評論區留言或者私信或者看我個人信息,可以加入技術交流群。

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • AGC
    AGC
    +關注

    關注

    0

    文章

    164

    瀏覽量

    52083
  • Canvas
    +關注

    關注

    0

    文章

    20

    瀏覽量

    11105
  • 鴻蒙
    +關注

    關注

    57

    文章

    2457

    瀏覽量

    43447
收藏 人收藏

    評論

    相關推薦

    labview五子棋程序

    本帖最后由 桂花酒 于 2012-6-10 13:43 編輯 labview五子棋程序,想用的可以看看!本來是發的求助帖,找五子棋程序,不過剛才下了一個,鑒于論壇上現在已經搜不著了(我原來下過,不過刪了)一起學習!
    發表于 06-10 13:16

    五子棋的棋盤怎么么做

    做課程設計,五子棋的棋盤怎么做
    發表于 07-02 23:18

    五子棋主程序前面板怎么設計

    五子棋主程序前面板怎么設計?后面版有程序了
    發表于 07-03 16:39

    用Verilog寫的一個五子棋

    在期末EDA課答辯之際寫了一個五子棋的代碼,主要用到了VGA和PS2接口的外設,因為在自己敲的時候來網上找過,沒找到有關的資料,所以自己寫好之后就想發上來和大家討論下。基本實現了雙人對戰五子棋的功能。感覺有很多紕漏,想請大家指點
    發表于 06-15 14:40

    五子棋

    求一個五子棋的程序
    發表于 06-26 16:09

    五子棋

    自己做的五子棋,說不上有什么難的
    發表于 08-12 21:44

    labview 虛擬五子棋

    `一個簡易的五子棋程序,喜歡的可以借鑒下`
    發表于 06-16 21:57

    怎樣去設計一種人機對弈五子棋程序

    五子棋游戲應達到幾方面的要求?怎樣去設計一種人機對弈五子棋程序?
    發表于 09-29 07:26

    五子棋程序源代碼-Matlab實現

    五子棋程序源代碼-M
    發表于 07-04 16:15 ?50次下載

    用java語言編寫的智能五子棋源程序

    用java語言編寫的智能五子棋源程序
    發表于 10-30 10:31 ?98次下載
    用java語言編寫的智能<b class='flag-5'>五子棋</b>源程序

    C語言五子棋

    C語言五子棋,有趣的東西,值得玩玩,不用看著黑框發呆
    發表于 01-12 16:49 ?2次下載

    Delphi教程_使用DrawGrid控件制作五子棋

    Delphi教程使用DrawGrid控件制作五子棋,很好的Delphi的學習資料。
    發表于 03-16 14:55 ?19次下載

    C語言教程之五子棋游戲的問題

    C語言教程之五子棋游戲的問題,很好的C語言資料,快來學習吧。
    發表于 04-25 17:07 ?0次下載

    基于LabVIEW的五子棋博弈算法

    針對目前五子棋人機對弈多數基于電腦、手機,缺少真實環境的問題,提出一種基于LabVIEW的博弈算法,并運用于真實的五子棋人機對弈。首先通過圖像采集系統獲取當前狀態下棋盤及人機雙方棋子的位置信息;然后
    發表于 12-17 11:32 ?29次下載

    鴻蒙服務實戰-笑笑五子棋(1)

    鴻蒙服務實戰-笑笑五子棋(1) 前言 作為鴻蒙應用的深度開發者都應該知道,經歷了 波瀾壯闊 1
    的頭像 發表于 03-31 09:23 ?70次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>元</b><b class='flag-5'>服務實戰</b>-<b class='flag-5'>笑笑</b><b class='flag-5'>五子棋</b>(1)
    主站蜘蛛池模板: 在线播放免费观看 | 色综合激情丁香七月色综合 | 成人免费淫片95视频观看网站 | 四虎在线精品免费高清在线 | 午夜免费r级伦理片 | 久综合网| 国产成人夜间影院在线观看 | 2020年亚洲天天爽天天噜 | 在线视频精品视频 | 国产特黄一级片 | 91av免费观看 | 六月婷婷网视频在线观看 | 久色国产 | 国产热视频 | 色综合色综合色综合色综合网 | 人成电影免费观看在线 | 亚洲网站大全 | 级毛片| 免费视频在线播放 | 91免费视 | 国产精品丝袜在线观看 | 日韩精品一区二区三区免费视频 | 女人被狂躁视频免费网站 | 免费看18污黄 | 丁香午夜婷婷 | 欧美一级视频精品观看 | 成年黄网站免费大全毛片 | 国产精品久久在线 | 热之国产| 五月婷婷 六月丁香 | 欧美日本一区二区三区道 | 国产精品护士 | 亚洲国产成人精品久久 | 日本不卡免费高清一级视频 | 欧美巨波霸乳影院67194 | 亚洲一区二区三区在线视频 | 免费观看成人毛片 | 黄色视屏免费看 | 在线天堂中文在线网 | 久久久久琪琪免费影院 | 色人在线|