HarmonyOS NEXT应用开发实战—开箱即用的应用首页页面

一.HarmonyOS NEXT应用开发实战---开箱即用的应用首页页面

1.1 项目背景

HarmonyOS(鸿蒙操作系统)是华为公司推出的一种分布式操作系统。它被设计为一种全场景、全连接的操作系统,旨在实现在各种设备之间的无缝协同和共享,包括智能手机、平板电脑、智能穿戴、智能家居、车载系统等。HarmonyOS的目标是构建一个统一的、开放的、全场景的操作系统生态系统。

HarmonyOS NEXT是华为公司自研的操作系统,其特点可以归纳如下:

  1. 自研与创新:HarmonyOS NEXT是鸿蒙系统抛弃Linux内核及安卓开放源代码项目(AOSP)等代码的首个大版本。该系统从编程语言到编译器都是全栈自研,采用了诸如"盘古"AI大模型、"MindSpore"AI框架、"DevEco Studio"等集成开发环境,以及"HarmonyOS Design"设计系统、"ArkUI"等编程框架,实现了系统的全面自主研发。
  2. 减少对安卓的依赖:HarmonyOS NEXT不再兼容安卓应用,仅支持鸿蒙内核和鸿蒙系统的应用。这一变化标志着华为在解决因美国商务部将华为列入"实体清单"而带来的谷歌GMS无法继续为华为设备提供服务的问题的同时,也打破了外界对鸿蒙系统"安卓换壳"的质疑。
  3. 系统优化与性能提升:HarmonyOS NEXT通过减少40%的冗余代码,提升了系统的流畅度、能效和安全性。其内核采用了微内核架构,提供了高效的内存管理机制、支持多种文件系统以及丰富的设备驱动程序,从而保证了系统的高效、稳定和安全性。
  4. 生态建设与应用推广:华为鸿蒙原生应用版图已经成型,多个领域的企业和开发者陆续宣布加入鸿蒙生态。HarmonyOS NEXT的推出预示着将会有大量原生HarmonyOS应用的推出,满足迅速增长的用户需求。华为计划到2024年开发出5000个原生鸿蒙应用,并最终实现50万个原生应用的宏伟目标。
  5. 版本与发布:HarmonyOS NEXT的开发者预览版于2023年8月4日发布,星河版于2024年1月18日正式面向开发者开放申请。面向消费者的商用版本计划在今年四季度发布。同时,华为计划在下半年推出多款搭载HarmonyOS NEXT的全场景新品,包括直板旗舰、折叠旗舰、中端机、平板、手表等设备。

综上所述,HarmonyOS NEXT是华为在操作系统领域的一次重大创新,通过全面自主研发和优化,旨在为用户提供更加高效、稳定和安全的系统体验,同时推动鸿蒙生态的快速发展和广泛应用。

1.2 ArkTS详解

ArkTS是鸿蒙生态的应用开发语言。它在保持TypeScript(简称TS)基本语法风格的基础上,对TS的动态类型特性施加更严格的约束,引入静态类型。同时,提供了声明式UI、状态管理等相应的能力,让开发者可以以更简洁、更自然的方式开发高性能应用。 自然简洁语法 ArkTS提供了简洁自然的声明式语法、组件化机制、数据-UI自动关联等能力,实现了贴近自然语言,书写效率更高的编程方式,为开发者带来易学、易懂、极简开发的优质体验。 轻量化并发机制 ArkCompiler运行时在HarmonyOS上提供了Worker API支持并发编程。在运行时实例内存隔离的基础上,ArkCompiler通过共享运行实例中的不可变或者不易变的对象、内建代码块、方法字节码等技术手段,优化了并发运行实例的启动性能和内存开销。

二.HarmonyOS NEXT应用开发实战---开箱即用的应用首页页面

2.1 ArkTS页面源码

