自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

從微信小程序到鴻蒙JS開發(fā)-canvas&stack&2048

開發(fā)
文章由鴻蒙社區(qū)產(chǎn)出,想要了解更多內(nèi)容請(qǐng)前往:51CTO和華為官方戰(zhàn)略合作共建的鴻蒙技術(shù)社區(qū)https://harmonyos.51cto.com

[[383190]]

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

春節(jié)在家回看了張榮超老師的“從零開發(fā)鴻蒙小游戲APP“直播課(https://harmonyos.51cto.com/activity/17),聽完后在手機(jī)設(shè)備上完善了功能并實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的2048小游戲。這其中涉及到canvas和stack組件,在此做一些筆記。效果圖:

1、canvas組件

畫布組件,微信小程序也有,可以在其中動(dòng)態(tài)繪制圖形和文字等。在2048游戲中,不同的數(shù)字對(duì)應(yīng)的背景顏色都不同,如果使用動(dòng)態(tài)樣式,判斷和渲染對(duì)性能的要求會(huì)很高。

  1. <canvas class="content" id="canvas" onswipe="swipeGrids"></canvas> 

1.1 獲取繪圖上下文

組件給定id或者ref,即可在js中獲取組件繪圖上下文,通過獲取的CanvasRenderingContext2D對(duì)象進(jìn)行繪圖。官方文檔提及獲取繪圖上下文的操作不支持在onInit和onReady中進(jìn)行調(diào)用,經(jīng)實(shí)驗(yàn)如在onInit()中執(zhí)行應(yīng)用將白屏,在onReady()中執(zhí)行畫布中的內(nèi)容將無法被繪制,故需寫在onShow()中。

  1. // 繪圖對(duì)象 
  2. var canvas; 
  3.  
  4. export default { 
  5.     data: { 
  6.     ... 
  7.     }, 
  8.     onShow() { 
  9.         canvas = this.$element("canvas").getContext("2d"); 
  10.         // 繪圖 
  11.         this.drawGrids(); 
  12.     }, 
  13. ... 

對(duì)于會(huì)在多個(gè)方法之內(nèi)使用的全局變量,可以寫在data中,也可以寫在export之外。對(duì)于無需在頁面中綁定的數(shù)據(jù),寫在export外或許可以提高一點(diǎn)性能。

1.2 監(jiān)聽滑動(dòng)事件

在畫布中滑動(dòng)的事件綁定是通過onswipe屬性,這個(gè)在官方文檔中沒有說明,但是IDE是有提示的。對(duì)于方法的入?yún)?,打日志后看出結(jié)構(gòu)如下:

event.direction有四種取值:up/down/left/right,可用于判斷滑動(dòng)方向。

1.3 繪制矩形

  1. canvas.fillStyle = "#ffffff"

獲取繪圖上下文對(duì)象后,將其fillStyle屬性設(shè)置為十六進(jìn)制顏色即可設(shè)置本次繪圖的顏色。也可使用createLinearGradient()給定漸變色,createPattern()創(chuàng)建填充模版。

  1. canvas.fillRect(leftTopX, leftTopY, gridWidth, gridWidth); 

fillRect()方法用于繪制矩形,四個(gè)參數(shù)分別為左上角X坐標(biāo),左上角Y坐標(biāo),寬度,高度。

1.4 繪制文字

  1. canvas.font = "70px HYQiHei-65S"
  2. canvas.fillStyle = gridTxColors[gridVal]; 

font屬性指定文字的大小和字體,fillStyle指定文字的顏色。

  1. canvas.fillText(text, leftBottomX, leftBottomY); 

fillText()方法用于繪制文字,三個(gè)參數(shù)分別為文字內(nèi)容,左下角X坐標(biāo),左下角Y坐標(biāo)。這里后兩個(gè)參數(shù)是左下角,和微信小程序以及剛才提到的fillRect()不同。

繪制2048格子及文字的方法:

  1. // 繪制格子 grids:存儲(chǔ)數(shù)字的二維數(shù)組; gridBgColors:存儲(chǔ)格子背景色的對(duì)象; gridTxColors:存儲(chǔ)文字顏色的對(duì)象 
  2.     drawGrids() { 
  3.         for (let r = 0; r < 4; r++) { 
  4.             for (let c = 0; c < 4; c++) { 
  5.                 let gridVal = grids[r][c].toString(); 
  6.                 // 繪制背景 
  7.                 canvas.fillStyle = gridBgColors[gridVal]; 
  8.                 let leftTopX = c * (gridWidth + gridMargin) + gridMargin; 
  9.                 let leftTopY = r * (gridWidth + gridMargin) + gridMargin; 
  10.                 // 左上角x 左上角y 寬度 高度 
  11.                 canvas.fillRect(leftTopX, leftTopY, gridWidth, gridWidth); 
  12.                 // 繪制文字 
  13.                 canvas.font = "70px HYQiHei-65S"
  14.                 if (gridVal != "0") { 
  15.                     if (gridVal == "2" || gridVal == "4") { 
  16.                         canvas.fillStyle = gridTxColors[gridVal]; 
  17.                     } else { 
  18.                         canvas.fillStyle = gridTxColors["others"]; 
  19.                     } 
  20.                     let offsetX = (4 - gridVal.length) * (gridWidth / 8); 
  21.                     let offsetY = (gridWidth - fontSize) / 2; 
  22.                     // 文字 左下角x 左下角y 
  23.                     canvas.fillText(gridVal, leftTopX + offsetX, leftTopY + offsetY + fontSize - 5); 
  24.                 } 
  25.             } 
  26.         } 
  27.     }, 

每次數(shù)字改變后,調(diào)用以上方法即可將2048的效果繪制出。

2、stack組件

這個(gè)組件很有意思,在stack中的子元素會(huì)順序入棧,實(shí)現(xiàn)堆疊效果。一般都是通過z-index的樣式實(shí)現(xiàn),而鴻蒙這里的實(shí)現(xiàn)將數(shù)據(jù)結(jié)構(gòu)的棧與頁面層級(jí)相結(jié)合,非常巧妙。

在游戲結(jié)束時(shí),提示文字將覆蓋格子區(qū)域:

  1. <stack class="content"
  2.       <canvas class="content" id="canvas" onswipe="swipeGrids"></canvas> 
  3.       <div show="{{ isEnd }}"
  4.           <text> 
  5.               游戲結(jié)束 
  6.           </text> 
  7.       </div> 
  8.   </stack> 

事實(shí)上,鴻蒙js組件是不支持z-index樣式的。

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責(zé)任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2021-02-23 12:25:26

鴻蒙HarmonyOS應(yīng)用開發(fā)

2021-03-02 09:29:29

鴻蒙HarmonyOS應(yīng)用開發(fā)

2021-02-20 09:52:02

鴻蒙HarmonyOS應(yīng)用開發(fā)

2021-02-22 14:56:55

鴻蒙HarmonyOS應(yīng)用開發(fā)

2021-02-25 10:01:19

鴻蒙HarmonyOS應(yīng)用開發(fā)

2021-02-21 11:09:18

鴻蒙HarmonyOS應(yīng)用開發(fā)

2021-02-23 09:52:42

鴻蒙HarmonyOS應(yīng)用開發(fā)

2021-02-04 13:49:41

鴻蒙HarmonyOS應(yīng)用開發(fā)

2021-02-25 15:13:08

鴻蒙HarmonyOS應(yīng)用開發(fā)

2021-02-05 09:46:16

鴻蒙HarmonyOSjs開發(fā)

2021-02-07 09:17:24

鴻蒙HarmonyOS應(yīng)用開發(fā)

2021-02-24 09:36:03

鴻蒙CSS應(yīng)用開發(fā)

2017-05-08 15:03:07

微信小程序開發(fā)實(shí)戰(zhàn)

2016-09-28 18:10:59

微信程序MINA

2016-09-27 16:38:24

JavaScript微信Web

2016-11-04 10:49:48

微信小程序

2016-09-27 20:36:23

微信HttpWeb

2016-11-04 10:30:17

微信小程序

2018-09-11 10:32:07

云開發(fā)小程序開發(fā)者

2016-11-07 10:30:07

微信小程序安裝配置
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)