10款好用的开源 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 哥,关注威哥爱编程,一起学习鸿蒙开发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/887094.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【unity进阶知识6】Resources的使用,如何封装一个Resources资源管理器

文章目录 一、Unity资源加载的几种方式1、Inspector窗口拖拽2、Resources3、AssetBundle4、Addressables&#xff08;可寻址资源系统&#xff09;5、AssetDatabase 二、准备三、同步加载Resources资源1、Resources.Load同步加载单个资源1.1、基本加载1.2、加载指定类型的资源1.…

漆包线称重系统/自动称重/项目合作

万界星空科技漆包线行业称重系统实现自动称重的方式主要依赖于现代数字电子称重技术、计算机网络技术以及相关的软件系统的集成。以下是对该系统如何实现自动称重的详细解释&#xff1a; 一、硬件基础 称重设备&#xff1a; 系统采用高精度的电子秤作为称重设备&#xff0c;这…

Meta推出Movie Gen 旗下迄今最先进的视频生成AI模型

Meta 今天发布了 MovieGen 系列媒体基础AI模型&#xff0c;该模型可根据文本提示生成带声音的逼真视频。 MovieGen 系列包括两个主要模型&#xff1a; MovieGen Video 和 MovieGen Audio。 MovieGen Video 是一个具有 300 亿个参数的变换器模型&#xff0c;可根据单个文本提示生…

方法重载(Overload)

前言 在前面的学习中&#xff0c;我们学到了重写(Override),这里我们主要进行重载(Overload)的介绍&#xff0c;同时对重写和重载的区别进行分析。 1. 重载(Overload) #方法重载 在同一个类中定义多个同名但参数不同的方法。我们称方法与方法之间构成方法重载 在Java中&…

【linux进程】进程优先级命令行参数环境变量

目录 一&#xff0c;进程切换二&#xff0c;进程优先级1. 什么是优先级2. 权限 vs 优先级3. 为什么要有优先级4. 优先级的查看方式 三&#xff0c;命令行参数1. 什么是命令行参数2. 为什么要有命令行参数3. 是谁做的 四&#xff0c;环境变量1. 基本概念2. 常见环境变量3. 查看环…

针对线上消息积压的排查思路以及解决方案

一、背景 我们在日常工作中&#xff0c;经常会碰到线上告警&#xff0c;消息队列消息积压了&#xff0c;试想如果对消息的消费速率有要求的场景&#xff0c;消息积压一定会或多或少对自己本身的业务场景有影响&#xff0c;这里就针对消息积压的场景&#xff0c;谈谈具体的排查…

15分钟学 Python 第37天 :Python 爬虫入门(三)

Day 37 : Python爬虫入门大纲 章节1&#xff1a;Python爬虫概述 1.1 什么是爬虫&#xff1f; 网页爬虫&#xff08;Web Crawler&#xff09;是一种自动访问互联网上网页并提取数据的程序。爬虫的作用包括搜索引擎索引内容、市场调查、数据分析等。 1.2 爬虫的工作原理 发起…

Vue中使用ECharts实现热力图的详细教程

在数据可视化领域&#xff0c;热力图是一种非常直观的表现形式&#xff0c;它通过颜色深浅来展示数据分布情况。在Vue项目中&#xff0c;我们可以使用ECharts这一强大的图表库来实现热力图。下面我将详细介绍如何在Vue中使用ECharts实现热力图。效果如下图&#xff1a; 一、准备…

Python或R时偏移算法实现

&#x1f3af;要点 计算单变量或多变量时序距离&#xff0c;使用欧几里得、曼哈顿等函数量化不同时序差异。量化生成时序之间接近度相似性矩阵。使用高尔距离和堪培拉距离等相似度测量。实现最小方差匹配算法&#xff0c;绘制步进模式的图形表示。其他语言包算法实现。 &…

vue3 + ts + cesium:绘制、更新圆 ellipse

本文主要实现基础的绘制圆形&#xff0c;并且可以通过拖动圆心更新圆的位置&#xff0c;拖动圆上的边缘点改变圆的半径。 实现效果&#xff1a; &#xff08;1&#xff09;单击鼠标左键开始绘制&#xff0c;确定圆的圆心&#xff0c;移动鼠标&#xff0c;改变圆的半径&#xff…

