【引言】

在快节奏的现代生活中,人们往往因为忙碌而忽略了与亲戚间的互动,特别是在春节期间,面对众多的长辈和晚辈时,很多人会感到困惑,不知道该如何正确地称呼每一位亲戚。针对这一问题,我们开发了一款基于鸿蒙NEXT平台的“亲戚关系计算器”应用,旨在帮助用户快速、准确地识别和称呼他们的亲戚。

【环境准备】

• 操作系统:Windows 10

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

• 目标设备:华为Mate60 Pro

• 开发语言:ArkTS

• 框架:ArkUI

• API版本:API 12

• 三方库:@nutpi/relationship(核心算法)

【应用背景】

中国社会有着深厚的家庭观念,亲属关系复杂多样。从血缘到姻亲,从直系到旁系,每一种关系都有其独特的称呼方式。然而,随着社会的发展,家庭成员之间的联系逐渐变得疏远,尤其是对于年轻人来说,准确地称呼每一位亲戚成了一项挑战。为了应对这一挑战,“亲戚关系计算器”应运而生。

【核心功能】

1. 关系输入:用户可以通过界面输入或选择具体的亲戚关系描述,例如“爸爸的哥哥的儿子”。

2. 性别及称呼选择:考虑到不同地区的习俗差异,应用允许用户选择自己的性别和希望使用的称呼方式,比如“哥哥”、“姐夫”等。

3. 关系计算:利用@nutpi/relationship库,根据用户提供的信息,精确计算出正确的亲戚称呼。

4. 示例与清空:提供示例按钮供用户测试应用功能,同时也设有清空按钮方便用户重新开始。

5. 个性化设置:支持多种方言和地方习惯的称呼方式,让应用更加贴近用户的实际需求。

【用户界面】

应用的用户界面简洁明了,主要由以下几个部分组成:

• 选择性别:通过分段按钮让用户选择自己的性别。

• 选择称呼方式:另一个分段按钮让用户选择希望的称呼方式。

• 输入关系描述:提供一个文本输入框,用户可以在此处输入具体的关系描述。

• 结果显示区:在用户提交信息后,这里会显示出正确的亲戚称呼。

• 操作按钮:包括示例按钮、清空按钮等,方便用户操作。

【完整代码】

导包

ohpm install @nutpi/relationship

代码