scss 复制代码
    Tabs({ barPosition: BarPosition.End, controller: this.mTabController }) {
      TabContent() {
        Column() {
          Swiper() {
            Image($r('app.media.1'))
              .width("353.75vp")
              .height("133.85vp")
            Image($r('app.media.2'))
              .width("353.75vp")
              .height("133.85vp")
          }
          // 搜索框
          Search({
            value: this.filterText, // 将搜索框的值与 filterText 关联
            placeholder: '输入搜索关键字...',
            // controller: this.controller
          })
            .onChange((value: string) => {
              this.filterText = value; // 设置搜索框的值到 filterText
            })
            .width('90%')
          // .margin(20);
            Scroll(this.scroller) {
             Column(){
               // 列出活动信息
               ForEach(this.activities, (activity, index) => {
                 // 根据 filterText 过滤活动
                 if (
                   this.filterText === '' || // 如果搜索框为空,显示所有活动
                   activity.title.includes(this.filterText) || // 活动标题包含搜索关键字
                   activity.type.includes(this.filterText) // 活动类型包含搜索关键字
                 ) {
                   // 如果满足搜索条件,显示活动
                   Row() {
                     Column() {
                       Row() {
                         Text(`${index + 1}.`)
                           .width("10%")
                           .fontSize("20fp");
                         Text(activity.title) // 活动标题
                           // .width("30%")
                           .fontSize("20fp")
​
                       }
​
                       Image('images/'+String(activity.type)+".png")
                         .margin({left:40,top:10})
                         .width("80%")
                         .height("300px")
                         .onClick(() => {
                           const secondaryButton = {
                             value: '我要报名',
                             fontColor: '#ffffff', // 可选,文字颜色
                             backgroundColor: '#007aff', // 可选,背景颜色
                             action: () => {
                               // @ts-ignore
                               this.activities[index].flag='1'
                               // @ts-ignore
                               console.log(this.activities[index].flag)
                               AlertDialog.show({
                                 title: "报名成功",
                                 message:"您已成功报名此活动"
                               });
                             } // 按钮被点击后执行的函数
                           };
                           const primaryButton = {
                             value: '取消',
                             fontColor: '#ffffff', // 可选,文字颜色
                             backgroundColor: 'red', // 可选,背景颜色
                             action: () => {
​
                             } // 按钮被点击后执行的函数
                           };
                           // 处理查看活动详情的逻辑
                           AlertDialog.show({
                             title: "活动详情",
                             message: `标题: ${activity.title}\n时间 ${activity.time}\n地点:${activity.where}\n详细信息: ${activity.description}\n\n`,
                             secondaryButton: secondaryButton,
                             primaryButton: primaryButton,
                           });
                         });
​
​
                     }
                   }
                   .width("95%")
                   .margin({ top: '10vp' })
                   .margin(10)
                 }
               });
             }
             .height("100%")
             .width('100%')
            }
            .scrollable(ScrollDirection.Vertical) // 滚动方向纵向
            .scrollBar(BarState.On) // 滚动条常驻显示
            .scrollBarColor(Color.Gray) // 滚动条颜色
            .scrollBarWidth(10) // 滚动条宽度
        }
        .height("100%")
        .width('100%')
​
      }
      .tabBar(this.TabBuilder(0));
​
      //页面3
      TabContent() {
        Column() {
          Column() {
            Stack() {
              Image($r('app.media.toxiang'))
                .width("131.1vp")
                .height("139.21vp")
                .offset({ x: "-0.33vp", y: "-20.98vp" })
​
            }
            .width("99.7%")
            // .height("105.66vp")
            .offset({ x: "0.46vp", y: "-292.54vp" })
            .margin(20)
            // .backgroundColor("#8adff5")
            Stack() {
​
              Stack() {
                Row(){
                  Image($r('app.media.exid'))
                    .width("40.68vp")
                    .height("40.79vp")
                  Text("  退出登录")
                    .width("262.68vp")
                    .height("43.79vp")
                    .fontSize("20fp")
                }
​
​
              }
              // .backgroundColor("#a0d9f6")
              .width("90%")
              .height("62.73vp")
              .offset({ x: "1.33vp", y: "-36.77vp" })
              .onClick(()=>{
                router.replaceUrl({
                  url: "pages/Index"
                  // this.paramsFromIndex?.['name']
                })
​
              })
              Stack() {
                Row(){
                  Image($r('app.media.huodong'))
                    .width("40.68vp")
                    .height("40.79vp")
                  Text("  新增活动")
                    .width("262.68vp")
                    .height("43.79vp")
                      // .offset({ x: "34.29vp", y: "-0.17vp" })
                    .fontSize("20fp")
                }
​
​
              }
              // .backgroundColor("#a0d9f6")
              .width("90%")
              .height("62.73vp")
              .offset({ x: "1.33vp", y: "-115.67vp" })
              .onClick(()=>{
                router.replaceUrl({
                  url: "pages/demo2",
                  params: {
                    activities:this.activities
                  }
                })
              })
​
​
              Stack() {
                Row(){
                  Image($r('app.media.canyu'))
                    .width("40.68vp")
                    .height("40.79vp")
                  Text("  已参与的活动")
                    .width("262.68vp")
                    .height("43.79vp")
                      // .offset({ x: "34.29vp", y: "-0.17vp" })
                    .fontSize("20fp")
                }
              }
              .width("90%")
              .height("62.73vp")
              // .backgroundColor("#a0d9f6")
              .offset({ x: "1.33vp", y: "-192.39vp" })
              .onClick(() => {
                router.replaceUrl({
                  url: "pages/canyu",
                  params: {
                    activities:this.activities
                  }
                })
              })
            }
            .width("99.4%")
            .height("465.88vp")
            .offset({ x: "0.92vp", y: "-286.87vp" })
          }
          .width("100%")
          .height("100%")
          .offset({ x: "0vp", y: "311.31vp" })
          .justifyContent(FlexAlign.Center)
        }
        .width("100%")
        .height("100%")
​
​
      }
      .tabBar(this.TabBuilder(1));
      //页面四
      TabContent() {
        Web({ src: 'https://www.huawei.com/cn/events', controller: this.webviewController})
      }.tabBar(this.TabBuilder(2));
​
​
    }
    .scrollable(true)
    .vertical(false)
    .barMode(BarMode.Fixed)
    .onChange((index) => {
      this.mCurrentPage = index;
    });

