首页 > 编程语言 >鸿蒙开发入门实战案例-菜谱列表(附源码)

鸿蒙开发入门实战案例-菜谱列表(附源码)

时间:2024-03-13 22:01:10浏览次数:29  
标签:10 鸿蒙 菜谱 Text item 源码 白菜 组件

昨天分享了鸿蒙的一些基础组件和布局方式,今天直奔主题,做一个菜谱列表,先看效果:

图片

这是实际开发中非常常见的列表样式,对初学者来说可能看起来有一些复杂,没关系,我们先从最简单的列表开始,一步一步实现它。

昨天说过List列表组件的基本使用方式:

List(){
      ListItem(){
        Text("1")
      }
      ListItem(){
        Text("2")
      }
      ListItem(){
        Text("3")
      }
    }

那么,如果有一个数组:

private arr:number[] = [1,2,3,4,5,6,7,8,9,10]

我们该如何用List组件去展示它?

使用一个For循环即可解决。代码如下:

List({space:10}){
      //item为数组中的元素
      ForEach(this.arr,(item)=>{
        ListItem(){
          Text(`${item}`)
        }
      })
    }

对Text组件做一些样式调整:

List({space:10}){
      //item为数组中的元素
      ForEach(this.arr,(item)=>{
        ListItem(){
          Text(`${item}`)
            .width('100%')
            .height(100)
            .fontSize(16)
            .textAlign(TextAlign.Center)
        }
      })
    }

一个最简单的列表就做好了:

图片

开始增加难度,如果数组arr变了,它不再是一个简单的纯数字数组,而是一个菜谱列表,阁下该如何应对?

private arr = [{
    "name": "醋溜白菜",
    "peoplenum": "1-2人",
    "preparetime": "10-20分钟",
    "cookingtime": "10-20分钟",
    "content": "醋溜白菜,是北方人经常吃的一道菜,尤其是在多年前的冬天。那时,没有大棚菜,冬天,家家每天佐餐的基本上都是冬储大白菜,聪明的家庭主妇总是想方设法将这单调的菜变成多种菜式,于是,醋溜白菜被频繁地端上餐桌。<br />美食不分贵贱,用最平凡的原料、最简单的调料和最普通的手法做出美味的菜肴来才是美食的真谛。<br />这次,我做的醋溜白菜,近似鲁菜的做法,使个这道菜酸甜浓郁、开胃下饭、老少咸宜。",
    "pic": "http://api.jisuapi.com/recipe/upload/20160719/115138_46688.jpg",
  }, {
    "name": "醋熘白菜",
    "peoplenum": "1-2人",
    "preparetime": "10分钟内",
    "cookingtime": "10分钟内",
    "content": "大白菜是过去物资匮乏年代冬天里的当家菜,虽然现在冬天蔬菜品种一点也不少了,但是人们一到冬天就不自觉的习惯性的要储存几棵,至少下雪刮大风出不去门的话家里有菜也不着急没得吃。我家离早市非常近,所以我不储存,但是我家冬天也不少吃白菜,无论炒着吃做包子饺子馅儿都很爱吃,尤其我家老公更是说每天吃炖白菜也不会腻烦,嘿嘿。一般我把白菜分三部分吃,最外面的几片留起来做馅儿吃,然后里面的部分叶子做汤,菜帮就做醋熘白菜或者炒白菜丝,一点不浪费吧,哈哈。",
    "pic": "http://api.jisuapi.com/recipe/upload/20160719/115155_93501.jpg",

  }, {
    "name": "开水白菜",
    "peoplenum": "1-2人",
    "preparetime": "10分钟内",
    "cookingtime": "10-20分钟",
    "content": "开水白菜是四川传统名菜,原系川菜名厨黄敬临在清宫御膳房时创制。后来黄敬临将此菜制法带回四川,广为流传。30多年前,川菜大师罗国荣调来北京饭店掌厨,又将“开水白菜”的烹调技术带回北京,从而成为北京饭店高档筵席上的一味佳肴。<br />千万别以为“开水”就是“白开水”, 开水白菜名说开水,实则是巧用清汤,其关键在于吊汤,汤要味浓而清,清如开水一般,成菜乍看如清水泡着几棵白菜心,一星油花也不见,但吃在嘴里,清鲜淡雅,香味浓醇,汤味浓厚,不油不腻,却清香爽口。<br />因为汤清澈见底,视之如开水,故名之“开水白菜”。",
    "pic": "http://api.jisuapi.com/recipe/upload/20160719/115218_38602.jpg",

  }]

