0基礎學習鴻蒙開發-HarmonyOS4

一、初識?

1. 開發工具

官網?開發-HarmonyOS NEXT鴻蒙應用開發平臺-華為開發者聯盟

2. ArkTS

二、TypeScript 基本語法

1.變量聲明

2. 條件控制

注意
在TypeScrips中·

????????空字符串·數字0、null、undefined 都坡認為是false

????????其它值則為true

if (num) {// num 非空執行
}

3. 循環迭代

4. 函數

5. 類和接口

6. 模塊化開發

三、快速入門

1. 創建項目

2. 結構信息

路由配置地址:

?3. 入門案例

@Entry
@Component
struct Index { //自定義組件  --可以復用的UI單元@State message: string = 'Hello World';build() {Row() {Column() {Text(this.message).fontSize(50).fontWeight(FontWeight.Bold).fontColor('red').onClick(() => {this.message = '你好世界'})}.width('100%')}.height('100%')}
}

四、ArkUI 基礎組件

1. Image 組件

2. Text 組件

3. TextInput 文本輸框

  • 數值轉字符串:?
????????數值.toFixed(0) --保留0位小數
  • 字符串轉數值:? ? ? ??
????????parseInt(字符串) 

4. Button 按鈕

5. Slider 滑塊

6.?Column和Row

?

1) 主軸?

2)交叉軸

7. 案例源碼

@Entry
@Component
struct Index { //自定義組件  --可以復用的UI單元@State message: string = 'HarmonyOS';@State imgWidth:number = 250;build() {Column() {//   圖片Row() {Image($rawfile('HarmonyOS.jpg')).width(this.imgWidth)  //默認單位 vp(虛擬像素).interpolation(ImageInterpolation.High) //處理圖片邊緣鋸齒.borderRadius(20) //邊框弧度}.width('100%').height(400).justifyContent(FlexAlign.Center)//   文本提示Row() {Text($r('app.string.width_label')).fontSize(20).fontWeight(FontWeight.Bold)// .toFixed(0) 數值轉字符串 保留0位小數TextInput({placeholder:'請輸入寬度',text:this.imgWidth.toFixed(0)}).width(250).type(InputType.Number).onChange((value:string) => {// console.log(value)// parseInt 字符轉數值this.imgWidth = parseInt(value)})}.width('100%').justifyContent(FlexAlign.SpaceBetween).padding({left:15,right:15})// 分割線Divider().width('91%').color('red')//   按鈕Row(){Button('縮小').width(80).fontSize(20).onClick(() => {if (this.imgWidth >= 10) {this.imgWidth -= 10}})Button('放大').width(80).fontSize(20).type(ButtonType.Normal).onClick(() => {if (this.imgWidth <= 300) {this.imgWidth += 10}})}.width('100%').justifyContent(FlexAlign.SpaceEvenly).margin({top:20,bottom:20})//   滑塊Slider({min:10,max:310,value:this.imgWidth,step:10,style: SliderStyle.OutSet}).width('90%').borderColor('#36D').trackThickness(7).showTips(true).onChange((value)=> {this.imgWidth = value})}.width('100%').height('100%')}
}

8.?渲染控制

1)?ForEach

2)?if-else

9. List 列表

