HarmonyOS应用开发(组件库)--组件模块化开发、工具包、设计模式(持续更新)

news2024/9/23 11:13:23

致力于,UI开发拿来即用,提高开发效率

  • 正则表达式
      • ...手机号校验
      • ...邮箱校验
  • 文件
      • 判断文件是否存在
  • 网络下载
      • 下载图片
      • 从沙箱中图片转为Base64格式
      • 从资源文件中读取图片转Base64
  • 组件
      • 输入框
          • ...矩形输入框
          • ...输入框堆叠效果(用于登录使用)
      • 文本
      • 按钮
  • 组件工具包
      • ...输入框(矩形)
      • ...登录延时效果
  • 类、接口、枚举工具包
      • 进程间通讯(IPC)
  • 设计模式

在这里插入图片描述

正则表达式

…手机号校验

  isValidPhoneNumber(phoneNumber: string): boolean {
    const regex = /^(13[0-9]|14[5|7|9]|15[0-3|5-9]|16[2|5|6|7]|17[0-8]|18[0-9]|19[8|9])\d{8}$/;
    return regex.test(phoneNumber)
  }

…邮箱校验

  isValidEmail(email: string): boolean {
    let regEmail = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/;
    return regEmail.test(email)
  }

文件

导包: import fs from ‘@ohos.file.fs’;

判断文件是否存在

 // 判断文件是否存在?
 let imgFile = filesDir + '/myImg.png'; // 路径
 let res = fs.accessSync(imgFile);
 if (res) {
   //如存在,就删除
   fs.unlinkSync(imgFile);
 }

网络下载

导包:
import request from ‘@ohos.request’;
import fs from ‘@ohos.file.fs’;

下载图片

