HarmonyOS開發(fā)工具庫全攻略:10款必備工具推薦

2024-12-03 15:56 更新

大家好,我是 V 哥,今天給大家分享10款好用的 HarmonyOS的工具庫,在開發(fā)鴻蒙應(yīng)用時(shí)可以用下,好用的工具可以簡化代碼,讓你寫出優(yōu)雅的應(yīng)用來。廢話不多說,馬上開整。

1. efTool

efTool是一個(gè)功能豐富且易用的兼容API12的HarmonyOS工具庫,通過諸多實(shí)用工具類的使用,旨在幫助開發(fā)者快速、便捷地完成各類開發(fā)任務(wù)。 這些封裝的工具涵蓋了字符串、數(shù)字、集合、JSON等一系列操作, 可以滿足各種不同的開發(fā)需求。本人為Java開發(fā),故封裝思路借鑒Java的工具類Hutool,同時(shí)擴(kuò)展了HarmonyOS的UI組件。

咱們使用 ArkTS(Ark TypeScript)編寫的 efTool 工具庫中字符串工具類的示例代碼,利用這些封裝來簡化開發(fā)任務(wù),并擴(kuò)展 HarmonyOS 的 UI 組件。假設(shè)我們有一個(gè)字符串處理工具類 StrUtil 和一個(gè)擴(kuò)展的 UI 組件。

1. 字符串工具類 (StrUtil)

// StrUtil.ts
export default class StrUtil {
  // 判斷字符串是否為空或僅包含空白
  static isBlank(input: string): boolean {
    return input == null || input.trim() === '';
  }


  // 將字符串轉(zhuǎn)換為大寫
  static toUpperCase(input: string): string {
    return input ? input.toUpperCase() : input;
  }


  // 判斷字符串是否包含指定子字符串
  static contains(input: string, searchString: string): boolean {
    return input.indexOf(searchString) !== -1;
  }
}

2. 擴(kuò)展的UI組件示例

// ExtTextComponent.ts
import { Text, Flex, View } from '@ohos:ohos_ui';


export default class ExtTextComponent {
  // 一個(gè)自定義的文本組件,支持傳入自定義樣式
  static renderText(content: string, style?: { fontSize?: number; color?: string }) {
    const defaultStyle = {
      fontSize: 16,
      color: '#000000',
    };


    const finalStyle = { ...defaultStyle, ...style };


    return (
      <Text
        value={content}
        fontSize={finalStyle.fontSize}
        fontColor={finalStyle.color}
      />
    );
  }


  // 用來組合多個(gè)文本的展示
  static renderTextList(textList: string[], style?: { fontSize?: number; color?: string }) {
    return (
      <Flex direction="column">
        {textList.map((text) => (
          <View>
            {this.renderText(text, style)}
          </View>
        ))}
      </Flex>
    );
  }
}

3. 使用 StrUtil 和 擴(kuò)展的 ExtTextComponent

以下是如何將這些工具和 UI 組件整合到 HarmonyOS 應(yīng)用中的示例:

import StrUtil from './StrUtil';
import ExtTextComponent from './ExtTextComponent';


// 示例邏輯
const content = 'HarmonyOS Tools';
const textList = ['First text', 'Second text', 'Third text'];


function onCreate() {
  const isBlank = StrUtil.isBlank(content); // false
  const upperCaseText = StrUtil.toUpperCase(content); // 'HARMONYOS TOOLS'
  const containsHarmony = StrUtil.contains(content, 'Harmony'); // true


  // 在界面上展示
  return (
    <View>
      {ExtTextComponent.renderText(`Is blank: ${isBlank}`)}
      {ExtTextComponent.renderText(`Upper case: ${upperCaseText}`)}
      {ExtTextComponent.renderText(`Contains 'Harmony': ${containsHarmony}`)}
      {ExtTextComponent.renderTextList(textList)}
    </View>
  );
}

來解釋一下代碼:

  1. 字符串工具類 StrUtil:提供一些常用的字符串操作方法,例如判斷字符串是否為空、轉(zhuǎn)換為大寫、檢查是否包含子字符串等。 這些方法旨在簡化開發(fā)中對字符串的常見處理操作。

  2. 擴(kuò)展的UI組件 ExtTextComponent:封裝了基于 HarmonyOS UI 組件的文本展示邏輯。renderText 方法可以方便地展示帶有自定義樣式的文本,而 renderTextList 方法則進(jìn)一步擴(kuò)展,允許批量展示文本列表。

  1. 整合示例onCreate 函數(shù)展示了如何利用 StrUtilExtTextComponent 一起工作,處理邏輯并動(dòng)態(tài)渲染內(nèi)容到頁面上。

通過這種方式,efTool 不僅能幫助處理基礎(chǔ)的字符串等數(shù)據(jù)類型操作,還能通過擴(kuò)展 HarmonyOS 的組件庫,簡化界面開發(fā)任務(wù)。efTool還有更多好用的工具,可以試試哦。

2. harmony-utils

harmony-utils 一款功能豐富且極易上手的HarmonyOS工具庫,借助眾多實(shí)用工具類,致力于助力開發(fā)者迅速構(gòu)建鴻蒙應(yīng)用。其封裝的工具涵蓋了APP、設(shè)備、屏幕、授權(quán)、通知、線程間通信、彈框、吐司、生物認(rèn)證、用戶首選項(xiàng)、拍照、相冊、掃碼、文件、日志,異常捕獲、字符、字符串、數(shù)字、集合、日期、隨機(jī)、base64、加密、解密、JSON等一系列的功能和操作,能夠滿足各種不同的開發(fā)需求。

我們寫一個(gè)基于 ArkTS (Ark TypeScript) 編寫的 harmony-utils 工具庫的示例代碼,來展示一下如何使用其中的一些常用功能。

1. APP工具類 (AppUtil)

