成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

基于HarmonyOS ArkUI 3.0 框架的木棉花掃雷(上)

系統 OpenHarmony
本來想做成分布式HarmonyOS ArkUI 3.0木棉花掃雷的,但是苦于沒有相應API版本的分布式模擬器或多臺真機用于調試和運行,只能落得個單機的尷尬實戰了。

[[437923]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

前言

HarmonyOS ArkUI 3.0 框架試玩初體驗二來了||ヽ( ̄▽ ̄)ノミ|Ю,這一次相比上一次的合成1024開發實戰,多了部分內容:顯示動畫、頁面跳轉與數據傳遞、網格容器Grid、自定義窗口等內容。本來想做成分布式HarmonyOS ArkUI 3.0木棉花掃雷的,但是苦于沒有相應API版本的分布式模擬器或多臺真機用于調試和運行,只能落得個單機的尷尬實戰了 ̄□ ̄||

效果圖

【木棉花】基于HarmonyOS ArkUI 3.0 框架的木棉花掃雷(上)-鴻蒙HarmonyOS技術社區

代碼文件結構

【木棉花】基于HarmonyOS ArkUI 3.0 框架的木棉花掃雷(上)-鴻蒙HarmonyOS技術社區

正文

一、創建一個空白的工程

1. 安裝和配置DevEco Studio 3.0

DevEco Studio 3.0下載

DevEco Studio 3.0安裝

2. 創建一個Empty eTS Ability應用

DevEco Studio下載安裝成功后,打開DevEco Studio,點擊左上角的File,點擊New,再選擇New Project,選擇Empty Ability選項,點擊Next按鈕。

【木棉花】基于HarmonyOS ArkUI 3.0 框架的木棉花掃雷(上)-鴻蒙HarmonyOS技術社區

將文件命名為SaoLei(文件名不能出現中文或者特殊字符,否則將無法成功創建項目文件),Project Type勾選Application,選擇保存路徑,Language勾選eTS,選擇API7,設備勾選Phone,最后點擊Finish按鈕。

【木棉花】基于HarmonyOS ArkUI 3.0 框架的木棉花掃雷(上)-鴻蒙HarmonyOS技術社區

3. 準備工作

在entry>src>main>config.json文件中最下方"launchType": "standard"的后面添加以下代碼,這樣就可以實現去掉應用上方的標簽欄了。

config.json最下方部分代碼:

  1. "metaData": { 
  2.       "customizeData": [ 
  3.         { 
  4.           "name""hwc-theme"
  5.           "value""androidhwext:style/Theme.Emui.Light.NoTitleBar"
  6.           "extra""" 
  7.         } 
  8.       ] 
  9.     } 

4. 保存圖片

將圖片保存到entry>src>main>resources>rawfile文件中。

【木棉花】基于HarmonyOS ArkUI 3.0 框架的木棉花掃雷(上)-鴻蒙HarmonyOS技術社區

二、歡迎頁面

1. 更改文件名

在entry>src>ets>default>pages>index.ets文件右鍵,在彈出的菜單欄中選擇Refactor,再在彈出的子菜單欄中選擇Rename,或者按Shift+F6,將文件命名為logo.ets。

【木棉花】基于HarmonyOS ArkUI 3.0 框架的木棉花掃雷(上)-鴻蒙HarmonyOS技術社區

將entry>src>main>config.json文件中"js"項中的"pages"項中的"pages/index"更改為"pages/logo"。

config.json最下方部分代碼:

  1. "js": [ 
  2.       { 
  3.         "mode": { 
  4.           "syntax""ets"
  5.           "type""pageAbility" 
  6.         }, 
  7.         "pages": [ 
  8.           "pages/logo" 
  9.         ], 
  10.         "name""default"
  11.         "window": { 
  12.           "designWidth": 720, 
  13.           "autoDesignWidth"false 
  14.         } 
  15.       } 
  16.     ] 

2. 添加背景

在logo.ets文件中,通過Image($rawfile(‘LOGO.png’))可放置Logo圖片,通過Text(‘木棉花掃雷’)可放置文字內容。

屬性linearGradient為設置漸變顏色,linearGradient中的angle為漸變角度,設置為180,即為從上往下漸變,colors則為漸變的顏色。

logo.ets:

  1. @Entry 
  2. @Component 
  3. struct Logo { 
  4.   build() { 
  5.     Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center, direction: FlexDirection.Column }) { 
  6.       Image($rawfile('LOGO.png')) 
  7.         .objectFit(ImageFit.Contain) 
  8.         .height(300) 
  9.       Text('木棉花掃雷'
  10.         .fontSize(30) 
  11.         .fontColor(Color.White) 
  12.         .margin({ top: 200 }) 
  13.     } 
  14.     .width('100%'
  15.     .height('100%'
  16.     .linearGradient( 
  17.       { 
  18.         angle: 180, 
  19.         colors: [['#D3D7DC', 0.1], ["#B4BED2", 0.6],  ["#A0AAC8", 1]] 
  20.       }) 
  21.   } 

3. 添加動畫效果

這里使用的動畫效果是通過animateTo顯式動畫實現的。animateTo顯式動畫可以設置組件從狀態A到狀態B的變化動畫效果,包括樣式、位置信息和節點的增加刪除等,開發者無需關注變化過程,只需指定起點和終點的狀態。animateTo還提供播放狀態的回調接口,是對屬性動畫的增強與封裝。

添加狀態變量opacityValue和scaleValue并初始化為0,分別用于表示透明度和放縮的倍數,動畫效果中實現這兩個數值從0到1,即可實現Logo的漸出和放大效果。

定義一個貝塞爾曲線cubicBezier,Curves.cubicBezier(0.1, 0.2, 1, 1)。由于需要使用到動畫能力接口中的插值計算,故需要導入curves模塊。@ohos.curves模塊提供了線性Curve. Linear、階梯step、三階貝塞爾(cubicBezier)和彈簧(spring)插值曲線的初始化函數,可以根據入參創建一個插值曲線對象。

在animateTo顯式動畫中,設置動畫時長(duration)為2s,延時(delay)0.1s開始播放,設置顯示動效event的閉包函數(curve),即起點狀態到終點狀態為透明度opacityValue和大小scaleValue從0到1。

logo.ets:

  1. // @ts-nocheck 
  2. import Curves from '@ohos.curves' 
  3.  
  4. @Entry 
  5. @Component 
  6. struct Logo { 
  7.   @State private opacityValue: number = 0 
  8.   @State private scaleValue: number = 0 
  9.   private curve1 = Curves.cubicBezier(0.1, 0.2, 1, 1) 
  10.  
  11.   build() { 
  12.     Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center, direction: FlexDirection.Column }) { 
  13.       Image($rawfile('LOGO.png')) 
  14.         .objectFit(ImageFit.Contain) 
  15.         .height(300) 
  16.         .scale({ x: this.scaleValue, y: this.scaleValue }) 
  17.         .opacity(this.opacityValue) 
  18.         .onAppear(() => { 
  19.           animateTo({ 
  20.             duration: 2000, 
  21.             curve: this.curve1, 
  22.             delay: 100, 
  23.           }, () => { 
  24.             this.opacityValue = 1 
  25.             this.scaleValue = 1 
  26.           }) 
  27.         }) 
  28.       Text('木棉花掃雷'
  29.         .fontSize(30) 
  30.         .fontColor(Color.White) 
  31.         .margin({ top: 200 }) 
  32.     } 
  33.     .width('100%'
  34.     .height('100%'
  35.     .linearGradient( 
  36.       { 
  37.         angle: 180, 
  38.         colors: [['#D3D7DC', 0.1], ["#B4BED2", 0.6],  ["#A0AAC8", 1]] 
  39.       }) 
  40.   } 

4. 添加跳轉效果

先創建一個mainpage.ets文件。

在animateTo顯示動畫播放結束的onFinish回調接口中,調用定時器Timer的setTimeout接口延時1s后,調用router.replace,顯示mainpage.ets頁面。其中同樣需要導入router模塊。

logo.ets:

  1. // @ts-nocheck 
  2. import router from '@system.router' 
  3. import Curves from '@ohos.curves' 
  4.  
  5. @Entry 
  6. @Component 
  7. struct Logo { 
  8.   @State private opacityValue: number = 0 
  9.   @State private scaleValue: number = 0 
  10.   private curve1 = Curves.cubicBezier(0.1, 0.2, 1, 1) 
  11.  
  12.   build() { 
  13.     Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center, direction: FlexDirection.Column }) { 
  14.       Image($rawfile('LOGO.png')) 
  15.         .objectFit(ImageFit.Contain) 
  16.         .height(300) 
  17.         .scale({ x: this.scaleValue, y: this.scaleValue }) 
  18.         .opacity(this.opacityValue) 
  19.         .onAppear(() => { 
  20.           animateTo({ 
  21.             duration: 2000, 
  22.             curve: this.curve1, 
  23.             delay: 100, 
  24.             onFinish: () => { 
  25.               setTimeout(() => { 
  26.                 router.replace({ uri: "pages/mainpage" }) 
  27.               }, 1000); 
  28.             } 
  29.           }, () => { 
  30.             this.opacityValue = 1 
  31.             this.scaleValue = 1 
  32.           }) 
  33.         }) 
  34.       Text('木棉花掃雷'
  35.         .fontSize(30) 
  36.         .fontColor(Color.White) 
  37.         .margin({ top: 200 }) 
  38.     } 
  39.     .width('100%'
  40.     .height('100%'
  41.     .linearGradient( 
  42.       { 
  43.         angle: 180, 
  44.         colors: [['#D3D7DC', 0.1], ["#B4BED2", 0.6],  ["#A0AAC8", 1]] 
  45.       }) 
  46.   } 

三、主頁頁面

1. 添加背景

游戲頁面的背景和歡迎頁面的背景幾乎一樣,這里就不重復啰嗦了。

mainpage.ets:

  1. @Entry 
  2. @Component 
  3. struct Mainpage { 
  4.   build() { 
  5.     Column() { 
  6.       Image($rawfile('mine.png')) 
  7.         .objectFit(ImageFit.Contain) 
  8.         .height(300) 
  9.         .scale({ x: 0.5, y: 0.5 }) 
  10.         .opacity(0.8) 
  11.     } 
  12.     .width('100%'
  13.     .height('100%'
  14.     .linearGradient( 
  15.       { 
  16.         angle: 180, 
  17.         colors: [['#D3D7DC', 0.1], ["#B4BED2", 0.6],  ["#A0AAC8", 1]] 
  18.       }) 
  19.   } 

2. 添加按鈕

從效果圖可以看出按鈕的樣式是一致的,因此我們可以使用裝飾器@Component自定義按鈕。添加四個變量String、difficulty、Number_row和Number_column,分別用于記錄難度文本、地雷數量、網格的行數和網格的列數。在Button組件中設置圖片和文本的樣式。

在裝飾器@Entry裝飾的組件中,通過調用自定義組件的形式繪制三個按鈕。

mainpage.ets:

  1. @Entry 
  2. @Component 
  3. struct Mainpage { 
  4.   build() { 
  5.     Column() { 
  6.       Image($rawfile('mine.png')) 
  7.         .objectFit(ImageFit.Contain) 
  8.         .height(300) 
  9.         .scale({ x: 0.5, y: 0.5 }) 
  10.         .opacity(0.8) 
  11.  
  12.       setButton({ String: '初級', difficulty: 10, Number_row: 9, Number_column: 9 }); 
  13.       setButton({ String: '中級', difficulty: 30, Number_row: 12, Number_column: 12 }); 
  14.       setButton({ String: '高級', difficulty: 50, Number_row: 16, Number_column: 16 }); 
  15.     } 
  16.     .width('100%'
  17.     .height('100%'
  18.     .linearGradient( 
  19.       { 
  20.         angle: 180, 
  21.         colors: [['#D3D7DC', 0.1], ["#B4BED2", 0.6],  ["#A0AAC8", 1]] 
  22.       }) 
  23.   } 
  24.  
  25. @Component 
  26. struct setButton { 
  27.   private String: string 
  28.   private difficulty: number 
  29.   private Number_row: number 
  30.   private Number_column: number 
  31.  
  32.   build() { 
  33.     Button({ type: ButtonType.Capsule, stateEffect: true }){ 
  34.       Column(){ 
  35.         Text(this.String) 
  36.           .textAlign(TextAlign.Center) 
  37.           .fontSize(30) 
  38.           .fontWeight(600) 
  39.           .fontColor('#0000FF'
  40.           .margin({ top: -5 }) 
  41.         Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center, direction: FlexDirection.Row }) { 
  42.           Text('( ' + this.difficulty.toString() + '個'
  43.             .textAlign(TextAlign.Center) 
  44.             .fontSize(22) 
  45.             .fontWeight(600) 
  46.             .fontColor('#416EBE'
  47.             .margin({ top: -2, right: 5 }) 
  48.           Image($rawfile('mine.png')) 
  49.             .height(26) 
  50.             .width(26) 
  51.           Text(this.Number_row.toString() + '*' + this.Number_column.toString() + ' )'
  52.             .textAlign(TextAlign.Center) 
  53.             .fontSize(22) 
  54.             .fontWeight(600) 
  55.             .fontColor('#416EBE'
  56.             .margin({ left: 5, top: -2}) 
  57.         }.margin({ top: 5 }) 
  58.       } 
  59.     } 
  60.     .width(220) 
  61.     .height(90) 
  62.     .backgroundColor('#F3F7FF'
  63.     .margin({ top: 10 }) 
  64.   } 

3. 響應點擊跳轉事件

先創建一個game.ets文件。

在自定義按鈕組件中添加點擊事件onClick(),調用router.push接口,其中uri為跳轉的頁面,params為攜帶的數據,形式為params: { key: values },在新頁面調用router.getParams().key來獲取到頁面跳轉來時攜帶的key對應的數據,其中同樣需要導入router模塊。

mainpage.ets:

  1. import router from '@system.router' 
  2.  
  3. @Entry 
  4. @Component 
  5. struct Mainpage { 
  6.   build() { 
  7.     Column() { 
  8.       Image($rawfile('mine.png')) 
  9.         .objectFit(ImageFit.Contain) 
  10.         .height(300) 
  11.         .scale({ x: 0.5, y: 0.5 }) 
  12.         .opacity(0.8) 
  13.  
  14.       setButton({ String: '初級', difficulty: 10, Number_row: 9, Number_column: 9 }); 
  15.       setButton({ String: '中級', difficulty: 30, Number_row: 12, Number_column: 12 }); 
  16.       setButton({ String: '高級', difficulty: 50, Number_row: 16, Number_column: 16 }); 
  17.     } 
  18.     .width('100%'
  19.     .height('100%'
  20.     .linearGradient( 
  21.       { 
  22.         angle: 180, 
  23.         colors: [['#D3D7DC', 0.1], ["#B4BED2", 0.6],  ["#A0AAC8", 1]] 
  24.       }) 
  25.   } 
  26.  
  27. @Component 
  28. struct setButton { 
  29.   private String: string 
  30.   private difficulty: number 
  31.   private Number_row: number 
  32.   private Number_column: number 
  33.  
  34.   build() { 
  35.     Button({ type: ButtonType.Capsule, stateEffect: true }){ 
  36.       Column(){ 
  37.         Text(this.String) 
  38.           .textAlign(TextAlign.Center) 
  39.           .fontSize(30) 
  40.           .fontWeight(600) 
  41.           .fontColor('#0000FF'
  42.           .margin({ top: -5 }) 
  43.         Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center, direction: FlexDirection.Row }) { 
  44.           Text('( ' + this.difficulty.toString() + '個'
  45.             .textAlign(TextAlign.Center) 
  46.             .fontSize(22) 
  47.             .fontWeight(600) 
  48.             .fontColor('#416EBE'
  49.             .margin({ top: -2, right: 5 }) 
  50.           Image($rawfile('mine.png')) 
  51.             .height(26) 
  52.             .width(26) 
  53.           Text(this.Number_row.toString() + '*' + this.Number_column.toString() + ' )'
  54.             .textAlign(TextAlign.Center) 
  55.             .fontSize(22) 
  56.             .fontWeight(600) 
  57.             .fontColor('#416EBE'
  58.             .margin({ left: 5, top: -2}) 
  59.         }.margin({ top: 5 }) 
  60.       } 
  61.     } 
  62.     .width(220) 
  63.     .height(90) 
  64.     .backgroundColor('#F3F7FF'
  65.     .margin({ top: 10 }) 
  66.     .onClick(() => { 
  67.       router.push({ 
  68.         uri: 'pages/game'
  69.         params: { difficulty: this.difficulty, Number_row: this.Number_row ,Number_column: this.Number_column } 
  70.       }) 
  71.     }) 
  72.   } 

 至此,歡迎頁面和主頁面都已經全部完成了,在基于HarmonyOS ArkUI 3.0 框架的木棉花掃雷(下)將會繼續分享游戲頁面的實現(~ ̄▽ ̄)~

文章相關附件可以點擊下面的原文鏈接前往下載

https://harmonyos.51cto.com/resource/1541

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2021-12-01 15:40:23

鴻蒙HarmonyOS應用

2022-02-09 19:37:00

Ability鴻蒙開發

2021-09-17 14:47:33

鴻蒙HarmonyOS應用

2021-11-02 14:52:17

鴻蒙HarmonyOS應用

2021-11-01 11:08:28

鴻蒙HarmonyOS應用

2021-11-02 14:55:42

鴻蒙HarmonyOS應用

2024-01-11 15:54:55

eTS語言TypeScript應用開發

2021-12-27 15:10:55

鴻蒙HarmonyOS應用

2021-10-28 14:58:15

鴻蒙HarmonyOS應用

2021-12-10 15:02:47

鴻蒙HarmonyOS應用

2009-03-20 11:20:59

UbuntuLinux示波器

2022-10-19 15:12:05

ArkUI鴻蒙

2022-03-17 15:28:18

五子棋HarmonyOSJSAPI

2022-11-02 16:06:54

ArkUIETS

2022-10-24 14:49:54

ArkUI心電圖組件

2022-06-27 14:12:32

css鴻蒙自定義

2022-09-14 15:17:26

ArkUI鴻蒙

2022-08-05 19:27:22

通用API鴻蒙

2022-10-17 14:36:09

ArkUI虛擬搖桿組件

2022-07-13 16:24:12

ArkUI(JS)打地鼠游戲
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久天堂 | 亚洲第一黄色网 | 99久热在线精品视频观看 | 成人激情视频免费在线观看 | 99久久精品一区二区成人 | 国产一区二区三区四区 | 亚洲高清在线观看 | 一级片在线免费播放 | 国产 欧美 日韩 一区 | 精品久久久久久亚洲精品 | 91精品福利 | 午夜视频一区 | 亚洲精品视频在线播放 | 国产成人自拍一区 | 国产色| 国产福利在线 | 国产亚洲欧美在线视频 | 国外成人在线视频 | 日韩中文在线视频 | 国产一区二区在线免费观看 | 久久久国产精品网站 | 亚洲啪啪 | 国产成人99久久亚洲综合精品 | www.99re| 国产激情偷乱视频一区二区三区 | 中文字幕国产视频 | 在线观看欧美日韩视频 | 欧美99 | 欧美在线一区二区视频 | 欧美福利| 天天干视频网 | 日日日操 | 国产一区二区在线视频 | 欧美精品中文 | 黄色毛片免费 | 久久网站黄 | 在线一级片 | 中文字幕成人在线 | 欧美激情精品久久久久久 | 日韩一区中文字幕 | 成人在线视频网 |