鸿蒙NEXT开发案例:字数统计

【引言】

本文将通过一个具体的案例——“字数统计”组件,来探讨如何在鸿蒙NEXT框架下实现这一功能。此组件不仅能够统计用户输入文本中的汉字、中文标点、数字、以及英文字符的数量,还具有良好的用户界面设计,使用户能够直观地了解输入文本的各种统计数据。

【环境准备】

• 操作系统:Windows 10

• 开发工具:DevEco Studio NEXT Beta1 Build Version: 5.0.3.806

• 目标设备:华为Mate60 Pro

• 开发语言:ArkTS

• 框架:ArkUI

• API版本:API 12

【组件概述】

“字数统计”组件基于鸿蒙NEXT框架构建,旨在提供一个简洁而强大的文本统计工具。组件的主要功能包括:

• 文本输入:用户可以在提供的文本区域内输入或粘贴任何文本。

• 实时统计:当用户输入或修改文本时,组件会实时更新并显示文本中汉字、中文标点、数字、英文字符等的具体数量。

• 示例与清空:提供了“示例”按钮,点击后会自动填充预设的文本内容;“清空”按钮则用于清空当前的输入内容。

【技术实现】

1. 状态管理:使用@State装饰器来管理组件的状态,如输入文本、各种字符的数量统计等。通过@Watch装饰器监听输入文本的变化,触发相应的计算逻辑。

2. 文本解析:当检测到输入文本发生变化时,组件会遍历文本中的每一个字符,根据正则表达式判断字符类型,并分别统计汉字、中文标点、数字、英文字符的数量。特别地,对于汉字和中文标点,每个字符被视为两个单位进行统计。

3. 用户界面:组件的UI设计遵循了鸿蒙NEXT的设计规范,使用了Column、Row、Text、TextArea等基础组件来构建布局。通过设置字体颜色、大小、背景色、边距等属性,实现了美观且易于使用的界面。此外,组件还利用了阴影效果和圆角设计来提升视觉体验。

4. 交互设计:为了增强用户体验,组件中加入了“示例”和“清空”按钮,用户可以通过简单的点击操作快速测试组件的功能或清空输入框。同时,组件支持文本输入区域的实时更新,保证了用户操作的即时反馈。

【完整代码】