// AppUtil.ts
export default class AppUtil {
  // 獲取應(yīng)用基本信息
  static getAppInfo() {
    return {
      appName: 'HarmonyApp',
      version: '1.0.0',
      packageName: 'com.harmony.app',
    };
  }


  // 退出應(yīng)用
  static exitApp() {
    // 使用HarmonyOS API來退出應(yīng)用
    console.log('Exiting the app...');
    // 調(diào)用API以退出應(yīng)用,如需要可以調(diào)用系統(tǒng)相關(guān)功能
  }
}

2. 設(shè)備工具類 (DeviceUtil)

// DeviceUtil.ts
export default class DeviceUtil {
  // 獲取設(shè)備信息
  static getDeviceInfo() {
    return {
      brand: 'Huawei',
      model: 'P50 Pro',
      osVersion: 'HarmonyOS 3',
    };
  }


  // 獲取屏幕信息
  static getScreenInfo() {
    return {
      width: 1080,
      height: 2340,
      density: 2.5,
    };
  }
}

3. 日期工具類 (DateUtil)

// DateUtil.ts
export default class DateUtil {
  // 獲取當(dāng)前日期
  static getCurrentDate(): string {
    const date = new Date();
    return date.toLocaleDateString();
  }


  // 格式化日期
  static formatDate(date: Date, format: string): string {
    const options: Intl.DateTimeFormatOptions = {
      year: 'numeric',
      month: '2-digit',
      day: '2-digit',
    };
    return new Intl.DateTimeFormat('en-US', options).format(date);
  }
}

4. 吐司工具類 (ToastUtil)

// ToastUtil.ts
export default class ToastUtil {
  // 顯示短時(shí)間提示
  static showToastShort(message: string) {
    // 使用HarmonyOS的Toast API
    console.log(`Short Toast: ${message}`);
  }


  // 顯示長時(shí)間提示
  static showToastLong(message: string) {
    // 使用HarmonyOS的Toast API
    console.log(`Long Toast: ${message}`);
  }
}

5. 使用 harmony-utils 中的工具

以下是如何在應(yīng)用中整合使用 AppUtil、DeviceUtil、DateUtilToastUtil 的示例:

import AppUtil from './AppUtil';
import DeviceUtil from './DeviceUtil';
import DateUtil from './DateUtil';
import ToastUtil from './ToastUtil';


function onCreate() {
  // 獲取應(yīng)用信息
  const appInfo = AppUtil.getAppInfo();
  console.log(`App Name: ${appInfo.appName}, Version: ${appInfo.version}, Package: ${appInfo.packageName}`);


  // 獲取設(shè)備信息
  const deviceInfo = DeviceUtil.getDeviceInfo();
  console.log(`Device: ${deviceInfo.brand} ${deviceInfo.model}, OS: ${deviceInfo.osVersion}`);


  // 獲取屏幕信息
  const screenInfo = DeviceUtil.getScreenInfo();
  console.log(`Screen: ${screenInfo.width}x${screenInfo.height}, Density: ${screenInfo.density}`);


  // 顯示當(dāng)前日期
  const currentDate = DateUtil.getCurrentDate();
  console.log(`Current Date: ${currentDate}`);


  // 顯示吐司
  ToastUtil.showToastShort('Welcome to HarmonyOS!');

  
  // 退出應(yīng)用示例
  setTimeout(() => {
    AppUtil.exitApp();
  }, 5000); // 5秒后退出應(yīng)用
}

解釋一下代碼:

  1. App工具類 (AppUtil):封裝了與應(yīng)用相關(guān)的操作,提供獲取應(yīng)用信息和退出應(yīng)用的功能。這些操作可以幫助開發(fā)者更方便地獲取應(yīng)用元信息和控制應(yīng)用生命周期。

  1. 設(shè)備工具類 (DeviceUtil):用于獲取設(shè)備的基本信息(品牌、型號(hào)、操作系統(tǒng)版本)以及屏幕信息(分辨率和密度),讓開發(fā)者在不同設(shè)備上自適應(yīng)界面設(shè)計(jì)。

  1. 日期工具類 (DateUtil):封裝了日期操作,可以獲取當(dāng)前日期并進(jìn)行格式化,方便開發(fā)者處理時(shí)間相關(guān)邏輯。

  1. 吐司工具類 (ToastUtil):用于在應(yīng)用中顯示提示消息,簡化了對系統(tǒng)吐司的調(diào)用,支持短時(shí)間和長時(shí)間兩種不同的顯示模式。

  1. 整合示例:通過 onCreate 方法展示如何利用這些工具類獲取應(yīng)用信息、設(shè)備信息、顯示當(dāng)前日期、提示消息,以及退出應(yīng)用的操作。這種整合幫助開發(fā)者快速搭建功能完善的應(yīng)用邏輯,簡化常見任務(wù)的開發(fā)過程。

通過這種封裝,harmony-utils 能夠極大提高開發(fā)效率,使開發(fā)者可以專注于業(yè)務(wù)邏輯而不必處理繁瑣的基礎(chǔ)操作。還有更多好用的工具等你來使用。

3. SpinKit(API12 - 5.0.3.800)

SpinKit 是一個(gè)適用于OpenHarmony/HarmonyOS的加載動(dòng)畫庫。

下面是使用 ArkTS 編寫的 SpinKit 加載動(dòng)畫庫的示例代碼。假設(shè) SpinKit 提供了多種加載動(dòng)畫樣式,下面的示例展示了如何在應(yīng)用中集成并使用這些動(dòng)畫。

1. SpinKit 動(dòng)畫組件示例

// SpinKit.ts
export default class SpinKit {
  // 圓形旋轉(zhuǎn)動(dòng)畫
  static CircleSpinner() {
    return (
      <div>
        <progress-circle
          color="#00BFFF"
          strokeWidth={5}
          radius={30}
        />
      </div>
    );
  }


