一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙元服務(wù)實戰(zhàn)-笑笑五子棋(2)

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

鴻蒙元服務(wù)實戰(zhàn)-笑笑五子棋(2)

章節(jié)導(dǎo)讀

本章節(jié)主要講解如何創(chuàng)建元服務(wù)和使用 canvas 描繪圖形

目標(biāo)

img

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

  1. ArkTS API 12
  2. Canvas
  3. 元服務(wù)獨有的 AtomicServiceTabs
  4. 卡片開發(fā)
  5. 元服務(wù)的創(chuàng)建
  6. 元服務(wù)的上架

那么本章節(jié)就開始實現(xiàn)這個案例。

AGC 平臺上創(chuàng)建元服務(wù)

需要先在AGC平臺上項目,然后再新建元服務(wù)。一個項目可以對應(yīng)多個元服務(wù)。

image-20250104215412454

DevEco Studio 創(chuàng)建元服務(wù)工程

AGC 平臺上創(chuàng)建好了項目,我們可以在本地創(chuàng)建元服務(wù)。

  1. 新建元服務(wù)

image-20250104215538468


  1. 選擇 笑笑五子棋

image-20250104215654355

  1. 選擇工程位置

image-20250104215718600

  1. 元服務(wù)創(chuàng)建成功
    image-20250104220153486

Canvas 入門

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

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

基本使用

canvas 的基本使用分為 4 步:

  1. 設(shè)置是否抗鋸齒抗鋸齒(Anti - aliasing)是一種在數(shù)字圖形處理中使用的技術(shù),主要用于減少圖像中因為像素有限而產(chǎn)生的鋸齒狀邊緣的現(xiàn)象
  2. 創(chuàng)建畫布上下文
  3. 渲染畫布組件
  4. 在畫布上描繪圖案
@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)
  }
}
  1. 效果

image-20250104222001043

canvas 常見用法

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

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

通過以上過程實現(xiàn)動畫效果

image-20250104223622772

canvas 的坐標(biāo)系

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

image-20250104224722034

描繪圖形

canvas 中內(nèi)置的常見的描繪圖形的方法有以下:

  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);
//   自動閉環(huán)
this.context.closePath();
//   開始描述 將路徑的當(dāng)前點移回到路徑的起點,當(dāng)前點到起點間畫一條直線
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)

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

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

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

觀察以下效果

image-20250104230514600

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

image-20250104230945457

arcTo

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

參數(shù)名類型必填說明
x1number第一個控制點的 x 坐標(biāo)值。默認(rèn)單位:vp。
y1number第一個控制點的 y 坐標(biāo)值。默認(rèn)單位:vp。
x2number第二個控制點的 x 坐標(biāo)值。默認(rèn)單位:vp。
y2number第二個控制點的 y 坐標(biāo)值。默認(rèn)單位:vp。
radiusnumber圓弧的圓半徑值。默認(rèn)單位: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();

輔助理解

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

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

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

image-20250104234845265

文本

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

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可以把圖像描繪到畫布上,很多的在線圖形合成效果都可以利用該功能實現(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ù)名類型必填說明
imageImageBitmapPixelMap圖片資源,請參考 ImageBitmap 或 PixelMap。
sxnumber裁切源圖像時距離源圖像左上角的 x 坐標(biāo)值。image 類型為 ImageBitmap 時,默認(rèn)單位:vp。image 類型為 PixelMap 時,單位:px。
synumber裁切源圖像時距離源圖像左上角的 y 坐標(biāo)值。image 類型為 ImageBitmap 時,默認(rèn)單位:vp。image 類型為 PixelMap 時,單位:px。
swnumber裁切源圖像時需要裁切的寬度。image 類型為 ImageBitmap 時,默認(rèn)單位:vp。image 類型為 PixelMap 時,單位:px。
shnumber裁切源圖像時需要裁切的高度。image 類型為 ImageBitmap 時,默認(rèn)單位:vp。image 類型為 PixelMap 時,單位:px。
dxnumber繪制區(qū)域左上角在 x 軸的位置。默認(rèn)單位:vp。
dynumber繪制區(qū)域左上角在 y 軸的位置。默認(rèn)單位:vp。
dwnumber繪制區(qū)域的寬度。當(dāng)繪制區(qū)域的寬度和裁剪圖像的寬度不一致時,將圖像寬度拉伸或壓縮為繪制區(qū)域的寬度。默認(rèn)單位:vp。
dhnumber繪制區(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%')
  }
}

image-20250105000141244

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

PixPin_2025-01-05_00-07-08

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

PixPin_2025-01-05_00-08-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ù)交流群。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • AGC
    AGC
    +關(guān)注

    關(guān)注

    0

    文章

    166

    瀏覽量

    52247
  • Canvas
    +關(guān)注

    關(guān)注

    0

    文章

    20

    瀏覽量

    11143
  • 鴻蒙
    +關(guān)注

    關(guān)注

    57

    文章

    2469

    瀏覽量

    43642
收藏 人收藏

    評論

    相關(guān)推薦

    labview五子棋程序

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

    五子棋的棋盤怎么么做

    做課程設(shè)計,五子棋的棋盤怎么做
    發(fā)表于 07-02 23:18

    五子棋主程序前面板怎么設(shè)計

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

    用Verilog寫的一個五子棋

    在期末EDA課答辯之際寫了一個五子棋的代碼,主要用到了VGA和PS2接口的外設(shè),因為在自己敲的時候來網(wǎng)上找過,沒找到有關(guān)的資料,所以自己寫好之后就想發(fā)上來和大家討論下?;緦崿F(xiàn)了雙人對戰(zhàn)五子棋的功能。感覺有很多紕漏,想請大家指點
    發(fā)表于 06-15 14:40

    五子棋

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

    五子棋

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

    labview 虛擬五子棋

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

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

    五子棋游戲應(yīng)達(dá)到幾方面的要求?怎樣去設(shè)計一種人機對弈五子棋程序?
    發(fā)表于 09-29 07:26

    五子棋程序源代碼-Matlab實現(xiàn)

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

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

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

    C語言五子棋

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

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

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

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

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

    基于LabVIEW的五子棋博弈算法

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

    鴻蒙服務(wù)實戰(zhàn)-笑笑五子棋(1)

    鴻蒙服務(wù)實戰(zhàn)-笑笑五子棋(1) 前言 作為鴻蒙應(yīng)用的深度開發(fā)者都應(yīng)該知道,經(jīng)歷了 波瀾壯闊 1
    的頭像 發(fā)表于 03-31 09:23 ?184次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>元</b><b class='flag-5'>服務(wù)實戰(zhàn)</b>-<b class='flag-5'>笑笑</b><b class='flag-5'>五子棋</b>(1)