HarmonyOS NEXT星河版之在线考试功能实战

2024-05-07 10:04

本文主要是介绍HarmonyOS NEXT星河版之在线考试功能实战,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 一、目标
    • 二、基础搭建
      • 2.1 定义数据
      • 2.2 mock数据
      • 2.3 主页面布局
        • 2.3.1 布局规划
        • 2.3.2 标题栏
        • 2.3.3 进度条
        • 2.3.4 答题模块
        • 2.3.5 底部按钮
      • 2.4 主页面逻辑
        • 2.4.1 加载数据及定义变量
        • 2.4.2 上一题、下一题
    • 三、选项点击及高亮
      • 3.1 声明对象及变量
      • 3.2 给选项注册点击事件
      • 3.3 处理背景和文本颜色
    • 四、小结

一、目标

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、基础搭建

2.1 定义数据

// 题目
export interface ExamItem {id: numbertitle: stringoptions: OptionItem[]
}
// 答案
export interface OptionItem {letter: stringcontent: string
}

2.2 mock数据

export const mockExamDataList: ExamItem[] = [{id: 1,title: 'Android系统的构建系统叫什么名字?',options: [{ letter: 'A', content: 'Gradle' },{ letter: 'B', content: 'Maven' },{ letter: 'C', content: 'Ant' },{ letter: 'D', content: 'Make' },],},{id: 2,title: '以下哪个组件不是Android架构的一部分?',options: [{ letter: 'A', content: 'Activity(活动)' },{ letter: 'B', content: 'Service(服务)' },{ letter: 'C', content: 'Content Provider(内容提供者)' },{ letter: 'D', content: 'Fragment(片段)' },],},{id: 3,title: 'Android中的RecyclerView控件有什么用途?',options: [{ letter: 'A', content: '显示一个可滚动的元素列表' },{ letter: 'B', content: '在不同活动之间导航' },{ letter: 'C', content: '播放视频内容' },{ letter: 'D', content: '绘制自定义的形状和路径' },],},
];

2.3 主页面布局

2.3.1 布局规划

将主页面布局抽取,封装对应如下:
在这里插入图片描述

2.3.2 标题栏
@Builder
getTitleBar() {Stack({ alignContent: Alignment.Start }) {Image($r('app.media.ic_left_arrow')).width(24)Text('在线考试').width('100%').textAlign(TextAlign.Center)}.padding({ left: 12, right: 12 }).width('100%').height(52).backgroundColor(Color.White).borderWidth({bottom: 0.5}).borderColor('#e5e5e5')
}
2.3.3 进度条
@Builder
getProgressView() {Row() {Progress({ value: this.currentIndex + 1, total: this.questionList.length }).padding({ left: 12, right: 12 })Text() {Span(`${this.currentIndex + 1}`).fontColor(Color.Black)Span('/' + this.questionList.length).fontColor(Color.Gray)}.layoutWeight(1)}.width('100%')
}
2.3.4 答题模块
Column() {Column({ space: 5 }) {Text(this.currentQuestion.title).margin({ bottom: 6, top: 12 })ForEach(this.currentQuestion.options, (item: OptionItem) => {Row() {Text(item.letter + '. ')Text(item.content)}.width('100%').height(40).padding({ left: 12 }).backgroundColor('#F9F9F9')})}.alignItems(HorizontalAlign.Start).width('100%').padding({ left: 15, right: 15 })}.layoutWeight(1)
2.3.5 底部按钮
@Builder
getBottomView() {Row() {Row({ space: 3 }) {Image($r('app.media.ic_arrow_left')).width(15).fillColor(this.getPreEnable() ? Color.Black : '#BABABA')Text('上一题').fontColor(this.getPreEnable() ? Color.Black : '#BABABA')}.onClick(() => {this.onPreClick()})Row({ space: 3 }) {Text('下一题').fontColor(this.getNextEnable() ? Color.Black : '#BABABA')Image($r('app.media.ic_arrow_right')).width(15).fillColor(this.getNextEnable() ? Color.Black : '#BABABA')}.onClick(() => {this.onNextClick()})}.width('100%').justifyContent(FlexAlign.SpaceBetween).backgroundColor(Color.White).height(50).padding({left: 12, right: 12}).border({color: '#e5e5e5',width: { top: 1 }})
}