List({space:6}){ForEach(this.tasks,(item:Task) => {ListItem() {Row(){Text(item.name).fontSize(20).textAlign(TextAlign.Start).padding({left:10})Checkbox().select(item.finished).onChange((val)=> {// 更新當前任務狀態item.finished = val// 更新已完成任務數量// this.finishTask = this.tasks.filter(i=> i.finished).lengththis.handleTaskChange()})}.card().justifyContent(FlexAlign.SpaceBetween)}})
}
.width('100%')
.layoutWeight(1) //剩下的高度全是我的
.alignListItem(ListItemAlign.Center) //列表居中
class Item {name: stringimage: ResourceStrprice: numberdiscount: numberconstructor(name:string, image:ResourceStr, price: number , discount:number = 0) {this.name = namethis.image = imagethis.price = pricethis.discount = discount}
}@Entry
@Component
struct ItemPage {//商品數據private  items:Array<Item> = [new Item('華為mate60',$rawfile('HarmonyOS.jpg'),6999,500),new Item('華為mate60',$rawfile('HarmonyOS.jpg'),6999),new Item('華為mate60',$rawfile('HarmonyOS.jpg'),6999),new Item('華為mate60',$rawfile('HarmonyOS.jpg'),6999),new Item('華為mate60',$rawfile('HarmonyOS.jpg'),6999),new Item('華為mate60',$rawfile('HarmonyOS.jpg'),6999),new Item('華為mate60',$rawfile('HarmonyOS.jpg'),6999),]build() {Column({space:8}) {Row(){Text('商品列表').fontSize(18).fontWeight(FontWeight.Bold)}.width('100%').margin({bottom:20}).height(30)List({space:8}){ForEach(this.items,(item:Item) => {ListItem(){Row() {Column(){Image(item.image).width(100)}Column(){Row(){Text(item.name)}Column(){if (item.discount) {Row(){Text('原價:')Text(item.price.toFixed(0)).decoration({type: TextDecorationType.LineThrough})}Row(){Text('價格:')Text((item.price - item.discount).toFixed(0))}Row(){Text('折扣:')Text(item.discount.toFixed(0))}}else {Row(){Text('價格:')Text(item.price.toFixed(0))}}}}}.margin({left:10,right:10})}})}.width('100%').layoutWeight(1) }}
}

10. 自定義組件

Blank : 將容器剩余空間全部占滿

五、狀態管理

1. states 裝飾器

2. 案例:多任務統計

進度條組件:? ? ?

Progress({  value:this.finishTask,  //當前值total:this.totalTask,???//總值type:ProgressType.Ring  //樣式 --環形
})

堆疊容器:
Stack() {
? Progress(...) --盒子1
? Row() {...}? --盒子2
}

????

多選框 :
????????Checkbox(options?: CheckboxOptions)??

Checkbox().select(item.finished).onChange((val)=> {// 更新當前任務狀態item.finished = val// 更新已完成任務數量// this.finishTask = this.tasks.filter(i=> i.finished).lengththis.handleTaskChange()})

List 列表項 ListItem 劃出樣式

????????swipeAction()

swipeAction({end:this.DeleteBnt(idnex)})

@Builder DeleteBnt(index:number) {Button('刪除').backgroundColor('red').onClick( () => {this.tasks.splice(index,1)this.handleTaskChange()})
}

{ 右邊劃出:劃出之后的內容 }

案例源碼

// 案例:多任務統計
import { it } from '@ohos/hypium'
@Observed
class Task{static id:number = 1 //任務idname:string = `任務${Task.id++}` //名稱finished:boolean = false  //是否完成
}// 統一卡片樣式
@Styles function card(){.width('95%').padding(20).backgroundColor(Color.White).borderRadius(15).shadow({radius:6,color:'#1F000000',offsetX:2,offsetY:4})
}// 任務完成樣式
@Extend(Text) function finishedTask() {.decoration({type:TextDecorationType.LineThrough}).fontColor('#B1B2B1')
}@Entry
@Component
struct PropPage {// 總任務數量@State totalTask: number = 0// 已完成任務數量@State finishTask:number = 0build() {Column({space:10}) {// 1. 任務進度TaskStatistics({finishTask:this.finishTask,totalTask:this.totalTask})// 2.任務列表TaskList({finishTask: $finishTask,totalTask:$totalTask})}.width('100%').height('100%').backgroundColor('#F1F2F3')}}@Component
struct TaskStatistics {@Prop finishTask:number@Prop totalTask:numberbuild() {Row(){Text('任務進度').fontSize(30).fontWeight(FontWeight.Bold)// 堆疊容器Stack() {Progress({  // 進度條value:this.finishTask,total:this.totalTask,type:ProgressType.Ring})Row() {Text(this.finishTask.toString()).fontSize(24).fontColor('#36D')Text('/'+this.totalTask.toString()).fontSize(24)}}}.card().margin({top:20,bottom:10}).justifyContent(FlexAlign.SpaceEvenly)}
}@Component
struct TaskItem {@ObjectLink item:Task;onTaskChange: ()=> void =() => {}build() {Row() {if(this.item.finished){Text(this.item.name).finishedTask()}else{Text(this.item.name).fontSize(20).textAlign(TextAlign.Start).padding({ left: 10 })}Checkbox().select(this.item.finished).onChange((val) => {// 更新當前任務狀態this.item.finished = val// 更新已完成任務數量// this.finishTask = this.tasks.filter(i=> i.finished).lengththis.onTaskChange()})}.card().justifyContent(FlexAlign.SpaceBetween)}
}@Component
struct TaskList {// 任務數組@State tasks: Task[] = []@Link totalTask: number// 已完成任務數量@Link finishTask:number@Builder DeleteBnt(index:number) {Button('刪除').backgroundColor('red').onClick( () => {this.tasks.splice(index,1)this.handleTaskChange()})}handleTaskChange() {// 更新任務總數this.totalTask = this.tasks.length// 更新已完成任務數量this.finishTask = this.tasks.filter(i=> i.finished).length}build() {Column() {Button('新增任務').width(200).onClick(() => {// 新增任務this.tasks.push(new Task())// 更新任務總數// this.totalTask = this.tasks.lengththis.handleTaskChange()})// 3.任務列表List({ space: 6 }) {ForEach(this.tasks, (item: Task, idnex: number) => {ListItem() {TaskItem({item:item,onTaskChange: this.handleTaskChange.bind(this)})}.swipeAction({ end: this.DeleteBnt(idnex) })})}.width('100%').layoutWeight(1).alignListItem(ListItemAlign.Center) //列表居中}}}

3. @Prop @Link @Provide @Consume 裝飾器

1)@Prop @Link

2)@Provide @Consume

@Provide 父組件 傳遞

@Consume 子組件 獲取

不需要傳參

4. @Observed 和 @ObjectLink

六、頁面路由

1. 示例

頁面路由配置地址

創建文件為頁面是則自動添加路徑

2. 案例

案例源碼

import router from '@ohos.router'class RouterInfo {
//   頁面路徑url: string
//   頁面標題title: stringconstructor(url:string, title:string) {this.url = urlthis.title = title}
}@Entry
@Component
struct Index {@State message: string = '頁面列表'private routers: RouterInfo[] = [new RouterInfo('pages/itemPage','商品列表'),new RouterInfo('pages/PropPage','多任務'),new RouterInfo('pages/ImagePage','圖片查看')]@BuilderRouterItem(r: RouterInfo, i: number) {Row(){Text(i.toString()).fontColor(Color.White)Text(r.title).fontColor(Color.White)}.justifyContent(FlexAlign.SpaceBetween).backgroundColor('#36D').padding({left:20,right:20}).borderRadius(20).width('100%').height(50).onClick(() => {//   router 跳轉router.pushUrl({url:r.url,params:{id:i}},router.RouterMode.Single,  //頁面跳轉模式err => {if (err) {console.log(`跳轉失敗,errCode:${err.code} errMsg:${err.message}`)}})})}build() {Column(){Text(this.message).fontSize(20).fontWeight(FontWeight.Bold).height(50).fontColor(Color.Pink)List({space:8}) {ForEach(this.routers,(router:RouterInfo,index:number)=>{ListItem() {this.RouterItem(router,(index+1))}})}.layoutWeight(1)}}
}
import router from "@ohos.router"// 定義組件
@Component
export  struct Header {private title:ResourceStr = '列表'@State params:object = router.getParams() //拿到傳參build() {Row(){Text('<-').onClick(()=> {router.showAlertBeforeBackPage({message:'返回頁面'})  //返回前提示router.back() //返回路由})if(this.params) {Text(`${this.params}, ${this.title}`).fontSize(18).fontWeight(FontWeight.Bold)}else {Text(this.title) // 只顯示默認標題.fontSize(18).fontWeight(FontWeight.Bold)}}.width('100%').height(30)}
}

3. 總結

七、動畫

1. 屬性動畫和顯式動畫

1)屬性動畫

案例:

?

? Image(this.src)
??? .position({x:this.fishX-20,y:this.fishY-20})
// 定義初始位置
??? .rotate({angle:this.angle,centerX:"50%",centerY:'50%'})?// 定義動畫運動樣式
??? .width(40)
??? .height(40)

//?? 添加屬性動畫
??? .animation({duration:500})? //動畫播放參數{}

//修改屬性實現動畫

Button("v").backgroundColor('#20101010').onClick(()=> {this.fishY += 20})
import { Header } from '../components/CommonComponents'
import router from '@ohos.router';@Entry
@Component
struct AnimationPage {@State fishX: number = 200@State fishY: number = 180// 小魚角度@State angle:number = 0// 小魚圖片@State src: Resource = $r('app.media.startIcon')// 是否開始游戲@State isBegin: boolean = false;build() {Row() {// Header({title:"小魚動畫"})Stack() {  //堆疊容器Button('返回').position({x:0,y:0}).backgroundColor(Color.Pink).onClick(()=> {router.back()}).margin({top:0}).zIndex(1)if(!this.isBegin) {Button('開始游戲').onClick(() => {this.isBegin = true}).margin({left:250})}else{// 小魚圖片Image(this.src).position({x:this.fishX-20,y:this.fishY-20}).rotate({angle:this.angle,centerX:"50%",centerY:'50%'}).width(40).height(40)//   添加屬性動畫.animation({duration:500})//   操作按鈕Row(){Button('<').backgroundColor('#20101010').onClick(()=> {this.fishX -= 20})Column({space:40}) {Button('^').backgroundColor('#20101010').onClick(()=> {this.fishY -= 20})Button("v").backgroundColor('#20101010').onClick(()=> {this.fishY += 20})}Button('>').backgroundColor('#20101010').onClick(()=> {this.fishX += 20})}.height(240).width(240)}}}.height('100%').width('100%')}
}

2)顯式動畫 *

Image(this.src).position({x:this.fishX-20,y:this.fishY-20}).rotate({angle:this.angle,centerX:"50%",centerY:'50%'}).width(40).height(40)
Button('<').backgroundColor('#20101010').onClick(()=> {// this.fishX -= 20
    animateTo({duration:500},()=>{this.fishX -= 20})})

2. 組件轉場動畫

3. 實現搖桿功能

八、Stage 模型

1. 應用配置組件

23-Stage模型-應用配置文件_嗶哩嗶哩_bilibili

2. UIAbility 生命周期

3. 頁面組件生命周期

4.?UIAbility的啟動模式

?

修改模式

1)案例:文檔跳轉

九、網絡連接

十、數據持久化

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/81997.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81997.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/81997.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深度學習中常用的符號表達式

在論文寫作過程中&#xff0c;常常涉及到一些關鍵的符號的表達&#xff0c;為了更加規范常用的一些符號表達&#xff0c;現將其總結如下&#xff08;該文件會持續性更新&#xff09;&#xff1a; 數字 x x x : 標量 x \mathbf{x} x : 向量 X \mathbf{X} X : 矩陣 X \mathsf{X}…

react naive 網絡框架源碼解析

本文取 react native 兩個區別很大的版本做分析&#xff08;0.76.5、0.53.3&#xff09; 一、0.76.5 版fetch 全流程排查 1、JS 端的實現 隨手寫一個fetch&#xff0c;點開。 我們這里常用的還是手機端&#xff0c;因此選擇 react-native&#xff0c;react-native-windows …

OpenCV 圖形API(81)圖像與通道拼接函數-----透視變換函數warpPerspective()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 對圖像應用透視變換。 函數 warpPerspective 使用指定的矩陣對源圖像進行變換&#xff1a; dst ( x , y ) src ( M 11 x M 12 y M 13 M 31 x…

深度學習在油氣地震資料反卷積中的應用

深度學習在油氣地震資料反卷積中的應用 基本原理 在油氣地震勘探中&#xff0c;反卷積(Deconvolution)是一種重要的信號處理技術&#xff0c;用于提高地震資料的分辨率。傳統方法(如維納濾波、預測反卷積等)存在對噪聲敏感、假設條件嚴格等局限。深度學習方法通過數據驅動的方…

Java開發者面試實錄:微服務架構與Spring Cloud的應用

面試場景 面試官: 請介紹一下你的基本情況。 程序員: 大家好&#xff0c;我叫張小明&#xff0c;今年27歲&#xff0c;碩士學歷&#xff0c;擁有5年的Java后端開發經驗。主要負責基于Spring Boot開發企業級應用&#xff0c;以及微服務架構的設計和實現。 面試官: 好的&#…

?Spring + Shiro 整合的核心要點及詳細實現說明

在 Spring 項目中集成 Apache Shiro 可以實現輕量級的安全控制&#xff08;認證、授權、會話管理等&#xff09;。以下是 ?Spring Shiro 整合的核心要點及詳細實現說明&#xff1a; 一、Spring 與 Shiro 整合的核心組件 ?組件??作用?ShiroFilterFactoryBean創建 Shiro 過…

網絡編程核心技術解析:從Socket基礎到實戰開發

網絡編程核心技術解析&#xff1a;從Socket基礎到實戰開發 一、Socket編程核心基礎 1. 主機字節序與網絡字節序&#xff1a;數據傳輸的統一語言 在計算機系統中&#xff0c;不同架構對多字節數據的存儲順序存在差異&#xff0c;而網絡通信需要統一的字節序標準&#xff0c;這…

SQLark可以支持PostgreSQL了,有哪些新功能?

SQLark&#xff08;百靈連接&#xff09;是一款國產的數據庫開發和管理工具&#xff0c;用于快速查詢、創建和管理不同類型的數據庫系統&#xff0c;支持達夢、Oracle 和 MySQL 數據庫。 最新發布的 SQLark V3.4 版本新增了對 PostgreSQL 數據庫的支持。我試用了一下&#xff…

【全面解析】Poco C++ Libraries 模塊詳解與使用指南

Poco&#xff08;The Portable Components&#xff09; 是一套現代 C 的跨平臺開發庫&#xff0c;廣泛應用于嵌入式系統、服務端程序、工業控制和 AI 后端服務等領域。其設計理念類似于 Java 的標準庫&#xff0c;為 C 提供“標準的非標準功能”。 本篇文章將帶你全面了解 Poco…

Vue+tdesign t-input-number 設置長度和顯示X號

一、需求 Vuetdesign t-input-number 想要設置input的maxlen和顯示X號 二、實現 t-input&#xff0c;可以直接使用maxlength和clearable屬性 <t-input v-model"value" clearable maxlength10 placeholder"請輸入" clear"onClear" blur&q…

(Go Gin)Gin學習筆記(二):路由配置、基本路由、表單參數、上傳單個文件、上傳多個文件、淺扒路由原理

1. 路由 gin 框架中采用的路優酷是基于httprouter做的 HttpRouter 是一個高性能的 HTTP 請求路由器&#xff0c;適用于 Go 語言。它的設計目標是提供高效的路由匹配和低內存占用&#xff0c;特別適合需要高性能和簡單路由的應用場景。 主要特點 顯式匹配&#xff1a;與其他路由…

Linux下的好玩的命令

在 CentOS 下&#xff0c;有許多有趣且實用的 Linux 命令&#xff0c;可以幫助你更好地了解系統、提升效率或進行娛樂。以下是一些好玩的 Linux 命令及其說明&#xff1a; 1. cowsay 和 cowthink 功能&#xff1a;讓一只牛&#xff08;或其他動物&#xff09;說出你想說的話。…

OpenharmonyOS+RK3568,【編譯燒錄】

文章目錄 1. 摘要 ?2. 代碼下載 &#x1f4e9;3. 編譯 &#x1f5a5;?4. 修改&適配 ??4.1 編譯框架基本概念4.2 vendor & device 目錄4.3 內核編譯4.3.1 如何修改、適配自己的開發板&#xff1f; 4.4 修改外設驅動 5. 燒錄&驗證 &#x1f4cb;參考 1. 摘要 ? …

深度學習模型優化:如何讓數據科學更智能?

深度學習模型優化:如何讓數據科學更智能? 一、引言:為什么優化深度學習模型如此重要? 深度學習的應用已經滲透到數據科學的各個領域,從圖像識別到自然語言處理,從推薦系統到金融風控,每一個智能模型都依賴于數據驅動的訓練。然而,一個模型的性能不僅僅取決于其架構,…

學習Python的第二天之網絡爬蟲

30歲程序員學習Python的第二天之網絡爬蟲的信息提取 BeautifulSoup庫 地址&#xff1a;https://beautifulsoup.readthedocs.io/zh-cn/v4.4.0/ 1、BeautifulSoup4安裝 在windows系統下通過管理員權限運行cmd窗口 運行pip install beautifulsoup4 測試實例 import requests…

n8n 鍵盤快捷鍵和控制鍵

n8n 鍵盤快捷鍵和控制鍵 工作流控制鍵畫布操作移動畫布畫布縮放畫布上的節點操作選中一個或多個節點時的快捷鍵 節點面板操作節點面板分類操作 節點內部操作 n8n 為部分操作提供了鍵盤快捷鍵。 工作流控制鍵 Ctrl Alt n&#xff1a;創建新工作流Ctrl o&#xff1a;打開工作…

keil+vscode+騰訊ai助手

嵌入式軟件開發 這個是之前一直想寫的開發方式&#xff0c;不過上份工作一直在忙&#xff0c;沒有抽出時間花在上面&#xff0c;現在空下來好好寫一寫吧&#xff01;標題軟件安裝 關于VSCode以及Keil的安裝可以在以下鏈接中點擊瀏覽 VSCode安裝 Keil5安裝 CubeMx安裝 插件下…

Unity教程(二十三)技能系統 投劍技能(上)基礎實現

Unity開發2D類銀河惡魔城游戲學習筆記 Unity教程&#xff08;零&#xff09;Unity和VS的使用相關內容 Unity教程&#xff08;一&#xff09;開始學習狀態機 Unity教程&#xff08;二&#xff09;角色移動的實現 Unity教程&#xff08;三&#xff09;角色跳躍的實現 Unity教程&…

Oracle01-入門

零、文章目錄 Oracle01-入門 1、Oracle簡介 &#xff08;1&#xff09;數據庫基礎 數據庫基礎請參考&#xff1a;https://blog.csdn.net/liyou123456789/article/details/131207068 &#xff08;2&#xff09;Oracle是什么 ORACLE 數據庫系統是美國 ORACLE 公司&#xff…

springboot集成mybatis-plus詳細使用

以下是 Spring Boot 集成 MyBatis-Plus 的詳細步驟&#xff1a; 創建 Spring Boot 項目 可使用 Spring Initializr 快速創建項目&#xff0c;添加相關依賴。 引入依賴 在項目 pom.xml 文件中添加以下依賴&#xff1a; <!-- MyBatis-Plus 啟動依賴 --> <dependenc…