  // 三個(gè)彈跳點(diǎn)動(dòng)畫
  static ThreeBounceSpinner() {
    return (
      <div>
        <progress-bouncing-dots
          color="#00BFFF"
          dotRadius={10}
          bounceHeight={20}
        />
      </div>
    );
  }


  // 矩形方塊加載動(dòng)畫
  static RectangleSpinner() {
    return (
      <div>
        <progress-rectangles
          color="#00BFFF"
          count={5}
          width={10}
          height={30}
          space={5}
        />
      </div>
    );
  }
}

2. 使用 SpinKit 加載動(dòng)畫

以下是如何在 ArkTS 應(yīng)用中使用 SpinKit 動(dòng)畫的示例:

import SpinKit from './SpinKit';


function onCreate() {
  // 顯示不同樣式的加載動(dòng)畫
  return (
    <View>
      <Text>Circle Spinner:</Text>
      {SpinKit.CircleSpinner()}


      <Text>Three Bounce Spinner:</Text>
      {SpinKit.ThreeBounceSpinner()}


      <Text>Rectangle Spinner:</Text>
      {SpinKit.RectangleSpinner()}
    </View>
  );
}

解釋一下:

  1. SpinKit 動(dòng)畫組件:封裝了幾種常見的加載動(dòng)畫樣式,分別是:
    • CircleSpinner:圓形旋轉(zhuǎn)加載動(dòng)畫,使用 progress-circle 標(biāo)簽實(shí)現(xiàn),設(shè)置了顏色、半徑、以及線寬。
    • ThreeBounceSpinner:三個(gè)彈跳點(diǎn)動(dòng)畫,使用 progress-bouncing-dots 標(biāo)簽實(shí)現(xiàn),設(shè)置了顏色、點(diǎn)的半徑以及彈跳高度。
    • RectangleSpinner:矩形方塊加載動(dòng)畫,使用 progress-rectangles 標(biāo)簽實(shí)現(xiàn),設(shè)置了方塊的寬高、顏色、以及方塊間的間距。

  1. 使用 SpinKit 動(dòng)畫:通過 onCreate 函數(shù),將多個(gè)加載動(dòng)畫渲染在頁面上,分別展示了圓形、彈跳點(diǎn)和矩形方塊的加載動(dòng)畫。這些動(dòng)畫可以在不同的場景中使用,例如網(wǎng)絡(luò)請求等待或后臺(tái)任務(wù)處理中。

通過這樣的封裝,SpinKit 提供了一套加載動(dòng)畫庫,開發(fā)者可以輕松地將其集成到 HarmonyOS 應(yīng)用中,提高用戶界面的動(dòng)態(tài)交互體驗(yàn)。

4. harmony-dialog

這是一款極為簡單易用的零侵入彈窗,僅需一行代碼即可輕松實(shí)現(xiàn),無論在何處都能夠輕松彈出。其涵蓋了 AlertDialog、TipsDialog、ConfirmDialog、SelectDialog、CustomContentDialog、TextInputDialog、TextAreaDialog、BottomSheetDialog、ActionSheetDialog、CustomDialog、LoadingDialog、LoadingProgress、Toast、ToastTip 等多種類型,能夠滿足各種不同的彈窗開發(fā)需求。

咱們來使用一下,寫一個(gè)基于 ArkTS 編寫的一個(gè)彈窗庫的示例代碼,展示如何使用這些不同類型的彈窗,如 AlertDialog、ConfirmDialog、Toast 等。該庫設(shè)計(jì)為零侵入,開發(fā)者只需一行代碼即可輕松實(shí)現(xiàn)彈窗效果。

1. 彈窗庫示例 (DialogUtil)

// DialogUtil.ts
export default class DialogUtil {
  // 顯示AlertDialog
  static showAlertDialog(title: string, message: string) {
    return (
      <dialog
        type="alert"
        title={title}
        message={message}
        buttonText="OK"
        onButtonClick={() => console.log('AlertDialog OK clicked')}
      />
    );
  }


  // 顯示ConfirmDialog
  static showConfirmDialog(title: string, message: string, onConfirm: () => void, onCancel: () => void) {
    return (
      <dialog
        type="confirm"
        title={title}
        message={message}
        confirmButtonText="Yes"
        cancelButtonText="No"
        onConfirmClick={onConfirm}
        onCancelClick={onCancel}
      />
    );
  }


  // 顯示LoadingDialog
  static showLoadingDialog(message: string) {
    return (
      <dialog
        type="loading"
        message={message}
      />
    );
  }


  // 顯示Toast消息
  static showToast(message: string, duration: number = 2000) {
    setTimeout(() => {
      console.log(`Toast: ${message}`);
    }, duration);
  }


  // 顯示TextInputDialog
  static showTextInputDialog(title: string, onConfirm: (input: string) => void) {
    let inputValue = '';
    return (
      <dialog
        type="text-input"
        title={title}
        inputHint="Enter text here"
        onConfirmClick={() => onConfirm(inputValue)}
      />
    );
  }
}

2. 使用 DialogUtil 彈窗示例

以下是如何在應(yīng)用中使用這些彈窗的示例代碼:

import DialogUtil from './DialogUtil';


function onCreate() {
  // 顯示AlertDialog
  const alertDialog = DialogUtil.showAlertDialog('Alert', 'This is an alert dialog.');

  
  // 顯示ConfirmDialog
  const confirmDialog = DialogUtil.showConfirmDialog(
    'Confirm',
    'Do you want to continue?',
    () => console.log('Confirmed'),
    () => console.log('Cancelled')
  );

  
  // 顯示LoadingDialog
  const loadingDialog = DialogUtil.showLoadingDialog('Loading, please wait...');


  // 顯示Toast
  DialogUtil.showToast('This is a toast message');

  
  // 顯示TextInputDialog
  const textInputDialog = DialogUtil.showTextInputDialog('Input', (input: string) => {
    console.log(`Input received: ${input}`);
  });

  
  // 將這些彈窗按需渲染在界面上
  return (
    <View>
      {alertDialog}
      {confirmDialog}
      {loadingDialog}
      {textInputDialog}
    </View>
  );
}

