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

HarmonyOS ArkTS 本地庫(kù)和三方庫(kù)的用法

系統(tǒng) OpenHarmony
本項(xiàng)目基于HarmonyOS的ArkUI框架TS擴(kuò)展的聲明式開(kāi)發(fā)范式。

??想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??

??51CTO 開(kāi)源基礎(chǔ)軟件社區(qū)??

??https://ost.51cto.com??

項(xiàng)目介紹

項(xiàng)目?jī)?nèi)容: 自定義基礎(chǔ)組件和容器組件、依賴(lài)庫(kù)概念、本地依賴(lài)庫(kù)的創(chuàng)建和引用、三方庫(kù)的引用。

工具版本: DevEco Studio 3.1 Canary1。

SDK版本: 3.2.1.4(API Version 9 Canary1)(Stage模型)。

本項(xiàng)目基于??HarmonyOS??的ArkUI框架TS擴(kuò)展的聲明式開(kāi)發(fā)范式,關(guān)于語(yǔ)法和概念直接看官網(wǎng)官方文檔地址:??基于TS擴(kuò)展的聲明式開(kāi)發(fā)范式??,

效果演示

HarmonyOS ArkTS 本地庫(kù)&三方庫(kù)的用法-開(kāi)源基礎(chǔ)軟件社區(qū)

依賴(lài)庫(kù)

實(shí)際項(xiàng)目中,我們會(huì)把 公共代碼 或 獨(dú)立功能(UI、算法…) 抽離出來(lái)封裝成依賴(lài)庫(kù),提供調(diào)用方法,調(diào)用者只需將依賴(lài)庫(kù)導(dǎo)入到項(xiàng)目中,使用簡(jiǎn)單的代碼調(diào)用來(lái)完成開(kāi)發(fā),提高了開(kāi)發(fā)效率。一般的依賴(lài)庫(kù)特點(diǎn):調(diào)用簡(jiǎn)單、擴(kuò)展性高。

本地庫(kù)

本地庫(kù)主要是指未上架到npm中心,只是本地依賴(lài)使用的庫(kù)。

1、本地庫(kù)的創(chuàng)建

a.鼠標(biāo)移到工程目錄頂部,鼠標(biāo)右擊,選擇New>Module。

HarmonyOS ArkTS 本地庫(kù)&三方庫(kù)的用法-開(kāi)源基礎(chǔ)軟件社區(qū)

b.在Choose Your Ability Template界面中,選擇Ohos Library,點(diǎn)擊下一步。

HarmonyOS ArkTS 本地庫(kù)&三方庫(kù)的用法-開(kāi)源基礎(chǔ)軟件社區(qū)

c.在Configure the New Module界面中,配置模塊信息,點(diǎn)擊完成。

  • Module name:新增模塊的名稱(chēng)。
  • Language:選擇開(kāi)發(fā)HarmonyOS npm包的語(yǔ)言。
  • Device type:選擇HarmonyOS npm包支持的設(shè)備類(lèi)型。
  • Enable Native:是否創(chuàng)建一個(gè)用于調(diào)用C++代碼的HarmonyOS npm共享模塊。

HarmonyOS ArkTS 本地庫(kù)&三方庫(kù)的用法-開(kāi)源基礎(chǔ)軟件社區(qū)

2、本地庫(kù)的依賴(lài)

在Terminal窗口中,進(jìn)入模塊目錄中,執(zhí)行如下命令進(jìn)行安裝,并會(huì)在package.json中自動(dòng)添加依賴(lài)。

npm install (本地模塊的路徑)

npm install ../library

HarmonyOS ArkTS 本地庫(kù)&三方庫(kù)的用法-開(kāi)源基礎(chǔ)軟件社區(qū)

3、本地庫(kù)的調(diào)用

在依賴(lài)庫(kù)的根目錄中,index.ets文件提供了對(duì)外的導(dǎo)出。

HarmonyOS ArkTS 本地庫(kù)&三方庫(kù)的用法-開(kāi)源基礎(chǔ)軟件社區(qū)

在entry中index.ets頁(yè)面中,引入依賴(lài)庫(kù)。

