当前位置: 首页 > news >正文

HarmonyOS 应用开发《掌上英语》第49篇:答题练习模式——两种答题 UI 的设计与实现

答题练习模式——两种答题 UI 的设计与实现

一、两种答题模式的场景定位

本项目中实现了两种答题页面,分别适用于不同的练习场景:

页面文件名适用场景特点
AnswerQuestionsPagefeatures/topicPage/…/AnswerQuestionsPage.ets日常练习单列模式、逐题作答
AnswerQuestionsTwoPagefeatures/topicPage/…/AnswerQuestionsTwoPage.ets模考/测试双栏模式、倒计时、答题卡

两种模式共享相同的数据源和答题逻辑,但 UI 布局和交互体验各有特色。

二、AnswerQuestionsPage——日常练习模式

2.1 页面结构

build(){AnswerQuestionsComponent({isCollectionEvent:()=>{this.isCollectionEvent();},confirmAddNote:(note:string)=>{this.confirmAddNote(note);},storageWrongClick:()=>{this.storageWrongClick();},storageCollectClick:()=>{this.storageCollectClick();},viewReport:()=>{this.viewReport();},onClickBack:()=>{if(this.sourceRouterModel?.sourceType==='我的错题'||...){RouterModule.pop();}else{this.backDialogController.open();}}});}

AnswerQuestionsPage 本身是一个轻量壳,将主要逻辑委托给AnswerQuestionsComponent(位于 answer_questions 组件中)。这种设计使得答题逻辑可以复用——无论是来自"我的错题"、“我的收藏"还是"日常练习”,都使用同一套答题组件。

2.2 数据初始化

aboutToAppear():void{letnavParam=RouterModule.getNavParam({url:RouterMap.ANSWER_QUESTIONS_PAGE});if(navParam!==null&&navParam!==undefined){if(navParaminstanceofQuestionsRouterModel){this.sourceRouterModel=navParamasQuestionsRouterModel;}else{letparamStr=String(navParam);if(paramStr==='1'){this.questionBankData=WORD_QUESTION_DATA;}elseif(paramStr==='2'){this.questionBankData=LISTENING_QUESTION_DATA;}elseif(paramStr==='3'){this.questionBankData=READING_QUESTION_DATA;}elseif(paramStr==='5'){this.questionBankData=GRAMMAR_QUESTION_DATA;}}}}

路由参数支持两种传入方式:

  1. QuestionsRouterModel:带有完整题目列表的对象(从错题本、收藏进入)
  2. 字符串标识'1'单词拼写、'2'听力、'3'阅读、'5'语法

2.3 练习结束统计

viewReport(){this.recordStudyData();lettestReport:TestReportModel=newTestReportModel();testReport.ques=this.ques;testReport.quesType=1;testReport.practiceDuration=this.practiceDuration;RouterModule.replace({url:RouterMap.ANSWER_REPORT_PAGE,param:testReport});}recordStudyData(){try{lettopicItemTypeList=this.toTopicItemTypeList(this.ques);StatisticsManager.getInstance().calculateStatistics(topicItemTypeList,this.practiceDuration);letplanManager=LearningPlanManager.getInstance();letansweredCount=this.ques.filter(item=>item.isAnswer).length;planManager.recordWordStudy(answeredCount);}catch(e){Logger.error('AnswerQuestionsPage',`记录学习数据失败:${JSON.stringify(e)}`);}}

练习完成后,调用StatisticsManager.calculateStatistics计算统计数据,同时更新学习计划。

三、AnswerQuestionsTwoPage——模考模式

3.1 页面结构

AnswerQuestionsTwoPage 是一个完整的独立页面,包含更多的模考专属功能:

build(){Column(){this.topBuilder();// 顶部导航this.countdownBuilder();// 倒计时this.answerPanelBuilder();// 作答面板this.bottomOperationBuilder();// 底部操作栏}.justifyContent(FlexAlign.SpaceBetween).backgroundColor($r('sys.color.comp_background_primary')).expandSafeArea([SafeAreaType.SYSTEM],[SafeAreaEdge.TOP,SafeAreaEdge.BOTTOM]);}

3.2 倒计时功能

@BuildercountdownBuilder(){Row(){Image($r('app.media.ic_public_alarm_clock'));Text($r('app.string.time_remaining'));TextTimer({isCountDown:true,count:this.timerCount,controller:this.textTimerController}).format('HH:mm:ss').fontColor($r('sys.color.multi_color_09')).onTimer((_utc:number,elapsedTime:number)=>{this.practiceDuration=elapsedTime;}).onAppear(()=>{this.textTimerController.start();});}}

使用 ArkUI 的TextTimer组件实现 30 分钟倒计时:

  • isCountDown: true启用倒计时模式
  • count: 30 * 60 * 1000设置 30 分钟(毫秒)
  • format: 'HH:mm:ss'显示格式
  • onTimer回调中记录已用时间

3.3 答题卡(AnswerSheet)

@BuilderanswerSheetBuilder(){Column(){Image($r('app.media.icon_answer_sheet'));Text($r('app.string.answer_sheet'));}.bindSheet($$this.isShowAnswerSheet,this.answerSheet(),{height:560,backgroundColor:$r('sys.color.background_secondary'),showClose:false,}).onClick(()=>{this.isShowAnswerSheet=true;});}

答题卡通过bindSheet实现底部弹出面板,用于快速跳转到任意题目。

3.4 左右滑动切题

.gesture(PanGesture(this.panOption).onActionUpdate((event:GestureEvent)=>{if(event){this.offsetX=this.positionX+event.offsetX;}}).onActionEnd(()=>{this.onActionEnd();}))onActionEnd(){if(this.offsetX>this.positionX){// 右滑 → 上一题this.currentIndex--;}else{// 左滑 → 下一题this.currentIndex++;}this.currentModel=this.ques[this.currentIndex];this.positionX=this.offsetX;}

使用PanGesture手势识别实现左右滑动切换题目,PanDirection 设置为Left | Right

3.5 交卷功能

nextQuestionBuilder(){Button(this.currentIndex===this.ques.length-1?$r('app.string.submit_exam'):$r('app.string.next_question')).onClick(()=>{if(this.currentIndex>=this.ques.length-1){this.submitExamDialogController.open();}else{this.currentIndex++;}});}

最后一题时按钮文字变为"交卷",点击弹出确认对话框。

四、两种模式的共同点

4.1 单选逻辑

answerEvent(item:AnswerItem){this.currentModel!.isAnswer=true;this.currentModel?.selectQues.splice(0);this.currentModel?.selectQues.push(item.ans);for(letindex=0;index<this.currentModel!.ques.length;index++){letelement=this.currentModel!.ques[index];element.isSelect=(element.ans===item.ans);}}

单选逻辑:清空已选、设置新选、标记选项状态。

4.2 错题记录

storageWrongClick(){if(this.currentModel.selectQues.toString()!==this.currentModel.rightQues.toString()){letcurrentItem=this.transTopicItemType();letarr:TopicItemType[]=PreferenceUtil.getInstance().get(PreferConstant.ERROR_RECORDS,[])asTopicItemType[];if(arr.length===0){arr.push(currentItem);}else{letisExit=arr.some(item=>item.keyID===currentItem.keyID);if(!isExit){arr.push(currentItem);}}PreferenceUtil.getInstance().put(PreferConstant.ERROR_RECORDS,arr);}}

答错时自动将题目写入PreferConstant.ERROR_RECORDS存储。

五、选择哪种模式

比较维度AnswerQuestionsPageAnswerQuestionsTwoPage
布局方式单列(组件化)双栏(独立页面)
当前题目数量由数据源决定固定 30 分钟
题目导航顺序作答答题卡 + 滑动
时间限制30 分钟倒计时
生词本支持支持
交卷方式手动报告弹框确认交卷

前者适合日常碎片化学习,后者适合模拟考试场景。两种模式的并存,满足了用户"学"和"测"的不同需求。

http://www.jsqmd.com/news/1275029/

相关文章:

  • A-59F啸叫抑制模组:反馈控制与自适应AEC的扩音系统协同方案
  • Qwen3与Nomic MoE模型在FastEmbed-rs中的高级应用技巧
  • 等离子风洞模拟卫星重返:报废卫星坠落或改变大气,影响待评估!
  • Jellium Desktop播放列表生成规则:创建生成规则的完整指南
  • hlink威联通NAS部署教程:解决重启后配置丢失的完美方案
  • 高压低噪声LDO评估板TPS7A1650-MVK深度解析与实战指南
  • 手机上怎么快速领打车优惠券?一个入口就能领,随领随用 - 工具软件使用方法推荐
  • 如何在macOS上使用OpenMTP实现快速免费的Android文件传输终极指南
  • PowerToys-CN高级技巧:自定义快捷键与模块组合,打造专属效率工作流
  • 2026 北京 16 区翡翠手镯回收,易奢福线上线下报价一致,就近到店变现 - 奢侈品回收实体店
  • TMS320VC5503内存映射、EMIF与EBSR配置实战解析
  • TI DAC121C081/085:12位I2C DAC选型、原理与嵌入式应用实战
  • 终极无损视频编辑指南:如何用LosslessCut保持原始画质快速剪辑
  • 计算机毕业设计之基于SpringBoot的家庭服务管理系统的设计与实现
  • EasyApplyJobsBot Pro版功能详解:值得升级吗?
  • 提升用户体验:Laravel Vouchers过期时间与数据附加功能实现
  • 如何轻松找回那些被遗忘的珍贵对话:微信聊天记录永久保存的终极方案
  • AiPy智能设计工具:提升海报创作效率的AI解决方案
  • 手机京东领外卖优惠券最新攻略全解析 - 工具软件使用方法推荐
  • 立足佛山本土民生服务 2026正规黄金回收门店打造同城透明变现新范式 - 企业家观察员
  • 2026 重庆市民卖黄金指南:7 家奢侈品回收机构实测,正规门店标准是什么 - 融媒生活
  • LLM Agent智能体:架构、应用与开发实践
  • Pyan与PyCallGraph对比:静态分析工具如何提升代码理解效率
  • TMP103EVM评估板:超低功耗数字温度传感器的快速原型设计与性能验证指南
  • C++流水线优化实战:从CPU视角提升代码性能
  • 汽车音频功放设计:从Class-AB到Class-D的小型化与热管理实战
  • AFE3010 GFCI控制器评估模块:从原理到实践的安全设计指南
  • X-Plane Connect完全指南:如何用代码实时控制飞行模拟器?
  • DP83849I以太网PHY寄存器配置详解与实战避坑指南
  • 2026 软装选材参考,想要高品质墙布,走进乌鲁木齐墙布实体店峰丽琪阳装饰 - GrowthUME