// 导入关系计算模块
import relationship from "@nutpi/relationship"
// 导入分段按钮组件及配置类型
import { SegmentButton, SegmentButtonItemTuple, SegmentButtonOptions } from '@kit.ArkUI'; // 使用 @Entry 和 @Component 装饰器标记这是一个应用入口组件
@Entry
@Component
// 定义一个名为 RelationshipCalculator 的结构体,作为组件主体
struct RelationshipCalculator {
// 用户输入的关系描述,默认值为“爸爸的堂弟”
@State private userInputRelation: string = "爸爸的堂弟";
// 应用的主题颜色,设置为橙色
@State private themeColor: string | Color = Color.Orange;
// 文字颜色
@State private textColor: string = "#2e2e2e";
// 边框颜色
@State private lineColor: string = "#d5d5d5";
// 基础内边距大小
@State private paddingBase: number = 30;
// 性别选项数组
@State private genderOptions: object[] = [Object({ text: '男' }), Object({ text: '女' })];
// 称呼方式选项数组
@State private callMethodOptions: object[] = [Object({ text: '我叫ta' }), Object({ text: 'ta叫我' })];
// 性别选择按钮的配置
@State private genderButtonOptions: SegmentButtonOptions | undefined = undefined;
// 称呼方式选择按钮的配置
@State private callMethodButtonOptions: SegmentButtonOptions | undefined = undefined;
// 当前选中的性别索引
@State @Watch('updateSelections') selectedGenderIndex: number[] = [0];
// 当前选中的称呼方式索引
@State @Watch('updateSelections') selectedCallMethodIndex: number[] = [0];
// 用户输入的关系描述
@State @Watch('updateSelections') userInput: string = "";
// 计算结果显示
@State calculationResult: string = "";
// 输入框是否获得焦点
@State isInputFocused: boolean = false; // 当选择发生改变时,更新关系计算
updateSelections() {
// 根据索引获取选中的性别(0为男,1为女)
const gender = this.selectedGenderIndex[0] === 0 ? 1 : 0;
// 判断是否需要反转称呼方向
const reverse = this.selectedCallMethodIndex[0] === 0 ? false : true;
// 调用关系计算模块进行计算
const result: string[] = relationship({ text: this.userInput, reverse: reverse, sex: gender }) as string[];
// 如果有计算结果,则更新显示;否则显示默认提示
if (result && result.length > 0) {
this.calculationResult = `${reverse ? '对方称呼我' : '我称呼对方'}:${result[0]}`;
} else {
this.calculationResult = this.userInput ? '当前信息未查到关系' : '';
}
} // 组件即将显示时,初始化性别和称呼方式选择按钮的配置
aboutToAppear(): void {
this.genderButtonOptions = SegmentButtonOptions.capsule({
buttons: this.genderOptions as SegmentButtonItemTuple,
multiply: false,
fontColor: Color.White,
selectedFontColor: Color.White,
selectedBackgroundColor: this.themeColor,
backgroundColor: this.lineColor,
backgroundBlurStyle: BlurStyle.BACKGROUND_THICK
});
this.callMethodButtonOptions = SegmentButtonOptions.capsule({
buttons: this.callMethodOptions as SegmentButtonItemTuple,
multiply: false,
fontColor: Color.White,
selectedFontColor: Color.White,
selectedBackgroundColor: this.themeColor,
backgroundColor: this.lineColor,
backgroundBlurStyle: BlurStyle.BACKGROUND_THICK
});
} // 构建组件界面
build() {
// 创建主列布局
Column() {
// 标题栏
Text('亲戚关系计算器')
.fontColor(this.textColor)
.fontSize(18)
.width('100%')
.height(50)
.textAlign(TextAlign.Center)
.backgroundColor(Color.White)
.shadow({
radius: 2,
color: this.lineColor,
offsetX: 0,
offsetY: 5
});
// 内部列布局
Column() {
// 性别选择行
Row() {
Text('我的性别').fontColor(this.textColor).fontSize(18);
// 性别选择按钮
SegmentButton({
options: this.genderButtonOptions,
selectedIndexes: this.selectedGenderIndex
}).width('400lpx');
}.height(45).justifyContent(FlexAlign.SpaceBetween).width('100%'); // 称呼方式选择行
Row() {
Text('称呼方式').fontColor(this.textColor).fontSize(18);
// 称呼方式选择按钮
SegmentButton({
options: this.callMethodButtonOptions,
selectedIndexes: this.selectedCallMethodIndex
}).width('400lpx');
}.height(45).justifyContent(FlexAlign.SpaceBetween).width('100%'); // 示例与清空按钮行
Row() {
// 示例按钮
Text('示例')
.fontColor("#5871ce")
.fontSize(18)
.padding(`${this.paddingBase / 2}lpx`)
.backgroundColor("#f2f1fd")
.borderRadius(5)
.clickEffect({ level: ClickEffectLevel.LIGHT, scale: 0.8 })
.onClick(() => {
this.userInput = this.userInputRelation;
});
// 空白间隔
Blank();
// 清空按钮
Text('清空')
.fontColor("#e48742")
.fontSize(18)
.padding(`${this.paddingBase / 2}lpx`)
.clickEffect({ level: ClickEffectLevel.LIGHT, scale: 0.8 })
.backgroundColor("#ffefe6")
.borderRadius(5)
.onClick(() => {
this.userInput = "";
});
}.height(45)
.justifyContent(FlexAlign.SpaceBetween)
.width('100%'); // 用户输入框
TextInput({
text: $$this.userInput,
placeholder: !this.isInputFocused ? `请输入称呼。如:${this.userInputRelation}` : ''
})
.placeholderColor(this.isInputFocused ? this.themeColor : Color.Gray)
.fontColor(this.isInputFocused ? this.themeColor : this.textColor)
.borderColor(this.isInputFocused ? this.themeColor : Color.Gray)
.caretColor(this.themeColor)
.borderWidth(1)
.borderRadius(10)
.onBlur(() => this.isInputFocused = false)
.onFocus(() => this.isInputFocused = true)
.height(45)
.width('100%')
.margin({ top: `${this.paddingBase / 2}lpx` });
}
.alignItems(HorizontalAlign.Start)
.width('650lpx')
.padding(`${this.paddingBase}lpx`)
.margin({ top: `${this.paddingBase}lpx` })
.borderRadius(10)
.backgroundColor(Color.White)
.shadow({
radius: 10,
color: this.lineColor,
offsetX: 0,
offsetY: 0
}); // 结果显示区
Column() {
Row() {
// 显示计算结果
Text(this.calculationResult).fontColor(this.textColor).fontSize(18);
}.justifyContent(FlexAlign.SpaceBetween).width('100%');
}
.visibility(this.calculationResult ? Visibility.Visible : Visibility.None)
.alignItems(HorizontalAlign.Start)
.width('650lpx')
.padding(`${this.paddingBase}lpx`)
.margin({ top: `${this.paddingBase}lpx` })
.borderRadius(10)
.backgroundColor(Color.White)
.shadow({
radius: 10,
color: this.lineColor,
offsetX: 0,
offsetY: 0
});
}
.height('100%')
.width('100%')
.backgroundColor("#f4f8fb");
}
}

  