// 導(dǎo)入本地依賴(lài)庫(kù)
import { MainPage } from '@ohos/library'

@Entry
@Component
struct Index {
build() {
Column() {
// 使用自定義組件
MainPage()
}.width('100%').height('100%')
.justifyContent(FlexAlign.Center)
}
}

自定義組件

可復(fù)用的 UI 單元,可組合其它組件,被 @Component 裝飾的結(jié)構(gòu)體。

本項(xiàng)目依賴(lài)庫(kù)中自定義組件:公共標(biāo)題欄、側(cè)滑菜單容器。

1、標(biāo)題欄組件

標(biāo)題自定義,左右都可以定義圖標(biāo)和點(diǎn)擊事件。且左邊圖標(biāo)有默認(rèn)事件:頁(yè)面返回。

import router from '@ohos.router';
/**
* 自定義標(biāo)題欄
*/
@Component
export struct TitleBar {
// 左邊圖標(biāo)是否顯示
private isShowLeft = true
// 左邊圖標(biāo)
private leftIcon = $r('app.media.back')
// 左邊點(diǎn)擊事件,默認(rèn)返回上一頁(yè)
private leftClickEvent = () => {
router.back()
}
// 標(biāo)題
private title = '標(biāo)題'
// 右邊圖標(biāo)是否顯示
private isShowRight = false
// 右邊圖標(biāo)
private rightIcon = $r('app.media.icon')
// 左邊點(diǎn)擊事件
private rightClickEvent: () => void

build() {
Column() {
Stack() {
Text(this.title).fontSize(20).fontColor('#ff1a1a1a')
Row() {
if (this.isShowLeft) {
Image(this.leftIcon).size({ width: 55, height: 55 }).padding(15)
.onClick(() => this.leftClickEvent())
}
Blank()
if (this.isShowRight) {
Image(this.rightIcon).size({ width: 55, height: 55 }).padding(15)
.onClick(this.rightClickEvent)
}
}.width('100%')
}.width('100%').height(0).layoutWeight(1)

Divider().color('#ffbababa')
}.width('100%').height(55)
}
}

標(biāo)題欄組件的使用:

import { TitleBar } from '@ohos/library'
@Entry
@Component
struct Index {
build() {
Column() {
TitleBar({ title: '主頁(yè)', leftIcon: $r('app.media.menu'),
leftClickEvent: () => {
// 左圖標(biāo)點(diǎn)擊事件
}
})
}.width('100%').height('100%')
}
}

2、側(cè)滑菜單容器

左右滑動(dòng)可以控制菜單,菜單打開(kāi)時(shí),背景透明度改變,使用動(dòng)畫(huà)效果打開(kāi)或關(guān)閉菜單。