Mac屏蔽系统更新,取出红点标记如果解锁hosts文件

引言&#xff1a;关闭系统更新&#xff0c;首先应该在系统偏好设置---软件更新---去掉自动更新的选项。即使如此&#xff0c;系统仍然进行macOS系统和自带safari等软件的检测更新&#xff0c;并图标右上角红点点标记提醒我们更新&#xff0c;那我们如果彻底屏蔽更新呢&#xff…

解决 Adobe 盗版弹窗

在这个文件夹下删除 Adobe CCXProcess 然后重装。 Adobe Premiere Pro 2024 (v24.6.1) Multilingual :: Варез от m0nkrusa [Warez by m0nkrus] (monkrus.ws) Adobe Photoshop 2024 (v25.12) Multilingual :: Варез от m0nkrusa [Warez by m0nkrus] (monkrus.…

Spring Boot RESTful API开发教程

一、RESTful API简介 RESTful API是一种基于HTTP协议的Web API&#xff0c;其设计原则是简单、可扩展、轻量级、可缓存、可靠、可读性强。RESTful API通常使用HTTP请求方法&#xff08;GET、POST、PUT、DELETE等&#xff09;来操作资源&#xff0c;使用HTTP状态码来表示操作结…

JQuery基本介绍和使用方法

文章目录 JQuery基本介绍和使用方法引入依赖 jQuery语法jQuery选择器jQuery事件操作元素获取/设置元素内容获取/设置元素属性获取/返回css属性添加元素删除元素 JQuery基本介绍和使用方法 W3C 标准给我们提供了⼀系列的函数, 让我们可以操作: ⽹⻚内容⽹⻚结构⽹⻚样式 但是…

案例-猜数字游戏

文章目录 效果展示初始画面演示视频 代码区 效果展示 初始画面 演示视频 猜数字游戏 代码区 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width,…

PostgreSQL Docker Error – 5432: 地址已被占用

PostgreSQL Docker Error – 5432: 地址已被占用 今天在学习【Spring Boot React】价值79.9美元&#xff0c;全栈开发&#xff0c;搭建个人网站、做毕业设计、试试这套课程第17~21节视频的时候&#xff0c;发现运行docker run --name demo-postgres -e POSTGRES_PASSWORDpass…

【C++】类与对象(三)

「前言」 &#x1f308;个人主页&#xff1a; 代码探秘者 &#x1f308;C语言专栏&#xff1a;C语言 &#x1f308;C专栏&#xff1a; C &#x1f308;喜欢的诗句:天行健,君子以自强不息. 目录 一、再谈构造函数 1.1 构造函数体赋值 1.2 初始化列表 1.3 explicit 关键字 二…

pycharm中使用anaconda创建多环境,无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

问题描述 用的IDE是&#xff1a; 使用anaconda创建了一个Python 3.9的环境 结果使用pip命令的时候&#xff0c;报错 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称 解决方案 为了不再增加系统变量&#xff0c;我们直接将变量添加在当前项目中你的Ter…

类型转换【C++提升】(隐式转换、显式转换、自定义转换、转换构造函数、转换运算符重载......你想知道的全都有)

更多精彩内容..... &#x1f389;❤️播主の主页✨&#x1f618; Stark、-CSDN博客 本文所在专栏&#xff1a; C系列语法知识_Stark、的博客-CSDN博客 座右铭&#xff1a;梦想是一盏明灯&#xff0c;照亮我们前行的路&#xff0c;无论风雨多大&#xff0c;我们都要坚持不懈。 一…

前端学习第三天笔记 JavaScript JavaScript的引入 数据类型 运算符 条件语句 字符串

这里写自定义目录标题 JavaScriptJavaScript引入到文件嵌入到HTML文件中引入本地独立js文件引入网络来源文件 JavaScript的注释方式嵌入在HTML文件中的注释JavaScript的输出方式数据类型原始类型&#xff08;基础类型&#xff09;合成类型&#xff08;复合类型&#xff09; 运算…