2.2 ArkTS代码解析

这段代码是使用HarmonyOS NEXT声明式UI框架的方式来创建一个具有多个选项卡的界面。以下是对代码的简要分析:

  1. Tabs组件:这是一个包含多个选项卡的组件,每个选项卡都有一个与之相关联的内容。选项卡的位置是在底部(barPosition: BarPosition.End)。

  2. TabContent组件:这是每个选项卡的内容组件。代码中有三个TabContent组件,分别对应不同的选项卡。

  3. 第一个选项卡内容:

    • 使用Swiper组件实现图片轮播,显示两张图片。
    • 紧接着是一个搜索框(Search),支持根据输入的关键字过滤活动。
    • 之后是一个可滚动的列表,列出活动信息,根据filterText进行过滤,并提供报名功能。活动信息包括标题、类型、时间、地点等。
  4. 第二个选项卡内容:

    • 包含一个头像图片和三个功能按钮:退出登录、新增活动、已参与的活动。点击按钮会触发不同的操作,如跳转到其他页面或显示活动详情。
  5. 第三个选项卡内容:

  6. 最后,Tabs组件设置了一些全局属性:

    • scrollable(true) 允许滚动。
    • vertical(false) 水平方向排列。
    • barMode(BarMode.Fixed) 固定选项卡栏。
    • onChange 事件处理器,当选项卡切换时更新this.mCurrentPage

总体来说,这段代码实现了一个包含多个选项卡的界面,每个选项卡有不同的功能和展示内容。界面包括图片轮播、搜索框、活动列表、头像和功能按钮、以及展示外部网页的选项卡。

2.3 心得