解釋一下代碼:

  1. DialogUtil 彈窗庫
    • AlertDialog:簡單的提示框,只有一個(gè)“OK”按鈕,用于顯示緊急或重要信息。
    • ConfirmDialog:帶確認(rèn)和取消按鈕的確認(rèn)框,用戶可以選擇確認(rèn)或取消操作,分別執(zhí)行不同的回調(diào)函數(shù)。
    • LoadingDialog:用于顯示加載中的進(jìn)度提示,常用于網(wǎng)絡(luò)請求或其他異步任務(wù)。
    • Toast:簡短的提示信息,自動(dòng)消失,常用于向用戶展示非阻塞的提示。
    • TextInputDialog:帶有文本輸入框的對話框,用戶可以輸入信息并確認(rèn)。

  1. 使用示例
    • onCreate 方法中,我們展示了如何創(chuàng)建并顯示不同類型的彈窗。通過調(diào)用 DialogUtil 中的靜態(tài)方法,可以快速創(chuàng)建所需的彈窗并處理用戶的輸入或選擇。
    • 每個(gè)彈窗都被定義為一個(gè)單獨(dú)的 dialog 標(biāo)簽,可以根據(jù)用戶操作的不同觸發(fā)點(diǎn)擊事件或回調(diào)函數(shù)。例如,點(diǎn)擊 ConfirmDialog 中的“確認(rèn)”按鈕,會(huì)執(zhí)行指定的回調(diào)函數(shù)。

通過這種封裝,我們可以輕松使用多種類型的彈窗,只需一行代碼即可實(shí)現(xiàn)所需的彈窗效果,簡化了在 OpenHarmony/HarmonyOS 中彈窗的使用流程。

5. PullToRefresh

PullToRefresh是一款OpenHarmony環(huán)境下可用的下拉刷新、上拉加載組件。 支持設(shè)置內(nèi)置動(dòng)畫的各種屬性,支持設(shè)置自定義動(dòng)畫,支持lazyForEarch的數(shù)據(jù)作為數(shù)據(jù)源。

咱們來寫一個(gè)基于 ArkTS 編寫的 PullToRefresh 組件的示例代碼,展示如何使用該組件實(shí)現(xiàn)下拉刷新和上拉加載的功能。該組件支持內(nèi)置動(dòng)畫、自定義動(dòng)畫以及 lazyForEach 數(shù)據(jù)源,極大簡化了數(shù)據(jù)列表的刷新和加載操作。

1. PullToRefresh 組件示例 (PullToRefresh.ts)

// PullToRefresh.ts
export default class PullToRefresh {
  private data: Array<string>;
  private loading: boolean;


  constructor() {
    this.data = [];
    this.loading = false;
  }


  // 下拉刷新事件
  onRefresh(callback: () => void) {
    this.loading = true;
    setTimeout(() => {
      this.data = ['New Data 1', 'New Data 2', 'New Data 3'];
      this.loading = false;
      callback();
    }, 2000); // 模擬2秒的網(wǎng)絡(luò)請求
  }


  // 上拉加載事件
  onLoadMore(callback: () => void) {
    this.loading = true;
    setTimeout(() => {
      this.data.push('More Data 1', 'More Data 2');
      this.loading = false;
      callback();
    }, 2000); // 模擬2秒的加載更多數(shù)據(jù)
  }


  // 渲染數(shù)據(jù)列表
  renderList() {
    return (
      <lazyForEach items={this.data}>
        {(item) => (
          <list-item>
            <text>{item}</text>
          </list-item>
        )}
      </lazyForEach>
    );
  }


  // 渲染組件
  renderComponent() {
    return (
      <pull-to-refresh
        onRefresh={() => this.onRefresh(() => console.log('Refreshed!'))}
        onLoadMore={() => this.onLoadMore(() => console.log('Loaded more!'))}
        refreshing={this.loading}
      >
        {this.renderList()}
      </pull-to-refresh>
    );
  }
}

2. 使用 PullToRefresh 組件

以下是如何在應(yīng)用中使用 PullToRefresh 組件的示例代碼:

import PullToRefresh from './PullToRefresh';


function onCreate() {
  const pullToRefreshComponent = new PullToRefresh();

  
  return (
    <View>
      {pullToRefreshComponent.renderComponent()}
    </View>
  );
}

解釋一下:

  1. PullToRefresh 組件的設(shè)計(jì)
    • 數(shù)據(jù)管理:組件內(nèi)部維護(hù)了一個(gè) data 數(shù)組來存儲(chǔ)顯示的內(nèi)容,通過 onRefresh 方法刷新數(shù)據(jù)、通過 onLoadMore 方法加載更多數(shù)據(jù)。
    • 刷新和加載事件:下拉刷新和上拉加載的事件通過回調(diào)函數(shù)來處理,這里使用了定時(shí)器模擬2秒的異步請求,完成后調(diào)用回調(diào)函數(shù)刷新界面。
    • 懶加載數(shù)據(jù)源:組件使用了 lazyForEach 來渲染數(shù)據(jù)列表,每個(gè)數(shù)據(jù)項(xiàng)都以 list-item 的形式展示。這種方式能夠有效處理大規(guī)模數(shù)據(jù),提高渲染性能。
    • 動(dòng)畫支持PullToRefresh 組件內(nèi)部默認(rèn)支持下拉和上拉加載的內(nèi)置動(dòng)畫,并且可以通過 refreshing 屬性控制加載狀態(tài)。

  1. 使用示例
    • onCreate 方法中,我們創(chuàng)建了 PullToRefresh 組件的實(shí)例,并通過調(diào)用 renderComponent 來渲染整個(gè)下拉刷新和上拉加載的功能。
    • 當(dāng)用戶下拉刷新時(shí),組件會(huì)自動(dòng)調(diào)用 onRefresh 事件并觸發(fā)回調(diào)函數(shù),加載新的數(shù)據(jù);當(dāng)用戶上拉加載更多時(shí),onLoadMore 事件會(huì)被觸發(fā),加載更多的數(shù)據(jù)到列表中。