/**
* 滑動(dòng)菜單
*/
@Component
export struct SlideMenuContainer {
// 菜單的寬度
@State menuWidth: number = 0
// 菜單x軸偏移量
@State menuOffsetX: number = 0
// 菜單偏移最小量
private offsetXMin = 0
// 菜單偏移最大量
private offsetXMax = 0
// 第一次按下的x坐標(biāo)
private firstDownX = -1
// 上次按下的x坐標(biāo)
private lastDownX = -1
// 背景透明度
@State bgOpacity: number = 0
// 滑動(dòng)方向
private slideDirection: 'left' | 'right'
// 菜單布局
@BuilderParam menu: any
// 內(nèi)容布局
@BuilderParam content: any
// 定時(shí)器ID
private intervalID = 0
// 是否打開(kāi)菜單
@Link @Watch('isOpenChanger') isOpen: boolean
isOpenChanger() {
if (this.isOpen) {
this.openMenu()
}
}
build() {
Stack({ alignContent: Alignment.Start }) {
// 內(nèi)容布局
Column() {
this.content()
}.width('100%').height('100%')

if (this.bgOpacity) {
// 透明背景
Column() {
}.width('100%').height('100%')
.backgroundColor(Color.Black).opacity(this.bgOpacity)
}
// 菜單布局
Column() {
this.menu()
}.width(this.menuWidth).height('100%')
.backgroundColor(Color.White)
.offset({ x: this.menuOffsetX })
}.width('100%').height('100%')
.onTouch((event) => this.onTouchEvent(event))
.onAreaChange((oldValue: Area, newValue: Area) => {
// 監(jiān)聽(tīng)回調(diào)中獲取容器的寬度
const width = Number.parseInt(newValue.width.toString())
this.menuWidth = width * 0.7
this.menuOffsetX = -this.menuWidth
this.offsetXMin = -this.menuWidth
this.offsetXMax = 0
})
}
/**
* 觸摸事件
*/
onTouchEvent(event: TouchEvent) {
const x = event.touches[0].x
switch (event.type) {
case TouchType.Down: // 手指按下
{
this.firstDownX = x
this.lastDownX = x
clearInterval(this.intervalID)
}
break;
case TouchType.Move: // 手指移動(dòng)
{
// 計(jì)算這次x坐標(biāo)點(diǎn)與上次x坐標(biāo)點(diǎn)的差
const diff = x - this.lastDownX
this.lastDownX = x
// 累計(jì)算出滑動(dòng)的距離
this.menuOffsetX += diff
// 確定方向
this.slideDirection = diff > 0 ? 'right' : 'left'
// 限定距離范圍
if (this.menuOffsetX >= this.offsetXMax) this.menuOffsetX = this.offsetXMax
if (this.menuOffsetX <= this.offsetXMin) this.menuOffsetX = this.offsetXMin
// 更改背景透明度
this.bgOpacity = 0.6 * Math.abs(this.menuWidth + this.menuOffsetX) / this.menuWidth
}
break;
case TouchType.Up: // 手指抬起
{
if (Math.abs(x - this.firstDownX) < 5) {
return
}
if (this.slideDirection === 'left') {
// 是否小于寬度的3/2
const isClose = Math.abs(this.menuWidth + this.menuOffsetX) < this.menuWidth * 2 / 3
isClose ? this.closeMenu() : this.openMenu()
} else {
// 是否大于寬度的3/1
const isOpen = Math.abs(this.menuWidth + this.menuOffsetX) > this.menuWidth / 3
isOpen ? this.openMenu() : this.closeMenu()
}
}
break;
default:
break;
}
}
/**
* 定時(shí)器改變偏移量
* @param type 偏移量 加或減
*/
intervalChangeOffset(type: 1 | -1) {
this.intervalID = setInterval(() => {
this.menuOffsetX += type * 15
if (this.menuOffsetX >= this.offsetXMax) {
this.menuOffsetX = this.offsetXMax
clearInterval(this.intervalID)
}
if (this.menuOffsetX <= this.offsetXMin) {
this.menuOffsetX = this.offsetXMin
clearInterval(this.intervalID)
this.isOpen = false
}
this.bgOpacity = 0.6 * Math.abs(this.menuWidth + this.menuOffsetX) / this.menuWidth
}, 5)
}
/**
* 打開(kāi)菜單
*/
openMenu() {
this.intervalChangeOffset(1)
}
/**
* 關(guān)閉菜單
*/
closeMenu() {
this.intervalChangeOffset(-1)
}
}

側(cè)滑菜單的使用 (部分代碼)

import { SlideMenuContainer } from '@ohos/library'
@Entry
@Component
struct Index {
@State isOpen: boolean = false
......
/**
* 內(nèi)容布局
*/
@Builder ContentLayout() {...}
/**
* 菜單布局
*/
@Builder MenuLayout() {...}

build() {
Column() {
SlideMenuContainer({
isOpen: $isOpen,
content: this.ContentLayout(),
menu: this.MenuLayout()
})
}.width('100%').height('100%')
}
}

三方庫(kù)

其他公司開(kāi)源的庫(kù)或者個(gè)人開(kāi)源的庫(kù),上架到npm中心供其他開(kāi)發(fā)者下載使用的庫(kù)。

本項(xiàng)目中使用的是三方庫(kù)是:lottieETS 一個(gè)適用于OpenHarmony的動(dòng)畫(huà)庫(kù)。

依賴(lài)方式和本地庫(kù)一樣,使用命令安裝:

npm install @ohos/lottieETS --save