HarmonyOS NEXT作为华为自研的操作系统,具有一系列优势如下。

  1. 微内核架构:HarmonyOS NEXT采用了微内核架构,将操作系统核心功能封装在一个小型、模块化的内核中,使得系统更加高效、稳定,并减少了内存占用。
  2. 高效的内存管理:其内核提供了高效的内存管理机制,包括内存分配、回收和压缩等技术,有效地减少了内存占用并提高了系统性能。
  3. 支持多种文件系统和设备驱动:鸿蒙NEXT的内核支持多种文件系统,如FAT32、exFAT和NTFS等,并且提供了丰富的设备驱动程序,可以支持多种硬件设备,实现设备的接入和控制。
  4. 安全性:HarmonyOS NEXT提供了多层次的安全防护,包括硬件加密、数据安全和恶意软件防护等技术,确保了系统的安全性和稳定性。
  5. 分布式能力:实现了多设备之间的协同工作和资源共享,通过分布式软总线技术,不同设备可以像连接在一起进行数据传输和交互。
  6. 轻量化设计:系统采用了轻量化的设计理念,针对不同设备进行定制化开发,使系统运行更加流畅、高效。
  7. 原生流畅与安全:拥有自己的系统内核和文件系统,高效资源的调度和管理使应用能够充分利用设备的性能,提升运行速度和稳定性。同时,从系统到应用提供全方位的安全保障,有效保护用户的个人数据和隐私。
  8. 强大的AI功能:HarmonyOS NEXT拥有强大的人工智能框架,为应用提供更强大的智能功能。

在这段代码中,使用了一种声明式UI框架的方式,使界面的构建更加清晰和易于理解。以下是一些心得:

  1. 组件化和声明式UI: 通过定义各种组件,如TabsTabContentSwiperSearch等,使界面的结构清晰,易于理解和维护。采用声明式UI的方式,通过描述界面的状态和样式,而不是直接操作DOM,提高了代码的可读性。
  2. 事件处理和交互: 代码中通过.onChange.onClick等方法实现了事件处理,响应用户的交互操作。这种方式使得代码中交互逻辑的定义更为直观,与界面的结构分离,提高了代码的可维护性。
  3. 样式和布局: 通过链式调用的方式设置样式和布局参数,使得代码看起来更为简洁。同时,通过组件的嵌套和层次结构,实现了复杂的布局,包括图片轮播、活动列表、按钮等。
  4. 路由导航: 通过router.replaceUrl实现页面的跳转,使得不同的功能模块能够在用户交互时进行切换,增强了应用的导航和流程控制。
  5. 异步处理: 代码中未涉及明显的异步操作,但在实际应用中,可能需要处理异步请求、数据加载等情况。在这种框架下,可能需要使用一些异步处理的机制,确保界面的流畅性和数据的及时更新。

总体而言,这段代码展示了一种现代化的前端开发风格,注重组件化、声明式UI、事件驱动等特点,使得代码结构清晰,易于维护

本文正在参加华为鸿蒙有奖征文征文活动

相关推荐
互联网时光机1 小时前
HarmonyOS第一课 07 从网络获取数据-习题
华为·harmonyos
似水流年QC3 小时前
初探鸿蒙:从概念到实践
华为·harmonyos
HMS Core4 小时前
融合虚拟与现实,AR Engine为用户提供沉浸式交互体验
华为·ar·harmonyos
dawn13 小时前
鸿蒙ArkTS中的获取网络数据
华为·harmonyos
桃花键神13 小时前
鸿蒙5.0时代:原生鸿蒙应用市场引领开发者服务新篇章
华为·harmonyos
鸿蒙自习室13 小时前
鸿蒙多线程开发——并发模型对比(Actor与内存共享)
华为·harmonyos
JavaPub-rodert14 小时前
鸿蒙生态崛起:开发者的机遇与挑战
华为·harmonyos
帅比九日16 小时前
【HarmonyOS Next】封装一个网络请求模块
前端·harmonyos
yilylong18 小时前
鸿蒙(Harmony)实现滑块验证码
华为·harmonyos·鸿蒙
baby_hua18 小时前
HarmonyOS第一课——DevEco Studio的使用
华为·harmonyos