這種設(shè)計(jì)將下拉刷新、上拉加載與數(shù)據(jù)的動(dòng)態(tài)渲染結(jié)合起來,提供了一種高效且易于使用的組件方案。在 OpenHarmony 環(huán)境中,開發(fā)者可以通過這一組件輕松實(shí)現(xiàn)數(shù)據(jù)的動(dòng)態(tài)加載功能,并支持自定義動(dòng)畫和數(shù)據(jù)渲染方式。

6. ImageKnife

ImageKnife專門為OpenHarmony打造的一款圖像加載緩存庫,致力于更高效、更輕便、更簡單。 支持自定義內(nèi)存緩存策略,支持設(shè)置內(nèi)存緩存的大小(默認(rèn)LRU策略)。

  • 支持磁盤二級緩存,對于下載圖片會(huì)保存一份至磁盤當(dāng)中
  • 支持自定義實(shí)現(xiàn)圖片獲取/網(wǎng)絡(luò)下載
  • 支持監(jiān)聽網(wǎng)絡(luò)下載回調(diào)進(jìn)度
  • 繼承Image的能力,支持option傳入border,設(shè)置邊框,圓角
  • 繼承Image的能力,支持option傳入objectFit設(shè)置圖片縮放,包括objectFit為auto時(shí)根據(jù)圖片自適應(yīng)高度
  • 支持通過設(shè)置transform縮放圖片
  • 并發(fā)請求數(shù)量,支持請求排隊(duì)隊(duì)列的優(yōu)先級
  • 支持生命周期已銷毀的圖片,不再發(fā)起請求
  • 自定義緩存key
  • 自定義http網(wǎng)絡(luò)請求頭
  • 支持writeCacheStrategy控制緩存的存入策略(只存入內(nèi)存或文件緩存)
  • 支持preLoadCache預(yù)加載圖片
  • 支持onlyRetrieveFromCache僅用緩存加載
  • 支持使用一個(gè)或多個(gè)圖片變換,如模糊,高亮等

咱們來寫一個(gè)基于 ArkTS 編寫的 ImageKnife 圖像加載緩存庫的示例代碼,展示如何使用該庫高效地加載和緩存圖像。ImageKnife 支持自定義內(nèi)存緩存策略,并允許開發(fā)者設(shè)置緩存大?。J(rèn)為 LRU 策略)。

1. ImageKnife 庫示例 (ImageKnife.ts)

// ImageKnife.ts
class ImageCache {
  private cache: Map<string, string>;
  private maxSize: number;


  constructor(maxSize: number = 10) {
    this.cache = new Map<string, string>();
    this.maxSize = maxSize;
  }


  // 獲取圖像
  get(url: string): string | undefined {
    return this.cache.get(url);
  }


  // 存儲(chǔ)圖像
  set(url: string, image: string) {
    if (this.cache.size >= this.maxSize) {
      // 移除最久未使用的圖像
      const firstKey = this.cache.keys().next().value;
      this.cache.delete(firstKey);
    }
    this.cache.set(url, image);
  }
}


export default class ImageKnife {
  private cache: ImageCache;


  constructor(maxSize: number = 10) {
    this.cache = new ImageCache(maxSize);
  }


  // 加載圖像
  loadImage(url: string): Promise<string> {
    return new Promise((resolve, reject) => {
      // 先從緩存中獲取圖像
      const cachedImage = this.cache.get(url);
      if (cachedImage) {
        resolve(cachedImage);
        return;
      }


      // 模擬網(wǎng)絡(luò)加載圖像
      setTimeout(() => {
        const image = `Loaded image from ${url}`; // 模擬加載的圖像
        this.cache.set(url, image);
        resolve(image);
      }, 1000); // 模擬1秒的網(wǎng)絡(luò)請求
    });
  }
}

2. 使用 ImageKnife 組件

以下是如何在應(yīng)用中使用 ImageKnife 進(jìn)行圖像加載和緩存的示例代碼:

import ImageKnife from './ImageKnife';


function onCreate() {
  const imageKnife = new ImageKnife(5); // 設(shè)置最大緩存大小為5


  // 加載圖像
  imageKnife.loadImage('https://example.com/image1.png').then((image) => {
    console.log(image); // 輸出: Loaded image from https://example.com/image1.png
  });


  // 加載同一圖像,應(yīng)該從緩存中獲取
  imageKnife.loadImage('https://example.com/image1.png').then((image) => {
    console.log(image); // 輸出: Loaded image from https://example.com/image1.png (來自緩存)
  });


  // 加載新圖像
  imageKnife.loadImage('https://example.com/image2.png').then((image) => {
    console.log(image); // 輸出: Loaded image from https://example.com/image2.png
  });
}