2.4 主页面逻辑

2.4.1 加载数据及定义变量
// 题目列表@State questionList: ExamItem[] = []// 当前显示第N题@State currentIndex: number = 0// 当前题目@State currentQuestion: ExamItem = {} as ExamItemaboutToAppear(): void {this.loadData()}async loadData() {// 模拟网络获取数据this.questionList = await new Promise<ExamItem[]>((resolve, reject) => {setTimeout(() => {resolve(mockExamDataList)}, 500)});// 默认展示第一条this.currentQuestion = this.questionList[this.currentIndex]}
2.4.2 上一题、下一题
onPreClick() {if (this.getPreEnable()) {this.currentIndex--this.currentQuestion = this.questionList[this.currentIndex]}
}onNextClick() {if (this.getNextEnable()) {this.currentIndex++this.currentQuestion = this.questionList[this.currentIndex]}
}getPreEnable() {return this.currentIndex > 0
}getNextEnable() {return this.currentIndex < this.questionList.length - 1
}

三、选项点击及高亮

3.1 声明对象及变量

export interface UserAnswer {questionId: number // 问题IDuserAnswer: string // 用户选择项
}

在主页面中,定义变量,存储用户做题数据,如下:

// 存储题目和用户答案
@State userAnswerList: Record<number, UserAnswer> = {}

3.2 给选项注册点击事件

ForEach(this.currentQuestion.options, (item: OptionItem) => {Row() {Text(item.letter + '. ')Text(item.content)}.width('100%').height(40).padding({ left: 12 }).onClick(() => {this.onUserAnswerClick(item)})})

处理点击事件:

onUserAnswerClick(option: OptionItem) {this.userAnswerList[this.currentQuestion.id] = {questionId: this.currentQuestion.id,userAnswer: option.letter}}

3.3 处理背景和文本颜色

Row() {Text(item.letter + '. ').fontColor(this.getOptionColor(item, 'font'))Text(item.content).fontColor(this.getOptionColor(item, 'font'))
}
...
.backgroundColor(this.getOptionColor(item))
/*** 获取选择项背景或文本颜色* @param option 当前选择项* @param type 类型* @returns*/
getOptionColor(option: OptionItem, type: 'back' | 'font' = 'back') {if (this.currentQuestion) {const userAnswer = this.userAnswerList[this.currentQuestion.id]if (userAnswer?.userAnswer === option.letter) {return type === 'back' ? Color.Pink : Color.White}}return type === 'back' ? '#e5e5e5' : Color.Black
}

四、小结

  • UI布局
  • 题目切换处理
  • 做题标记及高亮展示

这篇关于HarmonyOS NEXT星河版之在线考试功能实战的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/967041

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题是由安全生产模拟考试一点通提供,流动式起重机司机证模拟考试题库是根据流动式起重机司机最新版教材,流动式起重机司机大纲整理而成(含2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题参考答案和部分工种参考解析),掌握本资料和学校方法,考试容易。流动式起重机司机考试技

电力系统中的A类在线监测装置—APView400

随着电力系统的日益复杂和人们对电能质量要求的提高,电能质量在线监测装置在电力系统中得到广泛应用。目前,市场上的在线监测装置主要分为A类和B类两种类型,A类和B类在线监测装置主要区别在于应用场景、技术参数、通讯协议和扩展性。选择时应根据实际需求和应用场景综合考虑,并定期维护和校准。电能质量在线监测装置是用于实时监测电力系统中的电能质量参数的设备。 APView400电能质量A类在线监测装置以其多核

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

hdu 2093 考试排名(sscanf)

模拟题。 直接从教程里拉解析。 因为表格里的数据格式不统一。有时候有"()",有时候又没有。而它也不会给我们提示。 这种情况下,就只能它它们统一看作字符串来处理了。现在就请出我们的主角sscanf()! sscanf 语法: #include int sscanf( const char *buffer, const char *format, ... ); 函数sscanf()和