这时候再用刚才的for循环去展示的时候,item不再是一个数字,而是一个对象了。我们就不能直接把一整个item展示到列表上,而只能展示其中的某一个字段,比如菜谱名字,小改一下,获取item中的name:


List({space:10}){
      ForEach(this.arr,(item)=>{
        ListItem(){
          Text(`${item['name']}`)
            .width('100%')
            .height(100)
            .fontSize(16)
            .textAlign(TextAlign.Center)
        }
      })
    }

列表就变成了这样:

图片

有了菜谱的名字,再把其他的按钮图片等组件加上去是不是就可以了?

也没那么简单,我们要怎么来布局呢。前面咱们就说过所有的布局方式无非是水平、垂直和叠加,万变不离其宗

我们把菜谱列表中的单个元素拿出来分析一下:

图片

看红色框,我们可以把所有组件分成两个部分,所以它整体上是一个水平布局,因此最外部的容器可以暂时这样写,为什么是暂时呢,咱们待会儿再说:

Row(){
    //左侧图片
    Image("图片")
    //右侧组件,先不写

}

再来分析右侧的组件,看蓝色框,同样可以分为两个部分,它是一个垂直布局,所以右侧是一个Column:

Row(){
     //图片
     Image(“图片”)
     //右侧组件
     Column(){
              
     }
}

在蓝色框内分别有两个元素,再逐级分析下去,上方的蓝色框内是一个垂直布局,下方的蓝色框内是一个水平布局,我们的大致框架就出来了:

Row(){
      //左侧图片
      Image(`图片`)
      //右侧组件
      Column(){
         Column(){
            Text("名字")
            Text("描述")
          }
          Row(){
             Text("烹饪时间")
             Button("按钮")
          }
      }
}

这样再把数组中的数据展示上去,去组件进行一些样式调整,我们的菜谱列表基本上就出来了。

刚才为什么说是暂时的呢。因为所有的排列方式小编都建议大家使用Flex,所以我们把上面的Column和Row都换成Flex的方式,再对组件增加一些样式,上面的代码就变成了这样:

Flex({direction:FlexDirection.Row}){
            //图片
            Image(`${item["pic"]}`)
            .width(100)
            .height(100)
            //右侧组件
            Flex({direction:FlexDirection.Column}){
              Flex({direction:FlexDirection.Column}){
                Text(`${item['name']}`)
                Text(`${item['content']}`)
                  //最多展示2行
                  .maxLines(2)
                  //多余部分以省略号展示
                  .textOverflow({ overflow: TextOverflow.Ellipsis })
              }
              Flex({direction:FlexDirection.Row}){
                Text(`${item['cookingtime']}`)
                Button("按钮")
                  .height(16)
              }
            }
            //间距
            .margin({left:10})
          }

运行看一下:

图片

已经很像了啊,还有一点问题,时间和按钮的位置不太对啊,它俩应该和图片的底部对齐,又要各自分布在描述内容的两端,怎么做呢。

这里要讲一下FlexAlign的几种对齐方式,这个描述起来比较抽象,直接上图大家感受一下:

FlexAlign.Start

图片

FlexAlign.End

图片

FlexAlign.Center

图片

FlexAlign.SpaceBetween

图片

FlexAlign.SpaceAround

图片

FlexAlign.SpaceEvenly

图片