詳細(xì)解釋:

  1. ImageCache
    • 緩存結(jié)構(gòu):使用 Map 存儲(chǔ)圖像的 URL 和對應(yīng)的圖像數(shù)據(jù)。這個(gè)結(jié)構(gòu)允許快速存取。
    • 最大緩存大小:通過 maxSize 屬性限制緩存的最大數(shù)量。當(dāng)緩存達(dá)到最大限制時(shí),最久未使用的圖像會(huì)被移除以騰出空間(實(shí)現(xiàn)了簡單的 LRU 策略)。
    • 獲取和存儲(chǔ)get 方法用于從緩存中獲取圖像,set 方法用于將圖像存入緩存并管理緩存大小。

  1. ImageKnife
    • 圖像加載loadImage 方法用于加載圖像。首先檢查緩存中是否已有圖像,如果有則直接返回。如果沒有,則模擬網(wǎng)絡(luò)請求加載圖像并將其存入緩存。
    • 異步處理:使用 Promise 來處理異步加載的結(jié)果,使得調(diào)用該方法時(shí)可以使用 .then() 方法處理加載結(jié)果。

  1. 使用示例
    • onCreate 方法中,創(chuàng)建了 ImageKnife 的實(shí)例,并設(shè)置最大緩存大小為 5。
    • 加載圖像時(shí),首先會(huì)檢查緩存。如果圖像已經(jīng)在緩存中,則直接返回;否則會(huì)模擬網(wǎng)絡(luò)請求加載圖像并存入緩存。

通過這種設(shè)計(jì),ImageKnife 提供了一個(gè)高效、簡單的圖像加載和緩存解決方案,適用于 OpenHarmony 環(huán)境中的應(yīng)用開發(fā)。開發(fā)者可以輕松設(shè)置緩存策略和大小,以滿足不同的應(yīng)用需求。

7. mpchart

mpchart各種類型的圖表庫,主要用于業(yè)務(wù)數(shù)據(jù)匯總,例如銷售數(shù)據(jù)走勢圖,股價(jià)走勢圖等場景中使用,方便開發(fā)者快速實(shí)現(xiàn)圖表UI。

我們來寫一個(gè)基于 ArkTS 編寫的 mpchart 圖表庫的示例代碼,展示如何使用該庫來繪制各種類型的圖表,如銷售數(shù)據(jù)走勢圖和股價(jià)走勢圖。這個(gè)庫旨在幫助開發(fā)者快速實(shí)現(xiàn)圖表用戶界面。

1. MPChart 庫示例 (MPChart.ts)

// MPChart.ts
class MPChart {
  private labels: Array<string>;
  private data: Array<number>;
  private type: string;


  constructor(labels: Array<string>, data: Array<number>, type: string = 'line') {
    this.labels = labels;
    this.data = data;
    this.type = type;
  }


  // 渲染圖表
  renderChart() {
    switch (this.type) {
      case 'line':
        return this.renderLineChart();
      case 'bar':
        return this.renderBarChart();
      case 'pie':
        return this.renderPieChart();
      default:
        return null;
    }
  }


  // 渲染折線圖
  private renderLineChart() {
    return (
      <view>
        <text>折線圖</text>
        <canvas>
          <lineChart
            labels={this.labels}
            data={this.data}
            lineColor="#ff5733"
            fillColor="rgba(255, 87, 51, 0.3)"
          />
        </canvas>
      </view>
    );
  }


  // 渲染柱狀圖
  private renderBarChart() {
    return (
      <view>
        <text>柱狀圖</text>
        <canvas>
          <barChart
            labels={this.labels}
            data={this.data}
            barColor="#33c1ff"
          />
        </canvas>
      </view>
    );
  }


  // 渲染餅圖
  private renderPieChart() {
    return (
      <view>
        <text>餅圖</text>
        <canvas>
          <pieChart
            labels={this.labels}
            data={this.data}
            colors={['#ff6384', '#36a2eb', '#cc65fe']}
          />
        </canvas>
      </view>
    );
  }
}

2. 使用 MPChart 組件

以下是如何在應(yīng)用中使用 MPChart 來繪制不同類型圖表的示例代碼:

import MPChart from './MPChart';


function onCreate() {
  const labels = ['January', 'February', 'March', 'April', 'May'];
  const salesData = [30, 50, 70, 40, 90]; // 銷售數(shù)據(jù)
  const priceData = [100, 120, 80, 130, 110]; // 股價(jià)數(shù)據(jù)


  return (
    <view>
      {/* 渲染銷售數(shù)據(jù)折線圖 */}
      <MPChart labels={labels} data={salesData} type="line" />


      {/* 渲染股價(jià)數(shù)據(jù)柱狀圖 */}
      <MPChart labels={labels} data={priceData} type="bar" />


      {/* 渲染銷售數(shù)據(jù)餅圖 */}
      <MPChart labels={labels} data={salesData} type="pie" />
    </view>
  );
}

解釋一下代碼:

  1. MPChart
    • 構(gòu)造函數(shù):接收圖表的標(biāo)簽、數(shù)據(jù)和類型(如折線圖、柱狀圖、餅圖)。
    • renderChart 方法:根據(jù)圖表類型調(diào)用相應(yīng)的渲染方法。
    • 渲染方法
      • renderLineChart:渲染折線圖,使用 lineChart 組件。
      • renderBarChart:渲染柱狀圖,使用 barChart 組件。
      • renderPieChart:渲染餅圖,使用 pieChart 組件。

  1. 使用示例
    • onCreate 方法中,我們定義了一組標(biāo)簽和對應(yīng)的銷售數(shù)據(jù)及股價(jià)數(shù)據(jù)。
    • 使用 MPChart 組件分別渲染銷售數(shù)據(jù)的折線圖、股價(jià)數(shù)據(jù)的柱狀圖和銷售數(shù)據(jù)的餅圖。

這種設(shè)計(jì)使得開發(fā)者能夠快速實(shí)現(xiàn)多種類型的圖表,簡化了圖表的繪制過程,并且能夠通過更改參數(shù)輕松切換不同的圖表類型。mpchart 庫的靈活性和易用性使得它非常適合用于商業(yè)數(shù)據(jù)的可視化。

8. Zxing

Zxing是一款解析和生成一維碼、二維碼的三方組件,用于聲明式應(yīng)用開發(fā),支持多種一維碼、二維碼的的解析與生成功能。

咱們來寫一個(gè)基于 ArkTS 編寫的 Zxing 組件示例代碼,展示如何使用該組件生成和解析二維碼及一維碼。Zxing 是一個(gè)強(qiáng)大的工具,廣泛用于二維碼和條形碼的創(chuàng)建與解讀。

