鸿蒙实战案例(个人期末项目)-----黑马康健(源自黑马步伐员)#3 ...

万万哇  金牌会员 | 2024-9-12 04:42:03 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 987|帖子 987|积分 2961

三,饮食记载

1,顶部搜刮栏

(1).实现结果图


(2).实现原理

起首,我们必要在视图目次下创建一个新的文件夹,定名为`record`,用于存放记载干系的组件。在这个文件夹中,我们将创建一个名为`RecordIndex.ets`的文件,该文件将作为记载首页的组件。
正如前文所述,Tabs组件目前仅包含一个体现文本内容的Text组件。在实际开发中,我们将这三个部门都封装成组件,以便进行调用。
接下来,我们将创建一个名为`SearchHeader`的组件,它将作为顶部的搜刮栏。这个搜刮栏不但仅是一个简朴的文本输入框,而是带有一个小图标的搜刮框。鸿蒙操作系统已经提供了一个专门的搜刮栏组件`Search`,我们可以通过将鼠标悬停在`Search`组件上来检察其详细的书写格式。
至于消息通知的数目,我们可以使用一个名为`Badge`的组件来实现小红点的结果。`Badge`是一个容器型组件,我们可以通过将必要添加小红点的组件直接复制(CV)进去。详细的数字必要我们通过参数传递来设置。我们还可以通过`position`属性来控制小红点的位置。此外,我们还可以通过`style`属性来自界说小红点的样式。
(3).SearchHeader.ets

  1. import { CommonConstants } from '../../common/constants/CommonConstants'
  2. @Component
  3. export  default struct SearchHeader {
  4.   build() {
  5.     Row({space:CommonConstants.SPACE_6}){
  6.       Search({placeholder: '搜索饮食或运动信息'})
  7.         .textFont({size:18})
  8.         .layoutWeight(1)
  9.       Badge({count: 1,position:BadgePosition.RightTop,style:{fontSize: 14}}){
  10.         Image($r('app.media.ic_public_email'))
  11.           .width(24)
  12.       }
  13.     }
  14.     .width(CommonConstants.THOUSANDTH_940)
  15.   }
  16. }
复制代码
2,统计卡片

(1).实现结果图


(2).实现原理

1. **日期选择组件**:
   - 我们将实现一个日期展示组件,它包含一个下拉框。用户点击下拉框时,将弹出一个日期选择器`DatePicker`。
   - 用户在日期选择器中选择不同的日期后,页面将展示所选日期以及与该日期干系的统计信息。
   - 选择日期后,我们可以使用ArkUI提供的组件功能,在日期选择弹窗中包含一个“生存”按钮。
   - 当用户点击生存按钮,我们使用`SetOrCreate`命令将用户选择的时间进行全局存储,确保用户的选择可以被应用和保留。
2. **统计信息展示**:
   - **热量统计**:我们将采取行式布局来展示热量摄入的统计信息,这包括饮食摄入、推荐摄入和活动消耗三个部门。推荐摄入部门将特别展示一个环形进度条,以直观体现用户的实际摄入与推荐值之间的差异。
   - **营养素统计**:同样使用行式布局,展示碳水化合物、蛋白质和脂肪的摄入情况,每部门旁边也将展示一个环形进度条,帮助用户相识各类营养素的摄入比例。
3. **穿梭切换卡片**:
   - 用户可以通过左右滑动在热量统计卡片和营养素统计卡片之间进行切换。这将通过`Swiper`滑块视图容器实现,它允许子组件在滑动时进行轮播体现。
   - `Swiper`滑块视图容器是我们在布局分析中提到的穿梭切换卡片部门的关键组件,它为用户界面提供了流畅的滑动体验和动态的视图切换本领。
