10款好用的開源 HarmonyOS 工具庫

来源:https://www.cnblogs.com/wgjava/p/18441187
-Advertisement-
Play Games

大家好,我是 V 哥,今天給大家分享10款好用的 HarmonyOS的工具庫,在開發鴻蒙應用時可以用下,好用的工具可以簡化代碼,讓你寫出優雅的應用來。廢話不多說,馬上開整。 1. efTool efTool是一個功能豐富且易用的相容API12的HarmonyOS工具庫,通過諸多實用工具類的使用,旨在 ...


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

1. efTool

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

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

1. 字元串工具類 (StrUtil)

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

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

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

2. 擴展的UI組件示例

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

export default class ExtTextComponent {
  // 一個自定義的文本組件,支持傳入自定義樣式
  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}
      />
    );
  }

  // 用來組合多個文本的展示
  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 和 擴展的 ExtTextComponent

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

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:提供一些常用的字元串操作方法,例如判斷字元串是否為空、轉換為大寫、檢查是否包含子字元串等。 這些方法旨在簡化開發中對字元串的常見處理操作。

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

  3. 整合示例onCreate 函數展示瞭如何利用 StrUtilExtTextComponent 一起工作,處理邏輯並動態渲染內容到頁面上。

通過這種方式,efTool 不僅能幫助處理基礎的字元串等數據類型操作,還能通過擴展 HarmonyOS 的組件庫,簡化界面開發任務。efTool還有更多好用的工具,可以試試哦。

2. harmony-utils

harmony-utils 一款功能豐富且極易上手的HarmonyOS工具庫,藉助眾多實用工具類,致力於助力開發者迅速構建鴻蒙應用。其封裝的工具涵蓋了APP、設備、屏幕、授權、通知、線程間通信、彈框、吐司、生物認證、用戶首選項、拍照、相冊、掃碼、文件、日誌,異常捕獲、字元、字元串、數字、集合、日期、隨機、base64、加密、解密、JSON等一系列的功能和操作,能夠滿足各種不同的開發需求。

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

1. APP工具類 (AppUtil)

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

  // 退出應用
  static exitApp() {
    // 使用HarmonyOS API來退出應用
    console.log('Exiting the app...');
    // 調用API以退出應用,如需要可以調用系統相關功能
  }
}

2. 設備工具類 (DeviceUtil)