1. Zxing 庫示例 (Zxing.ts)

// Zxing.ts
import { QRCode } from 'zxing-js'; // 假設(shè)引入ZXing相關(guān)的庫


export default class Zxing {
  // 生成二維碼
  static generateQRCode(data: string, size: number = 256): string {
    const qrCode = new QRCode();
    qrCode.setErrorCorrectionLevel('L'); // 設(shè)置錯(cuò)誤校正級別
    qrCode.setMargin(1); // 設(shè)置邊距


    return qrCode.createDataURL(data, {
      width: size,
      height: size,
      color: {
        dark: '#000000',  // 二維碼顏色
        light: '#ffffff',  // 背景顏色
      },
    });
  }


  // 解析二維碼
  static async decodeQRCode(image: string): Promise<string | null> {
    const qrCodeReader = new QRCode();
    try {
      const result = await qrCodeReader.decode(image);
      return result; // 返回解碼后的內(nèi)容
    } catch (error) {
      console.error('解碼失敗:', error);
      return null; // 解碼失敗返回null
    }
  }
}

2. 使用 Zxing 組件

以下是如何在應(yīng)用中使用 Zxing 來生成和解析二維碼的示例代碼:

import Zxing from './Zxing';


function onCreate() {
  const qrData = "Hello, Zxing!"; // 要編碼的數(shù)據(jù)
  const qrCodeImage = Zxing.generateQRCode(qrData); // 生成二維碼的data URL


  // 顯示二維碼
  console.log('二維碼生成成功:', qrCodeImage);


  // 假設(shè)你從某個(gè)地方獲取了二維碼圖像數(shù)據(jù)進(jìn)行解碼
  const qrCodeToDecode = qrCodeImage; // 在真實(shí)場景中應(yīng)傳入實(shí)際圖像


  // 解析二維碼
  Zxing.decodeQRCode(qrCodeToDecode).then((result) => {
    if (result) {
      console.log('解碼結(jié)果:', result); // 輸出解碼結(jié)果
    } else {
      console.log('解碼失敗');
    }
  });
}

解釋一下代碼:

  1. Zxing
    • generateQRCode 方法
      • 該方法用于生成二維碼,接受要編碼的數(shù)據(jù)和二維碼的大小作為參數(shù)。
      • 使用 QRCode 類創(chuàng)建二維碼,并設(shè)置錯(cuò)誤校正級別和邊距。
      • 返回生成的二維碼數(shù)據(jù) URL,可以直接用于 <img> 標(biāo)簽的 src 屬性。
    • decodeQRCode 方法
      • 異步解析傳入的二維碼圖像數(shù)據(jù),返回解碼后的內(nèi)容。
      • 如果解碼失敗,則返回 null。

  1. 使用示例
    • onCreate 方法中,首先定義要編碼的字符串,然后調(diào)用 generateQRCode 方法生成二維碼的圖像數(shù)據(jù) URL。
    • 可以將生成的二維碼圖像顯示在用戶界面上(例如通過 <img> 標(biāo)簽)。
    • 隨后調(diào)用 decodeQRCode 方法解析二維碼,輸出解碼后的結(jié)果。

通過這種設(shè)計(jì),Zxing 組件為開發(fā)者提供了方便的二維碼和條形碼生成與解析功能,簡化了相關(guān)操作,使得聲明式應(yīng)用開發(fā)更加高效。

9. ijkplayer

ijkplayer是OpenHarmony環(huán)境下可用的一款基于FFmpeg的視頻播放器。

咱們來寫一個(gè)基于 ArkTS 編寫的 ijkplayer 示例代碼,展示如何在 OpenHarmony 環(huán)境中使用基于 FFmpeg 的視頻播放器 ijkplayerijkplayer 是一個(gè)強(qiáng)大的播放器,支持多種格式的視頻播放,適用于開發(fā)豐富的多媒體應(yīng)用。

1. IJKPlayer 組件示例 (IJKPlayer.ts)

// IJKPlayer.ts
import { Player } from 'ijkplayer-js'; // 假設(shè)引入ijkplayer相關(guān)的庫


export default class IJKPlayer {
  private player: Player;


  constructor(videoUrl: string) {
    this.player = new Player(); // 創(chuàng)建播放器實(shí)例
    this.player.setDataSource(videoUrl); // 設(shè)置視頻源
  }


  // 播放視頻
  play() {
    this.player.prepare().then(() => {
      this.player.start(); // 準(zhǔn)備完成后開始播放
    }).catch(error => {
      console.error('播放失敗:', error);
    });
  }


  // 暫停視頻
  pause() {
    this.player.pause();
  }


  // 停止視頻
  stop() {
    this.player.stop();
  }


  // 設(shè)置視頻全屏
  setFullScreen() {
    this.player.setFullScreen(true);
  }


  // 銷毀播放器
  release() {
    this.player.release();
  }
}

2. 使用 IJKPlayer 組件

以下是如何在應(yīng)用中使用 IJKPlayer 播放視頻的示例代碼:

import IJKPlayer from './IJKPlayer';


function onCreate() {
  const videoUrl = 'https://example.com/video.mp4'; // 視頻源地址
  const player = new IJKPlayer(videoUrl); // 創(chuàng)建播放器實(shí)例


  // 播放視頻
  player.play();


  // 假設(shè)在某個(gè)時(shí)刻你想暫停播放
  setTimeout(() => {
    player.pause();
    console.log('視頻已暫停');
  }, 5000); // 5秒后暫停


  // 假設(shè)在某個(gè)時(shí)刻你想停止播放
  setTimeout(() => {
    player.stop();
    console.log('視頻已停止');
    player.release(); // 釋放播放器資源
  }, 10000); // 10秒后停止
}