以下示例只是簡(jiǎn)單用法,其他方法的使用請(qǐng)查看官方的文檔:??lottieETS 使用說(shuō)明??。

// 導(dǎo)入三方庫(kù)
import lottie from '@ohos/lottieETS'
@Entry
@Component
struct LottieDemo {
private setting: RenderingContextSettings = new RenderingContextSettings(true)
private crc: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.setting)
private lottiePath = 'common/lottie/car-loading2-data.json'
private lottieName = 'carName'
@State isPlay: boolean = false
build() {
Column() {
Canvas(this.crc)
.width(300)
.height(300)
.margin({ top: 30, bottom: 50 })
.margin({ top: 30, bottom: 50 })
.onReady(() => {
lottie.loadAnimation({
container: this.crc, // 需要綁定Canvas的CanvasRenderingContext2D
renderer: "canvas", // 目前只支持canvas模式
loop: true, // 是否循環(huán)播放
autoplay: false, // 是否自動(dòng)播放
name: this.lottieName, // 設(shè)置lottie動(dòng)畫(huà)名稱(chēng)
path: this.lottiePath // 指定lottie動(dòng)畫(huà)資源路徑
})
})
.onDisAppear(() => {
// Canvas銷(xiāo)毀時(shí)順帶銷(xiāo)毀lottie動(dòng)畫(huà)
lottie.destroy(this.lottieName)
})
Button(this.isPlay ? '暫停' : '播放')
.width(150).height(30)
.backgroundColor('#2D9FE5')
.onClick(() => {
this.isPlay = !this.isPlay
this.isPlay ? lottie.play(this.lottieName) : lottie.pause(this.lottieName)
})
}.width('100%').height('100%')
}
}

結(jié)尾

此項(xiàng)目中本地庫(kù)和三方庫(kù)的依賴(lài)都比較簡(jiǎn)單,難點(diǎn)是自定義組件的使用,還是需要多看官方的文檔。最后希望鴻蒙社區(qū)越來(lái)越多的人加入,創(chuàng)作出更多優(yōu)秀三方庫(kù)。

項(xiàng)目地址:https://gitee.com/liangdidi/CallLibraryDemo。

每天進(jìn)步一點(diǎn)點(diǎn)、需要付出努力億點(diǎn)點(diǎn)。

??想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??

??51CTO 開(kāi)源基礎(chǔ)軟件社區(qū)??

??https://ost.51cto.com??。

責(zé)任編輯:jianghua 來(lái)源: 51CTO開(kāi)源基礎(chǔ)軟件社區(qū)
相關(guān)推薦

2023-02-07 15:43:13

三方庫(kù)適配鴻蒙

2023-03-22 09:09:21

鴻蒙Speexdsp

2019-07-30 11:35:54

AndroidRetrofit庫(kù)

2021-04-28 15:07:06

鴻蒙HarmonyOS應(yīng)用

2021-10-11 06:38:52

Go開(kāi)源庫(kù)語(yǔ)言

2021-01-27 10:04:46

鴻蒙HarmonyOS動(dòng)畫(huà)

2020-10-29 09:56:23

Linux靜態(tài)庫(kù)動(dòng)態(tài)庫(kù)

2014-07-22 10:56:45

Android Stu第三方類(lèi)庫(kù)

2022-11-16 14:05:06

Tesseract應(yīng)用調(diào)用

2022-06-06 07:50:55

PythonJSON

2022-05-21 23:56:16

Python庫(kù)搜索Python

2013-01-15 13:50:22

iOS開(kāi)發(fā)開(kāi)源庫(kù)

2024-05-16 08:14:19

Carbon?Format?格式化

2021-03-18 16:07:08

鴻蒙HarmonyOS應(yīng)用

2011-07-25 14:14:49

iPhone SQLITE Pldatabase

2010-03-03 15:10:49

第三方Python庫(kù)

2013-08-14 09:50:32

iOS類(lèi)庫(kù)

2022-10-11 15:04:28

NAPI開(kāi)發(fā)鴻蒙

2023-03-01 07:21:33

2022-09-05 09:01:47

第三方庫(kù)API
點(diǎn)贊
收藏

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