能看出来FlexAlign.SpaceBetween是首尾顶格的对齐方式,符合我们的需求,最终的代码如下:

List({space:10}){
      ForEach(this.cooks,(item)=>{
        ListItem(){
          Flex({ direction: FlexDirection.Row }) {
            Image(`${item["pic"]}`)
              .width(100)
              .height(100)
              .objectFit(ImageFit.Fill)
              .borderRadius(5.0) //圆角需要float类型

            Flex({ direction: FlexDirection.Column,justifyContent:FlexAlign.SpaceBetween }){
              Flex({ direction: FlexDirection.Column }){
                Text(`${item['name']}`)
                  .fontSize(18)
                  .fontColor(Color.Black)
                  .textAlign(TextAlign.Start)
                Text(`${item['content']}}`)
                  .fontColor(Color.Gray)
                  .fontSize(15)
                  .maxLines(2)
                  .textOverflow({ overflow: TextOverflow.Ellipsis })
              }

              Flex({direction:FlexDirection.Row,justifyContent:FlexAlign.SpaceBetween}){
                Text(`${item['cookingtime']}`)
                  .fontSize(13)
                  .fontColor(Color.Gray)
                  .textAlign(TextAlign.Start)

                Button("查看")
                  .height(16)
                  .width(50)
              }
            }
            .margin({left:10})
            .height(100)
          }
          .padding({left:10,right:10})
        }
      })
    }

这样一个菜谱列表就完成了,但是对一个完整的app项目来说,还有很多的工作要做。

获取以上文章内容源码,请移步文末获取

最后,有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(Harmony NEXT)资料用来跟着学习是非常有必要的。 

这份鸿蒙(Harmony NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)技术知识点。

希望这一份鸿蒙学习资料能够给大家带来帮助,有需要的小伙伴自行领取,限时开源,先到先得~无套路领取!!

如果你是一名有经验的资深Android移动开发、Java开发、前端开发、对鸿蒙感兴趣以及转行人员,可以直接领取这份资料

 获取这份完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

腾讯T10级高工技术,安卓全套VIP内容 →Android全套学习资料

鸿蒙(Harmony NEXT)最新学习路线

  •  HarmonOS基础技能

  • HarmonOS就业必备技能 
  •  HarmonOS多媒体技术

  • 鸿蒙NaPi组件进阶

  • HarmonOS高级技能

  • 初识HarmonOS内核 
  • 实战就业级设备开发

 有了路线图,怎么能没有学习资料呢,小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙(OpenHarmony )学习手册(共计1236页)鸿蒙(OpenHarmony )开发入门教学视频,内容包含:ArkTS、ArkUI、Web开发、应用模型、资源分类…等知识点。

获取以上完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

《鸿蒙 (OpenHarmony)开发入门教学视频》

《鸿蒙生态应用开发V2.0白皮书》

图片

《鸿蒙 (OpenHarmony)开发基础到实战手册》

OpenHarmony北向、南向开发环境搭建

图片

 《鸿蒙开发基础》

  • ArkTS语言
  • 安装DevEco Studio
  • 运用你的第一个ArkTS应用
  • ArkUI声明式UI开发
  • .……

图片

 《鸿蒙开发进阶》

  • Stage模型入门
  • 网络管理
  • 数据管理
  • 电话服务
  • 分布式应用开发
  • 通知与窗口管理
  • 多媒体技术
  • 安全技能
  • 任务管理
  • WebGL
  • 国际化开发
  • 应用测试
  • DFX面向未来设计
  • 鸿蒙系统移植和裁剪定制
  • ……

图片

《鸿蒙进阶实战》

  • ArkTS实践
  • UIAbility应用
  • 网络案例
  • ……

图片

 获取以上完整鸿蒙HarmonyOS学习资料,请点击→纯血版全套鸿蒙HarmonyOS学习资料

总结

总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,他们才能在这个变革的时代中立于不败之地。 