// DeviceUtil.ts
export default class DeviceUtil {
  // 獲取設備信息
  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 {
  // 獲取當前日期
  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 {
  // 顯示短時間提示
  static showToastShort(message: string) {
    // 使用HarmonyOS的Toast API
    console.log(`Short Toast: ${message}`);
  }

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

5. 使用 harmony-utils 中的工具

以下是如何在應用中整合使用 AppUtilDeviceUtilDateUtilToastUtil 的示例:

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

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

  // 獲取設備信息
  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}`);

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

  // 顯示吐司
  ToastUtil.showToastShort('Welcome to HarmonyOS!');
  
  // 退出應用示例
  setTimeout(() => {
    AppUtil.exitApp();
  }, 5000); // 5秒後退出應用
}

解釋一下代碼:

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

  2. 設備工具類 (DeviceUtil):用於獲取設備的基本信息(品牌、型號、操作系統版本)以及屏幕信息(解析度和密度),讓開發者在不同設備上自適應界面設計。

  3. 日期工具類 (DateUtil):封裝了日期操作,可以獲取當前日期併進行格式化,方便開發者處理時間相關邏輯。

  4. 吐司工具類 (ToastUtil):用於在應用中顯示提示消息,簡化了對系統吐司的調用,支持短時間和長時間兩種不同的顯示模式。

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

通過這種封裝,harmony-utils 能夠極大提高開發效率,使開發者可以專註於業務邏輯而不必處理繁瑣的基礎操作。還有更多好用的工具等你來使用。

3. SpinKit(API12 - 5.0.3.800)

SpinKit 是一個適用於OpenHarmony/HarmonyOS的載入動畫庫。

下麵是使用 ArkTS 編寫的 SpinKit 載入動畫庫的示例代碼。假設 SpinKit 提供了多種載入動畫樣式,下麵的示例展示瞭如何在應用中集成並使用這些動畫。

1. SpinKit 動畫組件示例

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

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

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

2. 使用 SpinKit 載入動畫

以下是如何在 ArkTS 應用中使用 SpinKit 動畫的示例:

import SpinKit from './SpinKit';

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

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

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

解釋一下:

  1. SpinKit 動畫組件:封裝了幾種常見的載入動畫樣式,分別是:

    • CircleSpinner:圓形旋轉載入動畫,使用 progress-circle 標簽實現,設置了顏色、半徑、以及線寬。
    • ThreeBounceSpinner:三個彈跳點動畫,使用 progress-bouncing-dots 標簽實現,設置了顏色、點的半徑以及彈跳高度。
    • RectangleSpinner:矩形方塊載入動畫,使用 progress-rectangles 標簽實現,設置了方塊的寬高、顏色、以及方塊間的間距。
  2. 使用 SpinKit 動畫:通過 onCreate 函數,將多個載入動畫渲染在頁面上,分別展示了圓形、彈跳點和矩形方塊的載入動畫。這些動畫可以在不同的場景中使用,例如網路請求等待或後臺任務處理中。

通過這樣的封裝,SpinKit 提供了一套載入動畫庫,開發者可以輕鬆地將其集成到 HarmonyOS 應用中,提高用戶界面的動態交互體驗。

4. harmony-dialog

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

咱們來使用一下,寫一個基於 ArkTS 編寫的一個彈窗庫的示例代碼,展示如何使用這些不同類型的彈窗,如 AlertDialogConfirmDialogToast 等。該庫設計為零侵入,開發者只需一行代碼即可輕鬆實現彈窗效果。

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 彈窗示例

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

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:簡單的提示框,只有一個“OK”按鈕,用於顯示緊急或重要信息。
    • ConfirmDialog:帶確認和取消按鈕的確認框,用戶可以選擇確認或取消操作,分別執行不同的回調函數。
    • LoadingDialog:用於顯示載入中的進度提示,常用於網路請求或其他非同步任務。
    • Toast:簡短的提示信息,自動消失,常用於向用戶展示非阻塞的提示。
    • TextInputDialog:帶有文本輸入框的對話框,用戶可以輸入信息並確認。
  2. 使用示例

    • onCreate 方法中,我們展示瞭如何創建並顯示不同類型的彈窗。通過調用 DialogUtil 中的靜態方法,可以快速創建所需的彈窗並處理用戶的輸入或選擇。
    • 每個彈窗都被定義為一個單獨的 dialog 標簽,可以根據用戶操作的不同觸發點擊事件或回調函數。例如,點擊 ConfirmDialog 中的“確認”按鈕,會執行指定的回調函數。

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

5. PullToRefresh

PullToRefresh是一款OpenHarmony環境下可用的下拉刷新、上拉載入組件。 支持設置內置動畫的各種屬性,支持設置自定義動畫,支持lazyForEarch的數據作為數據源。

咱們來寫一個基於 ArkTS 編寫的 PullToRefresh 組件的示例代碼,展示如何使用該組件實現下拉刷新和上拉載入的功能。該組件支持內置動畫、自定義動畫以及 lazyForEach 數據源,極大簡化了數據列表的刷新和載入操作。

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秒的網路請求
  }

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

  // 渲染數據列表
  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 組件

以下是如何在應用中使用 PullToRefresh 組件的示例代碼:

import PullToRefresh from './PullToRefresh';

function onCreate() {
  const pullToRefreshComponent = new PullToRefresh();
  
  return (
    <View>
      {pullToRefreshComponent.renderComponent()}
    </View>
  );
}

解釋一下:

  1. PullToRefresh 組件的設計

    • 數據管理:組件內部維護了一個 data 數組來存儲顯示的內容,通過 onRefresh 方法刷新數據、通過 onLoadMore 方法載入更多數據。
    • 刷新和載入事件:下拉刷新和上拉載入的事件通過回調函數來處理,這裡使用了定時器模擬2秒的非同步請求,完成後調用回調函數刷新界面。
    • 懶載入數據源:組件使用了 lazyForEach 來渲染數據列表,每個數據項都以 list-item 的形式展示。這種方式能夠有效處理大規模數據,提高渲染性能。
    • 動畫支持PullToRefresh 組件內部預設支持下拉和上拉載入的內置動畫,並且可以通過 refreshing 屬性控制載入狀態。
  2. 使用示例

    • onCreate 方法中,我們創建了 PullToRefresh 組件的實例,並通過調用 renderComponent 來渲染整個下拉刷新和上拉載入的功能。
    • 當用戶下拉刷新時,組件會自動調用 onRefresh 事件並觸發回調函數,載入新的數據;當用戶上拉載入更多時,onLoadMore 事件會被觸發,載入更多的數據到列表中。

這種設計將下拉刷新、上拉載入與數據的動態渲染結合起來,提供了一種高效且易於使用的組件方案。在 OpenHarmony 環境中,開發者可以通過這一組件輕鬆實現數據的動態載入功能,並支持自定義動畫和數據渲染方式。

6. ImageKnife

ImageKnife專門為OpenHarmony打造的一款圖像載入緩存庫,致力於更高效、更輕便、更簡單。
支持自定義記憶體緩存策略,支持設置記憶體緩存的大小(預設LRU策略)。

  • 支持磁碟二級緩存,對於下載圖片會保存一份至磁碟當中
  • 支持自定義實現圖片獲取/網路下載
  • 支持監聽網路下載回調進度
  • 繼承Image的能力,支持option傳入border,設置邊框,圓角
  • 繼承Image的能力,支持option傳入objectFit設置圖片縮放,包括objectFit為auto時根據圖片自適應高度
  • 支持通過設置transform縮放圖片
  • 併發請求數量,支持請求排隊隊列的優先順序
  • 支持生命周期已銷毀的圖片,不再發起請求
  • 自定義緩存key
  • 自定義http網路請求頭
  • 支持writeCacheStrategy控制緩存的存入策略(只存入記憶體或文件緩存)
  • 支持preLoadCache預載入圖片
  • 支持onlyRetrieveFromCache僅用緩存載入
  • 支持使用一個或多個圖片變換,如模糊,高亮等

咱們來寫一個基於 ArkTS 編寫的 ImageKnife 圖像載入緩存庫的示例代碼,展示如何使用該庫高效地載入和緩存圖像。ImageKnife 支持自定義記憶體緩存策略,並允許開發者設置緩存大小(預設為 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);
  }

  // 存儲圖像
  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;
      }

      // 模擬網路載入圖像
      setTimeout(() => {
        const image = `Loaded image from ${url}`; // 模擬載入的圖像
        this.cache.set(url, image);
        resolve(image);
      }, 1000); // 模擬1秒的網路請求
    });
  }
}

2. 使用 ImageKnife 組件

以下是如何在應用中使用 ImageKnife 進行圖像載入和緩存的示例代碼:

import ImageKnife from './ImageKnife';

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

  // 載入圖像
  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/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
  });
}

詳細解釋:

  1. ImageCache

    • 緩存結構:使用 Map 存儲圖像的 URL 和對應的圖像數據。這個結構允許快速存取。
    • 最大緩存大小:通過 maxSize 屬性限制緩存的最大數量。當緩存達到最大限制時,最久未使用的圖像會被移除以騰出空間(實現了簡單的 LRU 策略)。
    • 獲取和存儲get 方法用於從緩存中獲取圖像,set 方法用於將圖像存入緩存並管理緩存大小。
  2. ImageKnife

    • 圖像載入loadImage 方法用於載入圖像。首先檢查緩存中是否已有圖像,如果有則直接返回。如果沒有,則模擬網路請求載入圖像並將其存入緩存。
    • 非同步處理:使用 Promise 來處理非同步載入的結果,使得調用該方法時可以使用 .then() 方法處理載入結果。
  3. 使用示例

    • onCreate 方法中,創建了 ImageKnife 的實例,並設置最大緩存大小為 5。
    • 載入圖像時,首先會檢查緩存。如果圖像已經在緩存中,則直接返回;否則會模擬網路請求載入圖像並存入緩存。

通過這種設計,ImageKnife 提供了一個高效、簡單的圖像載入和緩存解決方案,適用於 OpenHarmony 環境中的應用開發。開發者可以輕鬆設置緩存策略和大小,以滿足不同的應用需求。

7. mpchart

mpchart各種類型的圖表庫,主要用於業務數據彙總,例如銷售數據走勢圖,股價走勢圖等場景中使用,方便開發者快速實現圖表UI。

我們來寫一個基於 ArkTS 編寫的 mpchart 圖表庫的示例代碼,展示如何使用該庫來繪製各種類型的圖表,如銷售數據走勢圖和股價走勢圖。這個庫旨在幫助開發者快速實現圖表用戶界面。

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 組件

以下是如何在應用中使用 MPChart 來繪製不同類型圖表的示例代碼:

import MPChart from './MPChart';

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

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

      {/* 渲染股價數據柱狀圖 */}
      <MPChart labels={labels} data={priceData} type="bar" />

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

解釋一下代碼:

  1. MPChart

    • 構造函數:接收圖表的標簽、數據和類型(如折線圖、柱狀圖、餅圖)。
    • renderChart 方法:根據圖表類型調用相應的渲染方法。
    • 渲染方法
      • renderLineChart:渲染折線圖,使用 lineChart 組件。
      • renderBarChart:渲染柱狀圖,使用 barChart 組件。
      • renderPieChart:渲染餅圖,使用 pieChart 組件。
  2. 使用示例

    • onCreate 方法中,我們定義了一組標簽和對應的銷售數據及股價數據。
    • 使用 MPChart 組件分別渲染銷售數據的折線圖、股價數據的柱狀圖和銷售數據的餅圖。

這種設計使得開發者能夠快速實現多種類型的圖表,簡化了圖表的繪製過程,並且能夠通過更改參數輕鬆切換不同的圖表類型。mpchart 庫的靈活性和易用性使得它非常適合用於商業數據的可視化。

8. Zxing

Zxing是一款解析和生成一維碼、二維碼的三方組件,用於聲明式應用開發,支持多種一維碼、二維碼的的解析與生成功能。

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

1. Zxing 庫示例 (Zxing.ts)

// Zxing.ts
import { QRCode } from 'zxing-js'; // 假設引入ZXing相關的庫

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

    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; // 返回解碼後的內容
    } catch (error) {
      console.error('解碼失敗:', error);
      return null; // 解碼失敗返回null
    }
  }
}

2. 使用 Zxing 組件

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

import Zxing from './Zxing';

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

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

  // 假設你從某個地方獲取了二維碼圖像數據進行解碼
  const qrCodeToDecode = qrCodeImage; // 在真實場景中應傳入實際圖像

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

解釋一下代碼:

  1. Zxing

    • generateQRCode 方法
      • 該方法用於生成二維碼,接受要編碼的數據和二維碼的大小作為參數。
      • 使用 QRCode 類創建二維碼,並設置錯誤校正級別和邊距。
      • 返回生成的二維碼數據 URL,可以直接用於 <img> 標簽的 src 屬性。
    • decodeQRCode 方法
      • 非同步解析傳入的二維碼圖像數據,返回解碼後的內容。
      • 如果解碼失敗,則返回 null
  2. 使用示例

    • onCreate 方法中,首先定義要編碼的字元串,然後調用 generateQRCode 方法生成二維碼的圖像數據 URL。
    • 可以將生成的二維碼圖像顯示在用戶界面上(例如通過 <img> 標簽)。
    • 隨後調用 decodeQRCode 方法解析二維碼,輸出解碼後的結果。

通過這種設計,Zxing 組件為開發者提供了方便的二維碼和條形碼生成與解析功能,簡化了相關操作,使得聲明式應用開發更加高效。

9. ijkplayer

ijkplayer是OpenHarmony環境下可用的一款基於FFmpeg的視頻播放器。

咱們來寫一個基於 ArkTS 編寫的 ijkplayer 示例代碼,展示如何在 OpenHarmony 環境中使用基於 FFmpeg 的視頻播放器 ijkplayerijkplayer 是一個強大的播放器,支持多種格式的視頻播放,適用於開發豐富的多媒體應用。

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

// IJKPlayer.ts
import { Player } from 'ijkplayer-js'; // 假設引入ijkplayer相關的庫

export default class IJKPlayer {
  private player: Player;

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

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

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

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

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

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

2. 使用 IJKPlayer 組件

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

import IJKPlayer from './IJKPlayer';

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

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

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

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

解釋一下代碼:

  1. IJKPlayer

    • 構造函數:接收視頻 URL 並創建 Player 實例,設置視頻源。
    • play 方法:準備視頻並開始播放。使用 prepare 方法預載入視頻,成功後調用 start 方法開始播放,失敗時輸出錯誤信息。
    • pause 方法:調用播放器的 pause 方法以暫停視頻播放。
    • stop 方法:調用播放器的 stop 方法以停止視頻播放。
    • setFullScreen 方法:設置視頻為全屏播放。
    • release 方法:釋放播放器資源,避免記憶體泄漏。
  2. 使用示例

    • onCreate 方法中,定義視頻的 URL,並創建 IJKPlayer 實例。
    • 調用 play 方法開始播放視頻。
    • 使用 setTimeout 模擬在 5 秒後暫停視頻播放,併在 10 秒後停止播放和釋放播放器資源。

通過這種設計,ijkplayer 提供了一種簡單有效的方式來播放視頻,適用於 OpenHarmony 環境中的多媒體應用開發。開發者可以根據需求添加更多功能,如控制音量、播放進度、切換視頻源等。

10. pinyin4js

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

  • 零依賴

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

  • 準確、完善的字型檔
    Unicode編碼從4E00-9FA5範圍及3007(〇)的20903個漢字中,pinyin4js能轉換除46個異體字(異體字不存在標準拼音)之外的所有漢字

  • 拼音轉換速度快
    經測試,從4E00-9FA5範圍的20902個漢字,pinyin4js耗時約110毫秒

  • 多拼音格式輸出支持
    支持多種拼音輸出格式:帶音標、不帶音標、數字表示音標以及拼音首字母輸出格式

  • 常見多音字識別
    支持常見多音字的識別,其中包括片語、成語、地名等

  • 簡繁體中文轉換

  • 支持添加自定義字典

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

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

// Pinyin4js.ts
import { PinyinHelper } from 'pinyin4js'; // 假設引入pinyin4js相關的庫

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

2. 使用 PinyinConverter 組件

以下是如何在應用中使用 PinyinConverter 將漢字轉換為拼音的示例代碼:

import PinyinConverter from './Pinyin4js';

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

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

解釋一下代碼:

  1. PinyinConverter

    • convertToPinyin 方法
      • 接收一個漢字字元串作為輸入,使用 PinyinHelper.convertToPinyinString 方法將其轉換為拼音字元串。
      • convertToPinyinString 的參數說明:
        • 第一個參數是待轉換的漢字字元串。
        • 第二個參數是連接符,這裡使用空字元串("")表示拼音之間不使用連接符。
        • 第三個參數指定拼音的格式,這裡選擇 PinyinHelper.WITH_TONE_MARK 以帶音調的拼音形式返回。
      • 最後將拼音字元串按逗號分割並返回拼音數組。
  2. 使用示例

    • onCreate 方法中,定義待轉換的漢字字元串,然後調用 convertToPinyin 方法進行轉換。
    • 輸出原文和轉換後的拼音。

通過這種設計,pinyin4js 提供了一種簡便的方式來處理漢字與拼音之間的轉換,非常適合在涉及中文文本的應用中使用,開發者可以根據需求對其進行擴展或修改。

最後

HarmonyOS NEXT 正式版即將發佈,你在學習鴻蒙的過程還有哪些好用的工具庫嗎,歡迎分享給V 哥,關註威哥愛編程,一起學習鴻蒙開發。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文內容來自YashanDB官網,具體內容請見https://www.yashandb.com/newsinfo/7459465.html?templateId=1718516 問題現象 某局點yashandb cpu使用率100%,經線上分析是由於幾個sql執行慢,其中一個sql為簡單的單行等值綁 ...
  • Apache SeaTunnel 2.3.8版本即將於大家見面,近日,Apache SeaTunnel PMC Member 範佳在社區的交流會上為大家提前透露了關於這個新版本即將進行的功能與特性更新概況,詳細內容如下: SeaTunnel 簡介 SeaTunnel是一個高性能的開源分散式數據集成系 ...
  • 在大數據時代,工作流任務調度系統成為了數據處理和業務流程管理的核心組件,在大數據平臺的構建和開發過程中尤為重要。隨著數據量的激增和業務需求的多樣化,合理的任務調度不僅能夠提高資源利用率,還能保證業務流程的穩定和高效運行。本文將結合實際場景,探討目前市面上常見的工作流任務調度及其關鍵特性。 一、工作流 ...
  • 本文轉自YashanDB官網,具體內容請見https://www.yashandb.com/newsinfo/7441388.html?templateId=1718516 問題現象 客戶剛開始使用YashanDB odbc的時候,需要查看調用日誌詳情, 確認相應介面調用情況。 問題的風險及影響 客 ...
  • postgresql 與PostGis 離線環境安裝 上傳文件至伺服器 #安裝所需依賴 yum install /opt/PGsql-13-gis/rpm/* -y Postgresql安裝 tar -zxvf postgresql-13.2.tar.gz #進入該目錄 ./configure -- ...
  • 1. 讓數據可信 1.1. 每個終端用戶(End User)都有一個共同的需求:訪問想要的數據 1.2. 真的能夠相信我正在訪問的這些數據嗎? 1.2.1. 終端用戶很快就會發現,訪問數據和相信正在訪問的數據是兩回事 1.2.2. 訪問數據和相信數據不是同一回事 1.2.3. 如果數據不可信,可能會 ...
  • Sql介紹 與 Sql基礎查詢 SQL SQL也稱為結構化查詢語言(Structure Query Language),是一種用於管理和操作關係型資料庫的標準化電腦語言,SQL語言廣泛應用於各種關係型資料庫系統(RDBMS)如Mysql,Oracle,Microsoft SQL Server等等 ...
  • 什麼是骨架屏 在客戶端開發中,我們總是需要等待拿到服務端的響應後,再將內容呈現到頁面上,那麼在用戶發起請求到客戶端成功拿到響應的這段時間內,應該在屏幕上呈現點什麼好呢? 答案是:骨架屏 那麼什麼是骨架屏呢,來問下 GPT: 骨架屏(Skeleton Screen)是一種現代的用戶界面設計技術,用於提 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...