在设计这些组件时,我们必要确保它们不但功能齐全,而且用户友爱,易于操作。此外,全局存储用户的选择对于保持应用状态的一致性至关重要,因此`SetOrCreate`命令的使用必要审慎以确保数据的正确性和完备性。
(3).DatePickDiaLog.ets,CalorieStats.ets和NutrientStats.ets

  1. import { CommonConstants } from '../../common/constants/CommonConstants'
  2. @CustomDialog
  3. export  default struct DatePickDialog {
  4.   controller: CustomDialogController
  5.   selectedDate: Date = new Date()
  6.   build() {
  7.     Column({space:CommonConstants.SPACE_12}){
  8.       //1.日期选择器
  9.       DatePicker({
  10.         start: new Date('2020-01-01'),
  11.         end: new Date(),
  12.         selected: this.selectedDate
  13.       })
  14.         .onChange((value: DatePickerResult) => {
  15.           this.selectedDate.setFullYear(value.year, value.month, value.day)
  16.         })
  17.       //2.按钮
  18.       Row({space:CommonConstants.SPACE_12}){
  19.         Button('取消')
  20.           .width(120)
  21.           .backgroundColor($r('app.color.light_gray'))
  22.           .onClick(() => this.controller.close())
  23.         Button('确定')
  24.           .width(120)
  25.           .backgroundColor($r('app.color.primary_color'))
  26.           .onClick(() => {
  27.             //1.保存日期到全局储存
  28.             AppStorage.SetOrCreate('selectDate',this.selectedDate.getTime())
  29.             //2.关闭窗口
  30.             this.controller.close()
  31.           })
  32.       }
  33.     }
  34.     .padding(CommonConstants.SPACE_12)
  35.   }
  36. }
复制代码
  1. import { WindowMode } from '@ohos.UiTest'
  2. import { CommonConstants } from '../../common/constants/CommonConstants'
  3. @Component
  4. export  default struct CalorieStats {
  5.   intake: number = 192
  6.   expend: number = 150
  7.   recommend: number = CommonConstants.RECOMMEND_CALORIE
  8.   remainCalorie(){
  9.     return this.recommend - this.intake + this.expend
  10.   }
  11.   build() {
  12.     Row({space:CommonConstants.SPACE_6}){
  13.       //1.饮食摄入
  14.       this.StatsBuilder('饮食摄入', this.intake)
  15.       //2.还可以吃
  16.       Stack(){
  17.         //2.1进度条
  18.         Progress({
  19.           value:this.intake,
  20.           total:this.recommend,
  21.           type:ProgressType.Ring
  22.         })
  23.           .width(120)
  24.           .style({strokeWidth:CommonConstants.DEFAULT_10})
  25.           .color($r('app.color.primary_color'))
  26.         //2.2统计数据
  27.         this.StatsBuilder('还可以吃',this.remainCalorie(),`推荐${this.recommend}`)
  28.       }
  29.       //3.运动消耗
  30.       this.StatsBuilder('饮食摄入', this.expend)
  31.     }
  32.     .width('100%')
  33.     .justifyContent(FlexAlign.SpaceEvenly)
  34.     .padding({top:30,bottom:35})
  35.   }
  36.   @Builder StatsBuilder(label:string,value:number,tips?:string){
  37.     Column({space:CommonConstants.SPACE_6}){
  38.       Text(label)
  39.         .fontColor($r('app.color.gray'))
  40.         .fontWeight(CommonConstants.FONT_WEIGHT_600)
  41.       Text(value.toFixed(0 ))
  42.         .fontSize(20)
  43.         .fontWeight(CommonConstants.FONT_WEIGHT_700)
  44.       if (tips){
  45.         Text(tips)
  46.           .fontSize(14)
  47.           .fontColor($r('app.color.light_gray'))
  48.       }
  49.     }
  50.   }
  51. }