标签:10,鸿蒙,菜谱,Text,item,源码,白菜,组件
From: https://blog.csdn.net/shudaoshanQAQ/article/details/136692419

相关文章

  • 鸿蒙应用开发-基础动画实战
    在移动互联网时代,App的使用体验非常重要,比如布局的变化、页面的切换、弹窗的显示和隐藏都要是平顺的,丝滑的,这就需要用到动画。鸿蒙提供了很多种动画的方式,今天为大家一一分享。布局更新动画尺寸、位置等的变化都属于布局更新,鸿蒙提供了属性动画和显示动画两种方式。下面通过......
  • 【计算机毕业设计源码】基于OpenCV的人脸检测系统
    项目概况基于OpenCV的人脸检测系统可对人脸进行框线检测,利用OpenCV的检测算法对单个或多个人脸实现框线定位。运行环境基于OpenCV的人脸检测系统运行环境如下:Python:≥3.5OpenCV:≥4.0IDE工具:VisualStudioCode技术栈:Python+OpenCV+PyQt5主要功能基于Ope......
  • 【MATLAB源码-第140期】基于matlab的深度学习的两用户NOMA-OFDM系统信道估计仿真,对比L
    操作环境:MATLAB2022a1、算法描述深度学习技术在无线通信领域的应用越来越广泛,特别是在非正交多址接入(NOMA)和正交频分复用(OFDM)系统中,深度学习技术被用来提高信道估计的性能和效率。信道估计是无线通信系统中的关键技术之一,它直接影响着系统的通信质量和可靠性。本文将详细介......
  • 【MATLAB源码-第146期】基于matlab的信源编码仿真GUI,对比霍夫曼编码,算术编码和LZ编码
    操作环境:MATLAB2022a1、算法描述霍夫曼编码、算术编码和LZ编码是三种广泛应用于数据压缩领域的编码技术。它们各自拥有独特的设计哲学、实现方式和适用场景,因此在压缩效率、编解码速度和内存使用等方面表现出不同的特点。接下来详细描述这三种编码技术,并对它们进行比较。......
  • JUC源码讲解:逐步解析 join()
    JUC源码讲解:逐步解析join()问题抛出join()在源码中其实是使用了wait()方法的,因此,wait()的特性join()都能继承过来,我们知道wait()有什么特性呢?wait()的特性:会释放锁对中断异常敏感会释放CPU时间片我也对wait()做了讲解,想了解可移步https://www.cnblogs.......
  • 基于的校园商铺平台(源码+开题)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容基于校园商铺平台的研究背景、意义、目的及研究内容一、研究背景随着信息技术的飞速发展,互联网已经渗透到人们生活的方方面面,特别是在高校校园内,学生对于便......
  • 基于的校园商城(源码+开题)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的快速发展和互联网的普及,电子商务逐渐渗透到人们生活的方方面面。特别是在高校校园内,学生对于线上购物、便捷支付的需求日益增长。传统......
  • JUC源码讲解:wait()
    JUC源码讲解:wait()抛出问题在线程调用wait()时,是否会释放锁?线程的状态是什么样的?会对异常敏感吗?此时CPU资源是否会被释放呢?我们在源码中找找答案吧!分析源码进入wait()函数,可以看到这样一段代码:publicfinalvoidwait()throwsInterruptedException{wait(0);}......
  • JUC 源码讲解:sleep()
    JUC源码讲解:sleep()抛出问题sleep()能使线程进入TIMED_WAITING状态,那么,在使用sleep()会不会释放锁?被中断了会不会抛出异常?在线程使用sleep()时,CPU会不会被释放?我们在源码中和实战中看看答案吧!查看源码进入sleep()源码,可以看到它是一个native方法,但是注释很详细,让我们......
  • java毕设安卓基于Android的校园二手交易平台(开题+源码)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着移动互联网技术的飞速发展,智能手机已成为大学生生活中不可或缺的一部分。特别是在数字化校园建设的推动下,各类移动应用纷纷涌现,极大地便利了师生......