鸿蒙NEXT开发案例:血型遗传计算

【引言】

血型遗传计算器是一个帮助用户根据父母的血型预测子女可能的血型的应用。通过选择父母的血型,应用程序能够快速计算出孩子可能拥有的血型以及不可能拥有的血型。这个过程不仅涉及到了简单的数据处理逻辑,还涉及到UI设计与交互体验的设计。

【环境准备】

• 操作系统:Windows 10
• 开发工具:DevEco Studio NEXT Beta1 Build Version: 5.0.3.806
• 目标设备:华为Mate60 Pro
• 开发语言:ArkTS
• 框架:ArkUI
• API版本:API 12

【开发步骤】

1. 创建组件

首先,我们使用@Entry和@Component装饰器创建一个名为BloodTypeCalculator的组件。这标志着我们的组件是鸿蒙NEXT应用的一个入口点。

@Entry
@Component
struct BloodTypeCalculator {// 组件的状态和方法定义
}

2. 定义状态

为了控制组件的外观和行为,我们定义了一系列的状态变量,如主题颜色、文本颜色、边框颜色等。同时,我们也定义了两个数组来存储可能和不可能的血型结果。

@State private themeColor: string | Color = Color.Orange;
@State private textColor: string = "#2e2e2e";
@State private lineColor: string = "#d5d5d5";
@State private possibleBloodTypesText: string = "";
@State private impossibleBloodTypesText: string = "";

3. 血型逻辑实现

接下来,实现了几个关键的方法来处理血型相关的逻辑。这些方法包括根据血型获取基因组合、组合父母的基因以获得子代可能的基因组合、根据基因组合确定血型等。

getGenes(bloodType: string): string[];
combineGenes(fatherGenes: string[], motherGenes: string[]): string[];
getBloodTypesFromGenes(genes: string[]): string[];

4. 交互逻辑

为了实现用户选择父母血型后自动计算子代血型的功能,我们使用了@Watch装饰器监听选择的变化,并在变化时调用计算方法更新结果显示。

@State @Watch('capsuleSelectedIndexesChanged') fatherBloodTypeIndex: number[] = [0];
@State @Watch('capsuleSelectedIndexesChanged') motherBloodTypeIndex: number[] = [0];capsuleSelectedIndexesChanged() {// 更新血型信息
}

5. UI设计

最后,我们构建了用户界面,包括页面标题、工具介绍、父母血型选择区域以及结果显示区域。这里使用了Column、Row、Text和SegmentButton等组件来布局和美化界面。