解釋一下代碼:

  1. IJKPlayer
    • 構(gòu)造函數(shù):接收視頻 URL 并創(chuàng)建 Player 實(shí)例,設(shè)置視頻源。
    • play 方法:準(zhǔn)備視頻并開始播放。使用 prepare 方法預(yù)加載視頻,成功后調(diào)用 start 方法開始播放,失敗時(shí)輸出錯(cuò)誤信息。
    • pause 方法:調(diào)用播放器的 pause 方法以暫停視頻播放。
    • stop 方法:調(diào)用播放器的 stop 方法以停止視頻播放。
    • setFullScreen 方法:設(shè)置視頻為全屏播放。
    • release 方法:釋放播放器資源,避免內(nèi)存泄漏。

  1. 使用示例
    • onCreate 方法中,定義視頻的 URL,并創(chuàng)建 IJKPlayer 實(shí)例。
    • 調(diào)用 play 方法開始播放視頻。
    • 使用 setTimeout 模擬在 5 秒后暫停視頻播放,并在 10 秒后停止播放和釋放播放器資源。

通過這種設(shè)計(jì),ijkplayer 提供了一種簡單有效的方式來播放視頻,適用于 OpenHarmony 環(huán)境中的多媒體應(yīng)用開發(fā)。開發(fā)者可以根據(jù)需求添加更多功能,如控制音量、播放進(jìn)度、切換視頻源等。

10. pinyin4js

pinyin4js適配了OpenHarmony的一款漢字轉(zhuǎn)拼音的Javascript開源庫,包含如下特性:

  • 零依賴

  • 詞庫靈活導(dǎo)入,打包 可以自行調(diào)整字典,具體可以參照src/dict;所有資源調(diào)用由PinyinResource封裝,可自行修改后打包

  • 準(zhǔn)確、完善的字庫 Unicode編碼從4E00-9FA5范圍及3007(〇)的20903個(gè)漢字中,pinyin4js能轉(zhuǎn)換除46個(gè)異體字(異體字不存在標(biāo)準(zhǔn)拼音)之外的所有漢字

  • 拼音轉(zhuǎn)換速度快 經(jīng)測試,從4E00-9FA5范圍的20902個(gè)漢字,pinyin4js耗時(shí)約110毫秒

  • 多拼音格式輸出支持 支持多種拼音輸出格式:帶音標(biāo)、不帶音標(biāo)、數(shù)字表示音標(biāo)以及拼音首字母輸出格式

  • 常見多音字識(shí)別 支持常見多音字的識(shí)別,其中包括詞組、成語、地名等
  • 簡繁體中文轉(zhuǎn)換
  • 支持添加自定義字典

咱們來寫一個(gè)基于 ArkTS 編寫的 pinyin4js 示例代碼,展示如何在 OpenHarmony 環(huán)境中使用該庫將漢字轉(zhuǎn)換為拼音。pinyin4js 是一個(gè)開源庫,提供了漢字到拼音的轉(zhuǎn)換功能,非常適合需要處理中文文本的應(yīng)用。

1. Pinyin4js 組件示例 (Pinyin4js.ts)

// Pinyin4js.ts
import { PinyinHelper } from 'pinyin4js'; // 假設(shè)引入pinyin4js相關(guān)的庫


export default class PinyinConverter {
  // 轉(zhuǎn)換漢字為拼音
  static convertToPinyin(input: string): string[] {
    const pinyinArray = PinyinHelper.convertToPinyinString(input, "", PinyinHelper.WITH_TONE_MARK); // 生成拼音
    return pinyinArray.split(','); // 返回拼音數(shù)組
  }
}

2. 使用 PinyinConverter 組件

以下是如何在應(yīng)用中使用 PinyinConverter 將漢字轉(zhuǎn)換為拼音的示例代碼:

import PinyinConverter from './Pinyin4js';


function onCreate() {
  const chineseText = '漢字轉(zhuǎn)拼音'; // 待轉(zhuǎn)換的漢字
  const pinyinArray = PinyinConverter.convertToPinyin(chineseText); // 轉(zhuǎn)換為拼音


  console.log('原文:', chineseText);
  console.log('拼音:', pinyinArray.join(', ')); // 輸出拼音
}

解釋一下代碼:

  1. PinyinConverter
    • convertToPinyin 方法
      • 接收一個(gè)漢字字符串作為輸入,使用 PinyinHelper.convertToPinyinString 方法將其轉(zhuǎn)換為拼音字符串。
      • convertToPinyinString 的參數(shù)說明:
      • 第一個(gè)參數(shù)是待轉(zhuǎn)換的漢字字符串。
      • 第二個(gè)參數(shù)是連接符,這里使用空字符串("")表示拼音之間不使用連接符。
      • 第三個(gè)參數(shù)指定拼音的格式,這里選擇 PinyinHelper.WITH_TONE_MARK 以帶音調(diào)的拼音形式返回。
      • 最后將拼音字符串按逗號(hào)分割并返回拼音數(shù)組。

  1. 使用示例
    • onCreate 方法中,定義待轉(zhuǎn)換的漢字字符串,然后調(diào)用 convertToPinyin 方法進(jìn)行轉(zhuǎn)換。
    • 輸出原文和轉(zhuǎn)換后的拼音。

通過這種設(shè)計(jì),pinyin4js 提供了一種簡便的方式來處理漢字與拼音之間的轉(zhuǎn)換,非常適合在涉及中文文本的應(yīng)用中使用,開發(fā)者可以根據(jù)需求對其進(jìn)行擴(kuò)展或修改。

最后

HarmonyOS NEXT 正式版即將發(fā)布,你在學(xué)習(xí)鴻蒙的過程還有哪些好用的工具庫嗎,歡迎分享給V 哥,關(guān)注威哥愛編程,一起學(xué)習(xí)鴻蒙開發(fā)。HarmonyOS開發(fā)工具庫全攻略:10款必備工具推薦saveMetasaveMeta

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)