request.downloadFile(getContext(), {
      url: netFile, filePath: imgFile // 网络路径,本地路径
    }).then((task) => {
      task.on('complete', function callback() {
      	let file:fileIo.File;
          file = fs.openSync(imgFile) // 本地路径
        prompt.showToast({
          message: "文件下载成功:" + imgFile
        })
      })
      task.on('fail', function callBack(err) {
        prompt.showToast({
          message: "文件下载失败,err:" + JSON.stringify(err)
        })
      });

从沙箱中图片转为Base64格式

// 工具包:
// 其中当转为这个后,可能会与原文件有差异,需要修改配置base64ImgStr
// 获取沙箱路径:this.context.__Dir
async toBase64(image_uri: string) {
  if (image_uri) {
    let selectImage = fs.openSync(image_uri, fs.OpenMode.READ_WRITE) // openSync() 根据文件file://路径 转文件
    const imageSource = image.createImageSource(selectImage.fd);
    const imagePackerApi: image.ImagePacker = image.createImagePacker();
    let packOpts: image.PackingOption = { format: 'image/jpeg', quality: 100 };
    let readBuffer = await imagePackerApi.packing(imageSource, packOpts);
    let bufferArr = new Uint8Array(readBuffer)
    let help = new util.Base64Helper
    let base = help.encodeToStringSync(bufferArr)
    let base64ImgStr = 'data:image/png;base64,' + base; // 回显需要有前面的前缀才可以
    return base64ImgStr;
  }
  return '';
}

从资源文件中读取图片转Base64

 async toBase64StrFromResource(img_name: string) {
    // 1. 获取图片所对应的PixelMap对象
    let pixelMap: PixelMap = await this.toPixelMapFromResource(img_name); // 自己封装函数,见下
    // 2. 获取pixelMap总字节数
    let pixelBytesNumber: number = pixelMap.getPixelBytesNumber();
    // 3. 创建了一个ImagePacker对象,用于图像编码。(ImagePacker是HarmonyOS中用于将图像(PixelMap格式)编码为不同存档格式的工具)
    const imagePackageApi: image.ImagePacker = image.createImagePacker();
    // 4. 定义了一个PackingOption对象,用于设置图像编码的选项。
    let packOpts: image.PackingOption = {
      format: 'image/jpeg', //表示编码的图像格式为jpeg格式
      quality: 100, //表示图像质量为最高质量(取值为0~100之间)
    }
    // 5. 将pixelMap对象按照packOpts中设置的选项进行编码。编码的结果被存储在readBuffer中
    const readBuffer = await imagePackageApi.packing(pixelMap, packOpts);
    // 6. 创建了一个Base64Helper对象,用于进行Base64编码和解码操作。
    let base64Helper = new util.Base64Helper();
    // 7. 将readBuffer转换为一个Uint8Array对象(Uint8Array是一种JavaScript内置对象,表示一个8位无符号整数的数组,适合表示二进制数据。)
    let uint8Arr = new Uint8Array(readBuffer);
    // 8. 将uint8Arr中的二进制数据同步地编码为Base64字符串
    let pixelStr = base64Helper.encodeToStringSync(uint8Arr);
    // 9. 加入base64编码协议(用于显示在Image组件中)(以下前缀形成一个可以在Web上直接使用的Data URL。这个Data URL可以被用于在HTML或CSS中嵌入图像数据,而不需要额外的图像文件)
    let base64ImgStr = 'data:image/png;base64,' + pixelStr;
    Log.MyLog("'hmlog-->',base64 str : " + base64ImgStr);
    // 10. 返回编码后并转换为Data URL的Base64字符中
    return base64ImgStr;
  }


  async toPixelMapFromResource(img_name: string) {
    // 1. 获取stage模型下的Context上下文对象
    const context = getContext(this);
    // 2. 获取ResourceManager资源管理类
    const resourceMgr = context.resourceManager;
    // 3. 获取resource/rawfile/face.png
    const fileData = await resourceMgr.getRawFileContent(img_name)
    // 4. 获取图片的ArrayBuffer
    const buffer = fileData.buffer;
    // 5. 创建ImageSource实例
    const imageSource = image.createImageSource(buffer);
    // 6. 定义解码参数DecodingOptions
    let decodingOptions = {
      editable: true, // editable设置为true表示图片是可编辑的
      desiredPixelFormat: 3 // desiredPixelFormat设置为3表示解码的像素格式为RGBA_8888
    }
    // 7. 根据解码参数DecodingOptions获取PixelMap图片对象
    const pixelMap = await imageSource.createPixelMap(decodingOptions)
    // 8. 返回PixelMap图片对象
    return pixelMap;
  }

组件

(图片样式+代码) : 封装的组件则放在工具包下,可以使用 CTRL+F进行搜索 如: TextInputRectangleView

输入框

…矩形输入框

若有其他变动,可以修改参数即可

在这里插入图片描述

TextInputRectangleView({
        placeholder: '请输入手机号/邮箱',
        onClickCallBack: (value: string) => { // 回调函数
          this.name = value
        }
      })
…输入框堆叠效果(用于登录使用)

在这里插入图片描述

Stack({ alignContent: Alignment.End }) { // 布局
        TextInputRectangleView({
          placeholder: '请输入验证码',
          inPutType: InputType.Number,
          onClickCallBack: (value: string) => {
            this.code = value
          }
        })

        Text(this.message)
          .fontColor(Color.Red)
          .padding({ right: 20 })
          .enabled(this.isEnable)
          .opacity(this.isEnable ? 1 : 0.5)
          .onClick(() => {
          // 点击字体时的业务处理
            this.wait() // 延时
            this.getVaCode() // 校验代码
          })
      }.width("100%")


// 延时函数点击重新获取触发
  wait() {
    let time = 60
    let id = setInterval(() => {
      time--
      this.isEnable = false // 禁用的状态
      this.message = '重新获取(' + time + ")s"
      if (time <= 0) {
        this.isEnable = true
        this.message = '重新获取'
      }
    }
      , 1 * 1000)
  }

文本

按钮

组件工具包

(图片样式+代码) ,结合组件UI进行使用

…输入框(矩形)

在这里插入图片描述

@Preview
@Component
  // 文本输入框矩形
export default struct TextInputRectangleView {
  text ?: string
  placeholder?: string
  inPutType ?: InputType = InputType.Normal
  onClickCallBack : (value: string) => void = () => { // 回调函数
  }
  width2?: ResourceStr | number = "100%"
  height2?: ResourceStr | number = 50
  backgroundColor2?: ResourceColor = "#ddd"
  borderRadius2 ?: number = 10

  build() {
    Row() {
      TextInput({ placeholder: this.placeholder, text: this.text })
        .type(this.inPutType)
        .onChange((val: string) => {
          this.onClickCallBack(val)
        })
        .backgroundColor(this.backgroundColor2)
        .placeholderColor(Color.Grey) // 提示信息颜色
    }.width(this.width2)
    .height(this.height2)
    .backgroundColor(this.backgroundColor2)
    .borderRadius(this.borderRadius2)
  }
}

…登录延时效果

在这里插入图片描述

  wait() {
    let time = 60
    let id = setInterval(() => {
      time--
      this.isEnable = false // 禁用的状态
      this.message = '重新获取(' + time + ")s"
      if (time <= 0) {
        this.isEnable = true
        this.message = '重新获取'
      }
    }
      , 1 * 1000)
  }

类、接口、枚举工具包

进程间通讯(IPC)

import commonEventManager from '@ohos.commonEventManager'


// Publisher通讯事件类型
enum PublishEventType {
  APP_PUBLISH = "APP_PUBLISH",
  CARD_PUBLISH = "CARD_PUBLISH"
}


class IPCManagerClass {
  static publishCount:number = 1
  // 发布者
  static publish(eventType:PublishEventType,data:string){
    // commonEventManager作用:可用于进程间通讯
    commonEventManager.publish(eventType,{data},(err)=>{
      if(err){
        // 失败只发3次
        if(this.publishCount<=3){
          this.publish(eventType,data)
        }else{
          this.publishCount = 1
        }
      }else{
        this.publishCount = 1
      }
    })
  }
  // 订阅者
  static subscribe(eventType:PublishEventType,subscriber,callback:(event:string)=>void){
    commonEventManager.createSubscriber({ events: [eventType] }, (err, data) => {
      if (err) {
        return console.log('common-->', `创建订阅者error ${JSON.stringify(err)}`)
      }
      console.log('common-->', `创建订阅者success`)
      subscriber = data
      if (subscriber !== null) {
        //订阅事件
        commonEventManager.subscribe(subscriber, (err, data) => {
          if (err) {
            return console.error(`logData`, '订阅事件失败')
          }
          console.log('common-->',`接受订阅事件:${data.data}`)
          callback(data.data)
        })
      } else {
        console.error('common-->',`需要创建subscriber`);
      }
    })
  }
}

export {IPCManagerClass,PublishEventType}

设计模式

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【自动驾驶】决策规划算法(二)参考线模块Ⅰ| 平滑算法与二次规划

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

(学习记录)使用 STM32CubeMX——GPIO引脚输入配置

STM32F103C8T6的GPIO引脚输入配置 时钟配置 &#xff08;学习记录&#xff09;使用 STM32CubeMX——配置时钟&#xff08;入门&#xff09;https://blog.csdn.net/Wang2869902214/article/details/142423522 GPIO 引脚输出配置 &#xff08;学习记录&#xff09;使用 STM32…

Springcloud框架-能源管理系统-能源管理系统源码-能源在线监测平台-双碳平台

一、介绍 基于SpringCloud的能管管理系统-能源管理平台源码-能源在线监测平台-双碳平台源码-SpringCloud全家桶-能管管理系统源码 有需者咨询&#xff0c;非诚勿扰&#xff1b; 二、软件架构 二、功能介绍 三、数字大屏展示 四、数据采集原理 五、软件截图

macos pyenv 安装python tk 、tkinter图形库方法步骤和使用总结

在macos中&#xff0c; pyenv 是一款用来管理多版本python 的工具&#xff0c; 我们常用的tk图形库是一个独立的工具库&#xff0c;我们在python里面使用的tkinter模块仅是调用这个独立的tk图形库&#xff0c; 所以如果我们希望在python里面使用它&#xff0c; 就必须要先安装t…

委托的注册及注销+观察者模式

事件 委托变量如果公开出去&#xff0c;很不安全&#xff0c;外部可以随意调用 所以取消public,封闭它&#xff0c;我们可以自己书写两个方法&#xff0c;供外部注册与注销&#xff0c;委托调用在子方法里调用&#xff0c;这样封装委托变量可以使它更安全&#xff0c;这个就叫…

金融加密机的定义与功能

金融加密机是一种用于保护金融交易数据和信息安全的重要安全设备。它通过硬件和软件的多重保障&#xff0c;确保金融交易中的敏感数据不被泄露或篡改。以下是关于金融加密机的详细介绍&#xff1a; 一、定义与功能 金融加密机是一种硬件安全设备&#xff0c;通过实现各种密码算…

深度deepin初体验(一)系统详细安装过程 | 国产系统

这里写自定义目录标题 深度deepin初体验&#xff08;一&#xff09;系统详细安装过程1.介绍2.安装要求3.环境4.创建虚拟机/系统升级系统选择语言硬盘分区备份文件拷贝系统重启常规设置 深度deepin初体验&#xff08;一&#xff09;系统详细安装过程 1.介绍 深度deepin是在debi…

Python开发深度学习常见安装包 error 解决

Python Python 是一种广泛使用的高级编程语言&#xff0c;它以其清晰的语法和代码可读性而闻名。Python 支持多种编程范式&#xff0c;包括面向对象、命令式、函数式和过程式编程。由于其简洁性和强大的标准库&#xff0c;Python 成为了数据科学、机器学习、网络开发、自动化脚…

气膜馆:新型场馆的盈利之道—轻空间

气膜馆作为一种创新的场馆形式&#xff0c;凭借其先进的技术和灵活的应用&#xff0c;正在快速崛起&#xff0c;展现出广阔的市场前景与丰富的盈利潜力。通过多元化的经营模式&#xff0c;气膜馆为创业者提供了前所未有的商机。本文将深入分析气膜馆的盈利模式及其在市场中的竞…

气膜储煤棚:未来能源管理的新选择—轻空间

在全球对可持续发展与环保的日益重视下&#xff0c;传统的煤炭储存方式面临着诸多挑战。气膜储煤棚应运而生&#xff0c;成为现代煤炭储存的理想解决方案。本文将深入探讨气膜储煤棚的优势与应用&#xff0c;为企业提供新的思路。 先进的技术设计 气膜储煤棚采用创新的气膜技术…

AcWing算法基础课-790数的三次方根-Java题解

大家好&#xff0c;我是何未来&#xff0c;本篇文章给大家讲解《AcWing算法基础课》790 题——数的三次方根。本题考查算法为浮点数二分查找。本文详细介绍了一个使用二分法计算浮点数三次方根的算法。通过逐步逼近目标值&#xff0c;程序能够在给定的区间内精确计算出结果&…

关闭小广告【JavaScript】

在 JavaScript 中实现关闭小广告的功能&#xff0c;可以通过监听点击事件来隐藏广告元素。 实现效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport&q…

SpringBoot框架之KOB项目 - 配置Mysql与注册登录模块(中)

修改Spring Security 登录验证模式 传统的验证登录模式 公开页面&#xff1a;输入url就可以直接访问授权页面&#xff1a;登录之后才可以访问 Jwt验证模式 容易实现跨域不需要在服务器端存储 对比于传统模式将所有的sessionId换成jwt token access token refresh token 过…

如何在Chrome最新浏览器中调用ActiveX控件?

小编最近登陆工商银行网上银行&#xff0c;发现工商银行的个人网银网页&#xff0c;由于使用了ActiveX安全控件&#xff0c;导致不能用高版本Chrome浏览器打开&#xff0c;目前只有使用IE或基于IE内核的浏览器才能正常登录网上银行&#xff0c;而IE已经彻底停止更新了&#xff…

Tile View Kanban Board平铺视图和看板

Goto 数据网格和视图入门 平铺视图&#xff08;TileView 类&#xff09;将数据记录显示为平铺。此视图类型可以以任何自定义方式排列多个元素&#xff08;bound 和 unbound&#xff09;。用户可以按如下方式编辑瓦片&#xff1a; 使用模态 Edit Form。利用 HTML-CSS 平铺模板…

VScode配置连接远程服务器configure ssh Hosts

VScode配置连接远程服务器&#xff0c;具体步骤 一、点击VScode左下脚这两个∟的按钮 二、点击完上面的按钮后&#xff0c;出现如下的下拉选项&#xff0c;选择“Connect to Host” 三、选择“Connect to Host”后&#xff0c;下拉选项会更新&#xff0c;选择“Configure SSH …

openFrameworks_如何使用ofxXmlSettings和ofxGui来创建识别界面

效果图&#xff1a; 代码及详解 1.添加两个插件的头文件: #include "ofxGui.h" #include "ofxXmlSettings/src/ofxXmlSettings.h" 2.添加GUI部分&#xff0c;然后在.h声明右边的openframeworks的UI部分&#xff0c;包括面板ofxPanel&#xff0c;按钮ofx…

【JUC并发编程系列】深入理解Java并发机制:线程局部变量的奥秘与最佳实践(五、ThreadLocal原理、对象之间的引用)

文章目录 【JUC并发编程系列】深入理解Java并发机制&#xff1a;线程局部变量的奥秘与最佳实践(五、ThreadLocal原理、对象之间的引用)1. 基本 API 介绍2. 简单用法3. 应用场景4. Threadlocal与Synchronized区别5. 内存溢出和内存泄漏5.2 内存溢出 (Memory Overflow)5.2 内存泄…

如何融合文本信息提高时序预训练模型?

今天小编给大家介绍两篇联合文本和时序数据进行预训练的文章。 UniTime: A Language-Empowered Unified Model for Cross-Domain Time Series Forecasting 文献地址&#xff1a;https://arxiv.org/pdf/2310.09751.pdf 代码地址&#xff1a;https://github.com/liuxu77/UniTim…

【永磁同步电机(PMSM)】 4. 同步旋转坐标系仿真模型

【永磁同步电机&#xff08;PMSM&#xff09;】 4. 同步旋转坐标系仿真模型 1. Clarke 变换的模型与仿真1.1 Clarke 变换1.2 Clarke 变换的仿真模型 2. Park 变换的模型与仿真2.1 Park 变换2.2 Park 变换的仿真模型 3. Simscape标准库变换模块3.1 abc to Alpha-Beta-Zero 模块3…