鸿蒙NEXT开发案例:亲戚关系计算器的更多相关文章

  1. 最全华为鸿蒙 HarmonyOS 开发资料汇总

    开发 本示例基于 OpenHarmony 下的 JavaScript UI 框架,进行项目目录解读,JS FA.常用和自定义组件.用户交互.JS 动画的实现,通过本示例可以基本了解和学习到 JavaS ...

  2. 【推荐】使用Jquery+EasyUI进行框架项目开发案例讲解之一---员工管理源码分享

    使用Jquery+EasyUI 进行框架项目开发案例讲解之一 员工管理源码分享   在开始讲解之前,我们先来看一下什么是Jquery EasyUI?jQuery EasyUI是一组基于jQuery的U ...

  3. 使用Jquery+EasyUI进行框架项目开发案例解说之中的一个---员工管理源代码分享

    使用Jquery+EasyUI 进行框架项目开发案例解说之中的一个 员工管理源代码分享 在開始解说之前,我们先来看一下什么是Jquery EasyUI?jQuery EasyUI是一组基于jQuery ...

  4. 使用Jquery+EasyUI进行框架项目开发案例讲解之一---员工管理源码分享

    使用Jquery+EasyUI进行框架项目开发案例讲解之一---员工管理源码分享 使用Jquery+EasyUI 进行框架项目开发案例讲解之一 员工管理源码分享    在开始讲解之前,我们先来看一下什 ...

  5. AllJoyn+Android开发案例-android跨设备调用方法

    AllJoyn+Android开发案例-android跨设备调用方法 项目须要涉及AllJoyn开源物联网框架.前面主要了解了一些AllJoyn主要的概念.像总线,总线附件,总线对象,总线接口这种概念 ...

  6. ​ 用一个开发案例详解Oracle临时表

    ​ 用一个开发案例详解Oracle临时表 2016-11-14 bisal ITPUB  一.开发需求  最近有一个开发需求,大致需要先使用主表,或主表和几张子表关联查询出ID(主键)及一些主表字段 ...

  7. (转)使用Jquery+EasyUI进行框架项目开发案例讲解之一---员工管理源码分享

    原文地址:http://www.cnblogs.com/huyong/archive/2013/09/24/3334848.html 使用Jquery+EasyUI 进行框架项目开发案例讲解之一 员工 ...

  8. 基于FPGA的光口通信开发案例|基于Kintex-7 FPGA SFP+光口的10G UDP网络通信开发案例

    前言 自著名华人物理学家高锟先生提出"光传输理论",实用化的光纤传输产品始于1976年,经历了PDH→SDH→DWDM→ASON→MSTP的发展历程.本世纪初期,ASON/OADM ...

  9. 使用Jquery+EasyUI 进行框架项目开发案例讲解之五 模块(菜单)管理源码分享

    http://www.cnblogs.com/huyong/p/3454012.html 使用Jquery+EasyUI 进行框架项目开发案例讲解之五  模块(菜单)管理源码分享    在上四篇文章 ...

  10. 使用Jquery+EasyUI 进行框架项目开发案例讲解之四 组织机构管理源码分享

    http://www.cnblogs.com/huyong/p/3404647.html 在上三篇文章  <使用Jquery+EasyUI进行框架项目开发案例讲解之一---员工管理源码分享> ...