// 定义一个组件,用于数字和文本统计
@Entry
@Component
struct NumberToChineseConverter {// 定义一个状态变量,存储示例数字字符串@State private exampleNumber: string = '自从盘古破鸿蒙,开辟从兹清浊辨。\nare you ok?\n1234\n+-*/';// 定义文本颜色的状态变量@State private textColor: string = "#2e2e2e";// 定义阴影边框颜色的状态变量@State private shadowColor: string = "#d5d5d5";// 定义基础内边距的状态变量@State private basePadding: number = 30;// 定义汉字数量的状态变量@State private chineseCharCount: string = "0";// 定义中文标点数量的状态变量@State private chinesePunctuationCount: string = "0";// 定义汉字加中文标点总数的状态变量@State private totalChineseCount: string = "0";// 定义英文字符数量的状态变量@State private englishCharCount: string = "0";// 定义数字数量的状态变量@State private digitCount: string = "0";// 定义总字符数的状态变量@State private charTotalCount: string = "0";// 定义监听输入文本变化的状态变量@State @Watch('inputChanged') private inputText: string = "";// 当输入文本发生变化时调用的方法inputChanged() {// 初始化计数器let chineseChars = 0; // 汉字数量let chinesePunctuation = 0; // 中文标点数量let englishChars = 0; // 英文字符数量let digits = 0; // 数字数量let count = 0; // 总字符数// 遍历输入文本的每个字符for (let i = 0; i < this.inputText.length; i++) {let char = this.inputText.charAt(i); // 获取当前字符count++; // 计数器加一// 如果字符是数字,则数字计数器加一if (/\d/.test(char)) {digits++;}// 如果字符是汉字,则汉字计数器加一,同时总字符数加二if (/[\u4e00-\u9fa5]/.test(char)) {chineseChars++;count++; // 汉字和中文标点算两个字符,所以这里多+1}// 如果字符是中文标点,则中文标点计数器加一,同时总字符数加二if (/[\u3001-\u3002\uff01-\uff1a]/.test(char)) {chinesePunctuation++;count++; // 汉字和中文标点算两个字符,所以这里多+1}// 如果字符是英文字符或英文标点,则英文字符计数器加一if (/[a-zA-Z0-9\s!-/:-@[-`{-~]/.test(char)) {englishChars++;}}// 更新状态变量this.chineseCharCount = `${chineseChars}`;this.chinesePunctuationCount = `${chinesePunctuation}`;this.totalChineseCount = `${chineseChars + chinesePunctuation}`;this.englishCharCount = `${englishChars}`;this.digitCount = `${digits}`;this.charTotalCount = `${count}`;}// 构建UI界面的方法build() {// 创建一个列布局容器Column() {// 添加标题Text('字数统计').fontColor(this.textColor) // 设置字体颜色.fontSize(18) // 设置字体大小.width('100%') // 设置宽度为100%.height(50) // 设置高度为50.textAlign(TextAlign.Center) // 设置文本居中对齐.backgroundColor(Color.White) // 设置背景色为白色.shadow({ // 设置阴影效果radius: 2, // 阴影半径color: this.shadowColor, // 阴影颜色offsetX: 0, // X轴偏移量offsetY: 5 // Y轴偏移量});// 创建可滚动的容器Scroll() {// 在可滚动容器内部创建列布局Column() {// 添加工具介绍Column() {Text('工具介绍').fontSize(18).fontWeight(600).fontColor(this.textColor);Text('本工具能够快速统计输入文本中的汉字、中文标点、数字、英文字符等的数量。具体规则如下:\n•汉字和中文标点各算作两个字符。\n•数字、空格、英文字母及英文标点各算作一个字符。').textAlign(TextAlign.JUSTIFY) // 设置文本两端对齐.fontSize(13) // 设置字体大小.fontColor(this.textColor) // 设置字体颜色.margin({ top: `${this.basePadding / 2}lpx` }); // 设置上边距}// 设置样式.alignItems(HorizontalAlign.Start) // 设置水平对齐方式.width('650lpx') // 设置宽度.padding(`${this.basePadding}lpx`) // 设置内边距.margin({ top: `${this.basePadding}lpx` }) // 设置外边距.borderRadius(10) // 设置圆角.backgroundColor(Color.White) // 设置背景色.shadow({ // 设置阴影效果radius: 10, // 阴影半径color: this.shadowColor, // 阴影颜色offsetX: 0, // X轴偏移量offsetY: 0 // Y轴偏移量});// 添加示例和清空按钮Column() {Row() {Text('示例').fontColor("#5871ce") // 设置字体颜色.fontSize(16) // 设置字体大小.padding(`${this.basePadding / 2}lpx`) // 设置内边距.backgroundColor("#f2f1fd") // 设置背景色.borderRadius(5) // 设置圆角.clickEffect({ level: ClickEffectLevel.LIGHT, scale: 0.8 }) // 设置点击效果.onClick(() => { // 设置点击事件this.inputText = this.exampleNumber; // 将示例文本赋值给输入框});Blank(); // 添加空白间隔Text('清空').fontColor("#e48742") // 设置字体颜色.fontSize(16) // 设置字体大小.padding(`${this.basePadding / 2}lpx`) // 设置内边距.clickEffect({ level: ClickEffectLevel.LIGHT, scale: 0.8 }) // 设置点击效果.backgroundColor("#ffefe6") // 设置背景色.borderRadius(5) // 设置圆角.onClick(() => { // 设置点击事件this.inputText = ""; // 清空输入框});}.height(45) // 设置高度.justifyContent(FlexAlign.SpaceBetween) // 设置子项之间间距均匀分布.width('100%'); // 设置宽度Divider(); // 添加分割线// 添加文本输入区域TextArea({ text: $$this.inputText, placeholder: `请输入内容` }).width(`${650 - this.basePadding * 2}lpx`) // 设置宽度.height(100) // 设置高度.fontSize(16) // 设置字体大小.caretColor(this.textColor) // 设置光标颜色.fontColor(this.textColor) // 设置字体颜色.margin({ top: `${this.basePadding}lpx` }) // 设置上边距.padding(0) // 设置内边距.backgroundColor(Color.Transparent) // 设置背景色.borderRadius(0) // 设置圆角.textAlign(TextAlign.JUSTIFY); // 设置文本两端对齐}// 设置样式.alignItems(HorizontalAlign.Start) // 设置水平对齐方式.width('650lpx') // 设置宽度.padding(`${this.basePadding}lpx`) // 设置内边距.margin({ top: `${this.basePadding}lpx` }) // 设置外边距.borderRadius(10) // 设置圆角.backgroundColor(Color.White) // 设置背景色.shadow({ // 设置阴影效果radius: 10, // 阴影半径color: this.shadowColor, // 阴影颜色offsetX: 0, // X轴偏移量offsetY: 0 // Y轴偏移量});// 添加统计结果展示Column() {// 汉字数量Row() {Text() {Span(`汉字:`)Span(`${this.chineseCharCount} `).fontColor(Color.Red) // 汉字数量以红色显示Span('个')}.fontColor(this.textColor) // 设置字体颜色.fontSize(16) // 设置字体大小.layoutWeight(1); // 设置布局权重}.constraintSize({ minHeight: 45 }) // 设置最小高度.justifyContent(FlexAlign.SpaceBetween) // 设置子项之间间距均匀分布.width('100%'); // 设置宽度Divider(); // 添加分割线// 中文标点数量Row() {Text() {Span(`中文标点:`)Span(`${this.chinesePunctuationCount} `).fontColor(Color.Red) // 中文标点数量以红色显示Span('个')}.fontColor(this.textColor) // 设置字体颜色.fontSize(16) // 设置字体大小.layoutWeight(1); // 设置布局权重}.constraintSize({ minHeight: 45 }) // 设置最小高度.justifyContent(FlexAlign.SpaceBetween) // 设置子项之间间距均匀分布.width('100%'); // 设置宽度Divider(); // 添加分割线// 汉字加中文标点总数Row() {Text() {Span(`汉字+中文标点:`)Span(`${this.totalChineseCount} `).fontColor(Color.Red) // 汉字加中文标点总数以红色显示Span('个')}.fontColor(this.textColor) // 设置字体颜色.fontSize(16) // 设置字体大小.layoutWeight(1); // 设置布局权重}.constraintSize({ minHeight: 45 }) // 设置最小高度.justifyContent(FlexAlign.SpaceBetween) // 设置子项之间间距均匀分布.width('100%'); // 设置宽度Divider(); // 添加分割线// 英文字符数量Row() {Text() {Span(`英文:`)Span(`${this.englishCharCount} `).fontColor(Color.Red) // 英文字符数量以红色显示Span('个')Span('(含英文状态下的数字、符号、标点)').fontSize(13) // 附加说明}.fontColor(this.textColor) // 设置字体颜色.fontSize(16) // 设置字体大小.layoutWeight(1); // 设置布局权重}.constraintSize({ minHeight: 45 }) // 设置最小高度.justifyContent(FlexAlign.SpaceBetween) // 设置子项之间间距均匀分布.width('100%'); // 设置宽度Divider(); // 添加分割线// 数字数量Row() {Text() {Span(`数字:`)Span(`${this.digitCount} `).fontColor(Color.Red) // 数字数量以红色显示Span('个')}.fontColor(this.textColor) // 设置字体颜色.fontSize(16) // 设置字体大小.layoutWeight(1); // 设置布局权重}.constraintSize({ minHeight: 45 }) // 设置最小高度.justifyContent(FlexAlign.SpaceBetween) // 设置子项之间间距均匀分布.width('100%'); // 设置宽度Divider(); // 添加分割线// 总字符数Row() {Text() {Span(`字符总数:`)Span(`${this.charTotalCount} `).fontColor(Color.Red) // 总字符数以红色显示Span('个字符')}.fontColor(this.textColor) // 设置字体颜色.fontSize(16) // 设置字体大小.layoutWeight(1); // 设置布局权重}.constraintSize({ minHeight: 45 }) // 设置最小高度.justifyContent(FlexAlign.SpaceBetween) // 设置子项之间间距均匀分布.width('100%'); // 设置宽度}// 设置样式.alignItems(HorizontalAlign.Start) // 设置水平对齐方式.width('650lpx') // 设置宽度.padding(`${this.basePadding}lpx`) // 设置内边距.margin({ top: `${this.basePadding}lpx` }) // 设置外边距.borderRadius(10) // 设置圆角.backgroundColor(Color.White) // 设置背景色.shadow({ // 设置阴影效果radius: 10, // 阴影半径color: this.shadowColor, // 阴影颜色offsetX: 0, // X轴偏移量offsetY: 0 // Y轴偏移量});}}.scrollBar(BarState.Off) // 关闭滚动条.clip(false); // 不裁剪超出部分,这里是允许内部组件阴影可以向父布局外扩散}.height('100%') // 设置高度为100%.width('100%') // 设置宽度为100%.backgroundColor("#f4f8fb"); // 设置背景色}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[极客大挑战 2019]BabySQL--详细解析

信息搜集 进入界面&#xff1a; 输入用户名为admin&#xff0c;密码随便输一个&#xff1a; 发现是GET传参&#xff0c;有username和password两个传参点。 我们测试一下password点位能不能注入&#xff1a; 单引号闭合报错&#xff0c;根据报错信息&#xff0c;我们可以判断…

C++《二叉搜索树》

在初阶数据结构中我学习了树基础的概念以及了解了顺序结构的二叉树——堆和链式结构二叉树该如何实现&#xff0c;那么接下来我们将进一步的学习二叉树&#xff0c;在此会先后学习到二叉搜索树、AVL树、红黑树&#xff1b;通过这些的学习将让我们更易于理解后面set、map、哈希等…

Apollo9.0源码部署(Nvidia显卡)

本文参照Apollo官方部署例程&#xff0c;进行修改。解决在部署期间遇到的网络不通、编译卡死、编译失败等问题。&#xff08;安装具有时效性&#xff0c;仅供参考&#xff09; 步骤1. 安装docker,显卡驱动、nvidia插件&#xff0c;此步骤可见专栏第一、二 节 步骤2. 拉取代…

第02章_MySQL环境搭建(基础)

1. MySQL 的卸载 1.1 步骤1&#xff1a;停止 MySQL 服务 在卸载之前&#xff0c;先停止 MySQL8.0 的服务。按键盘上的 “Ctrl Alt Delete” 组合键&#xff0c;打开“任务管理器”对话 框&#xff0c;可以在“服务”列表找到“MySQL8.0” 的服务&#xff0c;如果现在“正在…

【华为】配置VXLAN构建虚拟网络实现相同网段互通(静态方式)

微思网络 厦门微思网络 组网需求 企业已经建成比较成熟的园区网络&#xff0c;但是没有专用的数据中心网络&#xff0c;所有的服务器分布在不同的部门&#xff0c;并且不具备集中放置的条件。现在用户希望在已有园区网络上构建一个虚拟网络&#xff0c;需求如下&#xff1a; 将…

linux系统运维面试题(二)(Linux System Operations Interview Questions II)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

互联网直播/点播EasyDSS视频推拉流平台视频点播有哪些技术特点?

在数字化时代&#xff0c;视频点播应用已经成为我们生活中不可或缺的一部分。监控技术与视频点播的结合正悄然改变着我们获取和享受媒体内容的方式。这一变革不仅体现在技术层面的进步&#xff0c;更深刻地影响了我们。 EasyDSS视频直播点播平台是一款高性能流媒体服务软件。E…

最新SQL Server 2022保姆级安装教程【附安装包】

目录 一、安装包下载&#xff1a; 下载链接&#xff1a;https://pan.quark.cn/s/b1c0c63d61ec 二、安装SQL Server 1.下载安装包后解压出来&#xff0c;双击打开 2.等待加载安装程序 3.点击基本安装 4.点击接受 5.点击浏览 6.在D盘新建文件夹 7.命名为【Sql Server】&…

香港大带宽服务器:助力高效网络应用

随着全球化的加速和互联网流量的持续增长&#xff0c;大带宽服务器逐渐成为企业在全球范围内运营的关键设施。香港凭借其优越的地理位置、先进的网络基础设施和政策环境&#xff0c;成为部署大带宽服务器的重要节点之一。本文将全面探讨香港大带宽服务器的核心优势、应用场景及…

设计模式:责任链实现数据流风格的数据处理

数据流风格 数据流风格是软件架构中的一种风格&#xff0c;主要是面向数据&#xff0c;用于进行流式的数据处理&#xff1b;数据流风格的代表有管道-过滤器风格和批处理序列风格&#xff0c;这里主要是指管道-过滤器风格。 管道-过滤器风格就像其名字一样&#xff0c;是以一个…

PGSQL物化视图(Materialized View)

在 PostgreSQL 中&#xff0c;物化视图&#xff08;Materialized View&#xff09;是一种特殊的数据库对象&#xff0c;它存储了查询的结果集&#xff0c;并可以定期刷新以反映基础表中的数据变化。物化视图可以提高查询性能&#xff0c;因为它减少了每次查询时重新计算数据的需…

浏览器缓存与协商缓存

1. 强缓存&#xff08;Strong Cache&#xff09; 定义 强缓存是指在缓存的资源有效期内&#xff0c;浏览器会直接使用缓存中的数据&#xff0c;而不会发起网络请求。也就是说&#xff0c;浏览器会直接从本地缓存读取资源&#xff0c;不会与服务器进行任何交互。 如何控制强缓…

JS听到了替罪的回响

这篇还是继续写JS 这是有关函数的一些内容 函数 为什么需要函数 函数是被设计为执行指定任务的代码块 函数可以把具有相同或者相似逻辑的代码包裹起来&#xff0c;通过函数调用执行这些被包裹的代码逻辑&#xff0c;这样的优势是有利于精简代码方便复用 函数使用 这是函…

【优选算法】前缀和

目录 一、[【模板】前缀和](https://www.nowcoder.com/practice/acead2f4c28c401889915da98ecdc6bf?tpId230&tqId2021480&ru/exam/oj&qru/ta/dynamic-programming/question-ranking&sourceUrl%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595…

SAP ME2L/ME2M/ME3M报表增强添加字段

SAP ME2L/ME2M/ME3M报表增强添加字段&#xff08;包含&#xff1a;LMEREPI02、SE18:ES_BADI_ME_REPORTING&#xff09; ME2L、ME2M、ME3M这三个报表的字段增强&#xff0c;核心点都在同一个结构里 SE11:MEREP_OUTTAB_PURCHDOC 在这里加字段&#xff0c;如果要加的字段是EKKO、…

破解天然气巡检挑战,构建智能运维体系

一、行业现状 天然气行业在能源领域地位举足轻重&#xff0c;其工作环境高风险&#xff0c;存在有毒有害、易爆气体及高温等情况&#xff0c;且需持续监控设备运行状态&#xff0c;人工巡检面临巨大挑战与风险。好在随着科技发展&#xff0c;防爆巡检机器人的应用为天然气管道…

TSmaster CAN/CANFD 诊断(Diagnostic_CAN)

文章目录 1、Diagnostic TP 参数配置1.1 传输层参数&#xff1a;1.2 服务层参数1.3 Seed&Key 2、基础诊断配置2.1 添加/删除 服务2.2 配置 BasicDiagnostic 服务参数 3、诊断控制台4、自动诊断流程4.1 流程用例管理4.2 配置诊断流程&#xff08;UDS Flow&#xff09;4.2.1 …

详解Servlet的使用

目录 Servlet 定义 动态页面 vs 静态页面 主要功能 Servlet的使用 创建Maven项目 引入依赖 创建目录 编写代码 打war包 部署程序 验证程序 Smart Tomcat 安装Smart Tomcat 配置Smart Tomcat插件 启动Tomcat 访问页面 路径对应关系 Servlet运行原理 Tomcat的…

mysql数据库双机互为主从设置与数据库断电无法启动处理

一、mysql数据库双机互为主从设置 前言 1.环境windows 2.数据库8.0 3.服务器1&#xff1a;192.168.12.1 4.服务器2&#xff1a;192.168.12.2 1. 设置数据库的配置文件 对文件名&#xff1a;my.ini进行修改 服务器1&#xff1a;192.168.12.1配置文件设置 [mysql] 下添加如…

strupr(arr);模拟实现(c基础)

hi , I am 36 适合对象c语言初学者 strupr(arr);函数是把arr数组变为大写字母&#xff0c;并返回arr 介绍一下strupr(arr)&#xff1b;(c基础&#xff09;-CSDN博客 现在进行My__strupr(arr);模拟实现 #include<stdio.h>//My__strupr(arr); //返回值为arr(地址),于是…