build() {Column() {// 页面标题Text('血型遗传计算');// 其他UI元素...}.height('100%').width('100%').backgroundColor("#f4f8fb");
}

总结

通过上述步骤,我们成功地开发了一个基于鸿蒙NEXT的血型遗传计算器。这个案例不仅展示了鸿蒙NEXT框架下组件化开发的基本流程,同时也体现了通过合理的状态管理和逻辑处理,可以轻松实现复杂的业务需求。对于希望深入了解鸿蒙NEXT框架的开发者来说,这是一个很好的实践案例。希望这篇文章能为你提供灵感,鼓励你在鸿蒙NEXT的开发道路上继续前行。

【完整代码】

// 导入SegmentButton及其相关类型定义
import { SegmentButton, SegmentButtonItemTuple, SegmentButtonOptions } from '@kit.ArkUI';// 使用@Entry装饰器标记此组件为入口点
@Entry// 使用@Component装饰器标记此结构体为一个组件
@Component// 定义一个名为BloodTypeCalculator的结构体,用于实现血型遗传计算功能
struct BloodTypeCalculator {// 定义主题颜色,默认为橙色@State private themeColor: string | Color = Color.Orange;// 定义文本颜色,默认为深灰色@State private textColor: string = "#2e2e2e";// 定义边框颜色,默认为浅灰色@State private lineColor: string = "#d5d5d5";// 定义基础内边距大小,默认为30@State private basePadding: number = 30;// 存储可能的血型结果@State private possibleBloodTypesText: string = "";// 存储不可能的血型结果@State private impossibleBloodTypesText: string = "";// 定义血型列表,包含A、B、AB、O四种血型@State private bloodTypeList: object[] = [Object({ text: 'A' }), Object({ text: 'B' }), Object({ text: 'AB' }), Object({ text: 'O' })];// 初始化单选胶囊按钮的配置项@State singleSelectCapsuleOptions: SegmentButtonOptions | undefined = undefined;// 监听父亲血型选择变化@State @Watch('capsuleSelectedIndexesChanged') fatherBloodTypeIndex: number[] = [0];// 监听母亲血型选择变化@State @Watch('capsuleSelectedIndexesChanged') motherBloodTypeIndex: number[] = [0];// 根据血型获取其可能的基因组合getGenes(bloodType: string): string[] {console.info(`bloodType:${bloodType}`);switch (bloodType) {case 'A': return ['A', 'O']; // A型血可能的基因组合case 'B': return ['B', 'O']; // B型血可能的基因组合case 'AB': return ['A', 'B']; // AB型血可能的基因组合case 'O': return ['O']; // O型血可能的基因组合default: throw new Error('Invalid blood type'); // 非法血型抛出错误}}// 组合父母的基因以获得子代可能的基因组合combineGenes(fatherGenes: string[], motherGenes: string[]): string[] {const possibleGenes: string[] = []; // 用于存储可能的基因组合for (const fatherGene of fatherGenes) {for (const motherGene of motherGenes) {const combinedGene = [fatherGene, motherGene].sort().join(''); // 将父母的基因组合并排序后加入数组if (!possibleGenes.includes(combinedGene)) {possibleGenes.push(combinedGene); // 如果组合尚未存在,则加入数组}}}return possibleGenes; // 返回所有可能的基因组合}// 根据基因组合确定血型getBloodTypesFromGenes(genes: string[]): string[] {const bloodTypes: string[] = []; // 用于存储可能的血型for (const gene of genes) {if (gene === 'AA' || gene === 'AO' || gene === 'OA') {bloodTypes.push('A'); // 基因组合为AA、AO或OA时,血型为A} else if (gene === 'BB' || gene === 'BO' || gene === 'OB') {bloodTypes.push('B'); // 基因组合为BB、BO或OB时,血型为B} else if (gene === 'AB' || gene === 'BA') {bloodTypes.push('AB'); // 基因组合为AB或BA时,血型为AB} else if (gene === 'OO') {bloodTypes.push('O'); // 基因组合为OO时,血型为O}}// 去除重复的血型return bloodTypes.filter((value, index, self) => self.indexOf(value) === index);}// 计算孩子可能的血型及不可能的血型calculatePossibleBloodTypes(father: string, mother: string) {const fatherGenes = this.getGenes(father); // 获取父亲的基因组合const motherGenes = this.getGenes(mother); // 获取母亲的基因组合const possibleGenes = this.combineGenes(fatherGenes, motherGenes); // 组合父母的基因const possibleBloodTypes = this.getBloodTypesFromGenes(possibleGenes); // 从基因组合中获取可能的血型const allBloodTypes: string[] = ['A', 'B', 'AB', 'O']; // 所有可能的血型列表const impossibleBloodTypes = allBloodTypes.filter(bt => !possibleBloodTypes.includes(bt)); // 计算不可能的血型console.log(this.possibleBloodTypesText = `孩子可能血型:${possibleBloodTypes.join('、')}`); // 显示可能的血型console.log(this.impossibleBloodTypesText = `孩子不可能血型:${impossibleBloodTypes.join('、')}`); // 显示不可能的血型}// 当胶囊按钮的选择发生变化时调用此函数capsuleSelectedIndexesChanged() {let father: string = this.bloodTypeList[this.fatherBloodTypeIndex[0]]['text']; // 获取父亲选择的血型let mother: string = this.bloodTypeList[this.motherBloodTypeIndex[0]]['text']; // 获取母亲选择的血型this.calculatePossibleBloodTypes(father, mother); // 计算并更新血型信息}// 在组件即将出现时调用此函数aboutToAppear(): void {this.singleSelectCapsuleOptions = SegmentButtonOptions.capsule({buttons: this.bloodTypeList as SegmentButtonItemTuple, // 设置胶囊按钮的选项multiply: false, // 单选模式fontColor: Color.White, // 字体颜色为白色selectedFontColor: Color.White, // 选中时字体颜色为白色selectedBackgroundColor: this.themeColor, // 选中背景色为主题色backgroundColor: this.lineColor, // 背景色为边框颜色backgroundBlurStyle: BlurStyle.BACKGROUND_THICK // 背景模糊效果});this.capsuleSelectedIndexesChanged(); // 初始化时调用选择变化处理函数}// 构建用户界面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.lineColor, // 阴影颜色offsetX: 0, // 水平偏移量offsetY: 5 // 垂直偏移量});// 工具介绍部分Column() {Text('工具介绍').fontSize(20).fontWeight(600).fontColor(this.textColor);Text('血型是以A、B、O三种遗传因子的组合而决定的,根据父母的血型,就可以判断出以后出生的孩子的血型。').fontSize(18).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.lineColor,offsetX: 0,offsetY: 0});// 父亲血型选择部分Column() {Row() {Text('父亲血型').fontColor(this.textColor).fontSize(18);SegmentButton({options: this.singleSelectCapsuleOptions, // 胶囊按钮的配置项selectedIndexes: this.fatherBloodTypeIndex // 当前选中的索引}).width('400lpx');}.height(45).justifyContent(FlexAlign.SpaceBetween).width('100%');// 母亲血型选择部分Row() {Text('母亲血型').fontColor(this.textColor).fontSize(18);SegmentButton({options: this.singleSelectCapsuleOptions, // 胶囊按钮的配置项selectedIndexes: this.motherBloodTypeIndex // 当前选中的索引}).width('400lpx');}.height(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.lineColor,offsetX: 0,offsetY: 0});// 显示计算结果Column() {Row() {Text(this.possibleBloodTypesText).fontColor(this.textColor).fontSize(18);}.height(45).justifyContent(FlexAlign.SpaceBetween).width('100%');Row() {Text(this.impossibleBloodTypesText).fontColor(this.textColor).fontSize(18);}.height(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.lineColor,offsetX: 0,offsetY: 0});}.height('100%').width('100%').backgroundColor("#f4f8fb"); // 页面背景色}
}

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

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

相关文章

(十八)JavaWeb后端开发案例——会话/yml/过滤器/拦截器

目录 1.业务逻辑实现 1.1 登录校验技术——会话 1.1.1Cookie 1.1.2session 1.1.3JWT令牌技术 2.参数配置化 3.yml格式配置文件 4.过滤器Filter 5.拦截器Interceptor 1.业务逻辑实现 Day10-02. 案例-部门管理-查询_哔哩哔哩_bilibili //Controller层/*** 新增部门*/Pos…

2024.5 AAAiGLaM:通过邻域分区和生成子图编码对领域知识图谱对齐的大型语言模型进行微调

GLaM: Fine-Tuning Large Language Models for Domain Knowledge Graph Alignment via Neighborhood Partitioning and Generative Subgraph Encoding 问题 如何将特定领域知识图谱直接整合进大语言模型(LLM)的表示中,以提高其在图数据上自…

amd显卡和nVidia显卡哪个好 amd和英伟达的区别介绍

AMD和英伟达是目前市场上最主要的两大显卡品牌,它们各有自己的特点和优势,也有不同的适用场景和用户群体。那么,AMD显卡和英伟达显卡到底哪个好?它们之间有什么区别?我们又该如何选择呢?本文将从以下几个方…

接口加密了怎么测?

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 1、定义加密需求 确定哪些数据需要进行加密。这可以是用户敏感信息、密码、身份验证令牌等。确定使用的加密算法,如对称加密(如AES&am…

接口上传视频和oss直传视频到阿里云组件

接口视频上传 <template><div class"component-upload-video"><el-uploadclass"avatar-uploader":action"uploadImgUrl":on-progress"uploadVideoProcess":on-success"handleUploadSuccess":limit"lim…

springboot基于数据挖掘的广州招聘可视化分析系统

摘 要 基于数据挖掘的广州招聘可视化分析系统是一个创新的在线平台&#xff0c;旨在通过深入分析大数据来优化和改善广州地区的招聘流程。系统利用Java语言、MySQL数据库&#xff0c;结合目前流行的 B/S架构&#xff0c;将广州招聘可视化分析管理的各个方面都集中到数据库中&a…

VIM的下载使用与基本指令【入门级别操作】

VIM——超级文本编辑器 在当今时代&#xff0c;功能极其复杂的代码编辑器和集成开发环境&#xff08;IDE&#xff09;有很多。 但如果只想要一个超轻量级的代码编辑器&#xff0c;用于 Unix、C 或其他语言/系统&#xff0c;而不需要那些华而不实的功能&#xff0c;该怎么办呢&…

心情追忆-首页“毒“鸡汤AI自动化

之前&#xff0c;我独自一人开发了一个名为“心情追忆”的小程序&#xff0c;旨在帮助用户记录日常的心情变化及重要时刻。我从项目的构思、设计、前端&#xff08;小程序&#xff09;开发、后端搭建到最终部署。经过一个月的努力&#xff0c;通过群聊分享等方式&#xff0c;用…

开源代码统计工具cloc的简单使用

一.背景 公司之前开发了个小系统&#xff0c;要去申请著作权&#xff0c;需要填写代码数量。应该怎么统计呢&#xff1f;搜索了一下&#xff0c;还是用开源工具cloc吧&#xff01;我的操作系统是windows&#xff0c;代码主要是java项目和vue项目。 二.到哪里找 可以去官方下载…

基于单片机的条形码识别结算设计

本设计基于单片机的条形码辨识与结算系统。该系统主要用于超市、商场等场所的商品结算&#xff0c;实现了在超市内对不同种类商品进行自动识别及自动分类结算的功能。该系统由STM32F103C8T6单片机、摄像头、显示、蜂鸣器报警、按键和电源等多个模块构成。该系统可实现商品自动识…

进程间通信的信号艺术:机制、技术与实战应用深度剖析

目录 1 什么是信号 2 为什么要有信号 3 对于信号的反应 3.1 默认行为 3.2 signal()函数 -- 自定义行为对信号做出反应 3.3 对信号进行忽略 4 信号的产生的类型 4.1 kill命令 4.2 键盘输入产生信号 4.3 系统调用接口 4.3.1 kill() 4.3.2 raise() 函数 4.4 软件条件 …

美畅物联丨JT/T 808 终端设备如何加入畅联云平台

在道路运输行业中&#xff0c;JT/T 808终端设备的应用正变得越来越广泛&#xff0c;把该设备接入畅联云平台&#xff0c;能够达成更高效的车辆管理与监控功能。今天&#xff0c;我们就来探讨一下JT/T 808终端设备接入畅联云平台的步骤与要点。 一、了解畅联云平台接入要求 首先…

【微服务】SpringBoot 整合ELK使用详解

目录 一、前言 二、为什么需要ELK 三、ELK介绍 3.1 什么是elk 3.2 elk工作原理 四、ELK搭建 4.1 搭建es环境 4.1.1 获取es镜像 4.1.2 启动es容器 4.1.3 配置es参数 4.1.4 重启es容器并访问 4.2 搭建kibana 4.2.1 拉取kibana镜像 4.2.2 启动kibana容器 4.2.3 修改…

jenkins的安装(War包安装)

‌Jenkins是一个开源的持续集成工具&#xff0c;基于Java开发&#xff0c;主要用于监控持续的软件版本发布和测试项目。‌ 它提供了一个开放易用的平台&#xff0c;使软件项目能够实现持续集成。Jenkins的功能包括持续的软件版本发布和测试项目&#xff0c;以及监控外部调用执行…

低速接口项目之串口Uart开发(一)——串口UART

本节目录 一、串口UART 二、串口协议 三、串口硬件 四、往期文章链接本节内容 一、串口UART 串口UART,通用异步收发传输器&#xff08;Universal Asynchronnous Receiver / Transmitter&#xff09;,一种异步收发传输器&#xff0c;全双工传输。数据发送时&#xff0c;将并行…

WEB攻防-通用漏洞SQL注入Tamper脚本Base64Jsonmd5等

知识点&#xff1a; 1、数据表现格式类型注入&#xff1b; 2、字符转义绕过-宽字节注入&#xff1b; 3、数字&字符&搜索&编码&加密等&#xff1b; 参考资料&#xff1a; https://www.cnblogs.com/bmjoker/p/9326258.html SQL注入课程体系&#xff1a; 1、…

[Unity]TileMap开发,TileMap地图缝隙问题

环境&#xff1a; windows11 unity 2021.3.14f1c1 tilemap使用的图是美术已经拼接到一起的整图&#xff0c;块与块之间没有留缝隙 问题&#xff1a; TileMap地图直接在Unity中使用时&#xff0c;格子边缘会出现缝隙&#xff0c;移动或缩放地图时较明显。 解决方案&#x…

第75期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

Vue 专属状态管理库Pinia的使用与实践

目录 前言1. 什么是 Pinia&#xff1f;2. Pinia 的安装与基本配置2.1 安装 Pinia2.2 在 Vue 应用中配置 Pinia 3. 使用 Pinia 创建和管理状态3.1 定义一个简单的 Store3.2 在组件中使用 Store 4. Pinia 的高级功能4.1 使用 Getter 简化数据处理4.2 支持异步操作4.3 在服务端渲染…

Argo workflow 拉取git 并使用pvc共享文件

文章目录 拉取 Git 仓库并读取文件使用 Kubernetes Persistent Volumes&#xff08;通过 volumeClaimTemplates&#xff09;以及任务之间如何共享数据 拉取 Git 仓库并读取文件 在 Argo Workflows 中&#xff0c;如果你想要一个任务拉取 Git 仓库中的文件&#xff0c;另一个任…