随机推荐

  1. .net 环境使用 RabbitMQ ,由浅入深 【一】

    最近因为先开发的项目需要用到消息队列,因此捣鼓了一下市面上开源的消息队列. 原本听闻Rocketmq ,一开始用的是 RocketMQ,各种集群搭建完毕,消息发送什么的测试后,,但是结果因为 Rock ...

  2. 6.24.2 数据库&漏洞口令&应急取证

    windows日志分析神器 logonTracer-外内网日志 github下载:#JPCERTCC/LogonTracer:通过可视化和分析 Windows 事件日志来调查恶意 Windows 登录 ...

  3. VS2019 查看源码,使用F12查看源码

    前几天在微软社区看到VS的功能演示时,偶然看到此功能,对于开发人员来说太有用了,特此记录分享出来希望可以帮助到家. 具体设置步骤,打开vs2019,在工具>选项>文本编辑器>c#&g ...

  4. 探索AI人才培养新范式,合合信息与同济大学软件学院签署产教融合人才培养协议

    随着科学技术的发展,促进人工智能产业与高校人才培养相融合,正成为业界关注的焦点.7月3日,上海合合信息科技股份有限公司(以下简称:合合信息)与同济大学软件学院"产教融合人才培养签约暨创新实践 ...

  5. TS2Vec: 面向通用的时间序列表示《TS2Vec: Towards Universal Representation of Time Series》(时间序列、对比学习、多尺度特征(池化操作)、分层对比、上下文一致性(时间戳掩码+随机裁剪))

    今天是2024年5月22日,10:24,今天看这篇经典的论文(如果你问我为什么最近频繁看论文,因为我的创新点无了,要找创新点+太菜了,菜就多看多学). 论文:TS2Vec: Towards Unive ...

  6. reinstall nodejs 后跑不到 command

    现象 : node -v 可以跑 , ng new 这些就跑不到 (确保已经安装了 global cli) 那多半是 path 的问题 https://stackoverflow.com/questi ...

  7. 分享3款开源、免费的Avalonia UI控件库

    Avalonia介绍 Avalonia是一个强大的框架,使开发人员能够使用.NET创建跨平台应用程序.它使用自己的渲染引擎绘制UI控件,确保在Windows.macOS.Linux.Android.i ...

  8. Vue3——SVG 图标配置

    1. SVG 图标配置 安装 SVG 依赖插件 vite-plugin-svg-icons npm i vite-plugin-svg-icons -D npm install fast-glob - ...

  9. Blazor与IdentityServer4的集成

    本文合并整理自 CSDN博主「65号腕」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. Blazor与IdentityServer4的集成(一) IdentityS ...

  10. linux 挂载硬盘报错 "mount: unknown filesystem type 'ntfs'"

    这个错误是说,系统无法识别ntfs格式的硬盘.所以不能直接挂载. 解决这个问题的思路有两个: 格式化磁盘为linux可以识别的格式. 通过工具使linux可以识别ntfs格式. 如果是第一次挂载硬盘可 ...