复制代码
  1. import { CommonConstants } from '../../common/constants/CommonConstants'
  2. @Component
  3. export  default struct NutrientStats {
  4.   carbon :number=24
  5.   protein:number=10
  6.   fat:number=5
  7.   recommendCarbon :number=CommonConstants.RECOMMEND_CARBON
  8.   recommendProtein :number=CommonConstants.RECOMMEND_PROTEIN
  9.   recommendFat :number=CommonConstants.RECOMMEND_FAT
  10.   build() {
  11.     Row({space:6}){
  12.       this.StatsBuilder('碳水化合物',this.carbon,this.recommendCarbon,$r('app.color.carbon_color'))
  13.       this.StatsBuilder('蛋白质',this.protein,this.recommendProtein,$r('app.color.protein_color'))
  14.       this.StatsBuilder('脂肪',this.carbon,this.recommendFat,$r('app.color.fat_color'))
  15.     }
  16.     .width('100%')
  17.     .justifyContent(FlexAlign.SpaceEvenly)
  18.     .padding({top:30,bottom:35})
  19.   }
  20.   @Builder StatsBuilder(label: string, value: number, recommend:number,color:ResourceColor){
  21.     Column({space: CommonConstants.SPACE_6}){
  22.       Stack() { //层叠关系
  23.         // 进度条
  24.         Progress({
  25.           value: value,
  26.           total: recommend,
  27.           type: ProgressType.Ring
  28.         })
  29.           .width(95)
  30.           .style({ strokeWidth: CommonConstants.DEFAULT_6 })
  31.           .color(color)
  32.         Column({space:6}){
  33.           Text('摄入推荐')
  34.             .fontColor($r('app.color.gray'))
  35.             .fontSize(12)
  36.           Text(`${value.toFixed(0)}/${recommend.toFixed(0)}`)
  37.             .fontSize(18)
  38.             .fontWeight(CommonConstants.FONT_WEIGHT_600)
  39.         }
  40.       }
  41.       Text(`${label} (克)`)
  42.         .fontSize(12)
  43.         .fontColor($r('app.color.light_gray'))
  44.     }
  45.   }
  46. }
复制代码
3,记载列表

(1).实现结果图


(2).实现原理

实际上,这是一个由图片和文字构成的list列表,每个列表项都配有相应的图像和形貌文本,而且这些列表项被构造在不同的分组中。整个布局采取垂直的列式排列方式,使得内容展示清楚有序。
(3).RecordList.ets

  1. import router from '@ohos.router'
  2. @Extend(Text) function  grayText(){
  3.   .fontSize(14)
  4.   .fontColor($r('app.color.light_gray'))
  5. }
  6. @Component
  7. export default struct RecordList {
  8.   build() {
  9.     List({space:10}){
  10.       ForEach([1,2,3,4,5],(item) =>{
  11.         ListItem(){
  12.           Column(){
  13.             //1.分组的标题
  14.             Row({space:4}){
  15.               Image($r('app.media.ic_breakfast'))
  16.                 .width(24)
  17.               Text('早餐')
  18.                 .fontSize(18)
  19.                 .fontWeight(700)
  20.               Text('建议423-592千卡').grayText()
  21.               Blank()
  22.               Text('190')
  23.                 .fontSize(14)
  24.                 .fontColor($r('app.color.primary_color'))
  25.               Text('千卡').grayText()
  26.               Image($r('app.media.ic_public_add_norm_filled'))
  27.                 .width(20)
  28.                 .fillColor($r('app.color.primary_color'))
  29.             }
  30.             .width('100%')
  31.             //2.组内纪录列表
  32.             List(){
  33.               ForEach([1,2],(item)=>{
  34.                 ListItem(){
  35.                   Row({space:6}){
  36.                     Image($r('app.media.toast')).width(50)
  37.                     Column({space:4}) {
  38.                       Text('全麦吐司').fontWeight(500)
  39.                       Text('1片').grayText()
  40.                     }
  41.                     Blank()
  42.                     Text('91千卡')
  43.                       .grayText()
  44.                   }
  45.                   .width('100%')
  46.                   .padding(6)
  47.                 }.swipeAction({end:this.deleteButton.bind(this)})
  48.                 .onClick(()=>this.ToitemList())
  49.               })
  50.             }
  51.             .width('100%')
  52.           }
  53.           .backgroundColor(Color.White)
  54.           .width('100%')
  55.           .borderRadius(18)
  56.           .padding(12)
  57.         }
  58.         .width('100%')
  59.       })
  60.     }
  61.     .width('94%')
  62.     .margin({top:10})
  63.     .height('100%')
  64.   }
  65.   @Builder deleteButton() {
  66.     Image($r('app.media.ic_public_delete_filled'))
  67.       .width(20)
  68.       .fillColor(Color.Red)
  69.       .margin(5)
  70.   }
  71.   ToitemList(){
  72.     setTimeout(()=>{
  73.       router.replaceUrl({
  74.         url:'pages/ItemIndex'
  75.       })
  76.     },1000)
  77.   }
  78. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万万哇

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表