uniapp-x的HarmonyOS鸿蒙应用开发:tabbar底部导航栏的实现

假期期间,百无聊赖。空闲时间够多了吧?有时候感觉特别的百无聊赖。不睡懒觉,电影不看,手机不刷,游戏不玩,也无处可去。那么做什么呢? 于是翻出来之前做过的"爱影家"影视app项目,找个跨多端的技术栈实战学习一把。我先后尝试了kuikly、flutter 、arkui-x等框架,结果。。。,额,这几个没少踩坑做不动了。真想向天问一下,跨平台框架开发哪家强?最后尝试了下uni-app x,被惊艳到了。果然dcloud很给力啊。且uni-app-x的性能很给力。还停留在uniapp只擅长小程序吗?唯独被诟病的是:uniapp-x的uts语法很难受啊,写法跟ts差异很大,且大模型不认识uts语法。

可以体验打包后的hello uni-app x这个demo项目,地址是:https://hellouniappx.dcloud.net.cn/

可以看到组件很全面啊,我先后体验了android端,鸿蒙端和小程序端,界面UI效果一致,且鸿蒙端运行相当流畅。可以看到组件还是很丰富的。浏览器端的体检们可以直接访问:https://hellouniappx.dcloud.net.cn/web#/pages/component/view/view

UTS语法介绍:https://doc.dcloud.net.cn/uni-app-x/uts/

鸿蒙next手机端的体验:

使用鸿蒙next手机的应用商店,搜索"DCloud开发者中心系统"可以下载安装体验。据说渲染速度超过了原生写法,你说牛不牛吧?

HBuilderX 5.0先推出了鸿蒙版的蒸汽模式 介绍:https://doc.dcloud.net.cn/uni-app-x/app-harmony/harmony-vapor.html

这个无名的渲染系统,实现了跨平台App框架的历史突破,即:基于原生渲染管线,但超越了原生的渲染速度

• vue蒸气模式(Vapor),免除vnode的创建耗时,渲染速度更快。

• 新版App渲染系统,依然是基于原生渲染管线,但渲染速度超过原生写法。

项目概述

本文基于爱影家(imovie)项目,介绍如何使用uni-app x技术栈在鸿蒙平台上实现tabBar底部导航栏。uni-app x是DCloud推出的新一代跨平台开发框架,支持将代码编译为多个平台的原生代码,包括:

  • Android平台:编译为Kotlin
  • iOS平台:编译为Swift
  • 鸿蒙Next平台:编译为ArkTS
  • Web和小程序平台:编译为JS

在Android平台,uni-app x的工程被整体编译为Kotlin代码,本质上是换了Vue写法的原生Kotlin应用,在性能上与原生Kotlin一致。

实现步骤

环境准备:

下载安装hbuilderx的当前最新版本4.87,下载链接:https://www.dcloud.io/hbuilderx.html

下载安装devStudio当前最新版本6.0.2,下载链接:https://developer.huawei.com/consumer/cn/develop/

1. 目录结构准备

打开hbuilderx的IDE,新建项目,选择第一个默认模板即可。注意一定要勾选下面的uniapp-x,这样生成的才是uniapp-x的项目工程。

以下是几个关键目录和文件:

  • pages/:存放应用页面
  • static/:存放静态资源,包括tabBar图标
  • pages.json:配置应用页面和tabBar
  • theme.json:配置主题变量

在本项目中,我们创建了以下目录结构:

bash 复制代码
pages/
  └── tabBar/
      ├── home.uvue       # 首页
      ├── zhihu.uvue      # 日报页
      └── mine.uvue       # 我的页面
static/
  ├── ic_tab_home.png           # 首页默认图标
  ├── ic_tab_active_home.png    # 首页选中图标
  ├── ic_tab_ribao.png          # 日报默认图标
  ├── ic_tab_ribao_active.png   # 日报选中图标
  ├── ic_tab_me.png             # 我的默认图标
  └── ic_tab_active_me.png      # 我的选中图标

2. 配置pages.json

pages.json文件中,我们需要配置应用页面和tabBar。uni-app x支持条件编译,可以为不同平台配置不同的tabBar参数。

页面配置

首先,在pages数组中定义应用的页面:

json 复制代码
{
  "pages": [
    {
      "path": "pages/tabBar/home",
      "style": {
        "navigationBarTitleText": "首页",
        "backgroundColorContent": "@tabBarPagebackgroundColorContent"
      }
    },
    // #ifdef APP-ANDROID || APP-IOS || WEB || MP-WEIXIN || APP-HARMONY
    {
      "path": "pages/tabBar/zhihu",
      "style": {
        "navigationBarTitleText": "日报",
        "backgroundColorContent": "@tabBarPagebackgroundColorContent"
      }
    },
    // #endif
    // #ifdef APP-ANDROID || APP-IOS || WEB || MP-WEIXIN || APP-HARMONY
    {
      "path": "pages/tabBar/mine",
      "style": {
        "navigationBarTitleText": "我的",
        "backgroundColorContent": "@tabBarPagebackgroundColorContent"
      }
    }
    // #endif
  ]
}
tabBar配置

然后,在tabBar对象中配置底部导航栏。由于鸿蒙平台的特殊性,我们使用条件编译为鸿蒙平台单独配置:

json 复制代码
// #ifndef APP-HARMONY
"tabBar": {
  "color": "@tabBarColor",
  "selectedColor": "@tabBarSelectedColor",
  "borderStyle": "@tabBarBorderStyle",
  "backgroundColor": "@tabBarBackgroundColor",
  "list": [
    {
      "pagePath": "pages/tabBar/home",
      "iconPath": "@tabBarHomeIconPath",
      "selectedIconPath": "@tabBarHomeSelectedIconPath",
      "text": "首页"
    },
    {
      "pagePath": "pages/tabBar/zhihu",
      "iconPath": "@tabBarZhiHuIconPath",
      "selectedIconPath": "@tabBarZhiHuSelectedIconPath",
      "text": "日报"
    },
    {
      "pagePath": "pages/tabBar/mine",
      "iconPath": "@tabBarMineIconPath",
      "selectedIconPath": "@tabBarMineSelectedIconPath",
      "text": "我的"
    }
  ]
},
// #endif
// #ifdef APP-HARMONY
"tabBar": {
  "color": "@tabBarColor",
  "selectedColor": "@tabBarSelectedColor",
  "borderStyle": "@tabBarBorderStyle",
  "backgroundColor": "@tabBarBackgroundColor",
  "list": [
    {
      "pagePath": "pages/tabBar/home",
      "iconPath": "static/ic_tab_home.png",
      "selectedIconPath": "static/ic_tab_active_home.png",
      "text": "首页"
    },
    {
      "pagePath": "pages/tabBar/zhihu",
      "iconPath": "static/ic_tab_ribao.png",
      "selectedIconPath": "static/ic_tab_ribao_active.png",
      "text": "日报"
    },
    {
      "pagePath": "pages/tabBar/mine",
      "iconPath": "static/ic_tab_me.png",
      "selectedIconPath": "static/ic_tab_active_me.png",
      "text": "我的"
    }
  ]
},
// #endif

3. 配置theme.json

theme.json文件中,我们定义了tabBar相关的主题变量,包括颜色、图标路径等:

json 复制代码
{
  "light": {
    "navigationBarTextStyle": "white",
    "navigationBarBackgroundColor": "#007AFF",
    "backgroundColorContent": "#efeff4",
    "tabBarPagebackgroundColorContent": "#efeff4",
    "backgroundColor": "#efeff4",
    "backgroundTextStyle": "dark",

    "tabBarColor": "#7A7E83",
    "tabBarSelectedColor": "#007AFF",
    "tabBarBorderStyle": "black",
    "tabBarBackgroundColor": "#F8F8F8",

    "tabBarHomeIconPath": "static/ic_tab_home.png",
    "tabBarHomeSelectedIconPath": "static/ic_tab_active_home.png",
    "tabBarZhiHuIconPath": "static/ic_tab_ribao.png",
    "tabBarZhiHuSelectedIconPath": "static/ic_tab_ribao_active.png",
    "tabBarMineIconPath": "static/ic_tab_me.png",
    "tabBarMineSelectedIconPath": "static/ic_tab_active_me.png"
  },
  "dark": {
    "navigationBarTextStyle": "white",
    "navigationBarBackgroundColor": "#1F1F1F",
    "backgroundColor": "#1F1F1F",
    "backgroundColorContent": "#646464",
    "tabBarPagebackgroundColorContent": "#1F1F1F",
    "backgroundTextStyle": "light",

    "tabBarColor": "#cacaca",
    "tabBarSelectedColor": "#007AFF",
    "tabBarBorderStyle": "white",
    "tabBarBackgroundColor": "#1F1F1F",

    "tabBarHomeIconPath": "static/ic_tab_home.png",
    "tabBarHomeSelectedIconPath": "static/ic_tab_active_home.png",
    "tabBarZhiHuIconPath": "static/ic_tab_ribao.png",
    "tabBarZhiHuSelectedIconPath": "static/ic_tab_ribao_active.png",
    "tabBarMineIconPath": "static/ic_tab_me.png",
    "tabBarMineSelectedIconPath": "static/ic_tab_active_me.png"
  }
}

这样,我们就可以在pages.json中使用@tabBarColor等变量来引用这些配置。

4. 创建页面文件

pages/tabBar/目录下创建三个页面文件:

  • home.uvue:首页
  • zhihu.uvue:日报页
  • mine.uvue:我的页面

这些页面文件使用.uvue后缀,这是uni-app x的特有文件格式,支持Vue语法和原生能力。

技术要点

1. 条件编译

uni-app x支持条件编译,可以为不同平台编写不同的代码。在本项目中,我们使用条件编译为鸿蒙平台配置了专门的tabBar:

json 复制代码
// #ifdef APP-HARMONY
"tabBar": {
  // 鸿蒙平台特有的配置
},
// #endif

2. 主题变量

通过在theme.json中定义主题变量,我们可以实现统一的主题管理,并且支持浅色和深色模式:

  • tabBarColor:tabBar文字默认颜色
  • tabBarSelectedColor:tabBar文字选中颜色
  • tabBarBackgroundColor:tabBar背景颜色
  • tabBarBorderStyle:tabBar边框样式

3. 图标资源

tabBar图标资源放在static文件夹下,包括默认状态和选中状态的图标:

  • 默认图标:ic_tab_home.pngic_tab_ribao.pngic_tab_me.png
  • 选中图标:ic_tab_active_home.pngic_tab_ribao_active.pngic_tab_active_me.png

平台差异处理

鸿蒙平台

在鸿蒙平台上,uni-app x将代码编译为ArkTS,实现原生性能。我们为鸿蒙平台单独配置了tabBar,使用了直接的图标路径引用。

其他平台

在其他平台(Android、iOS、Web、小程序)上,我们使用了主题变量来引用图标路径,这样可以更方便地管理主题。

优势分析

使用uni-app x实现tabBar底部导航栏相比原生ArkUI开发有以下优势:

  1. 跨平台:一套代码可以在多个平台运行,包括鸿蒙、Android、iOS、Web和小程序
  2. 开发效率高:使用Vue语法,开发速度快,学习成本低
  3. 原生性能:编译为各平台的原生代码,性能与原生应用一致
  4. 配置简单:通过pages.json配置即可实现tabBar,无需编写复杂的原生代码
  5. 主题管理:支持通过theme.json统一管理主题,方便实现浅色/深色模式

体验与测试

不得不说,如今的uni-app x打包编译鸿蒙应用太方便了,竟不用再打开鸿蒙原生开发IDE工具devstudio来配置签名了,全部在HbuilerX的IDE中完成。且可以自动申请调试证书和自动签名,省去了其他繁琐的操作,很快可以运行在模拟器或者真机上。

本案例项目地址:https://gitcode.com/qq8864/uniappx_imovie

真机上运行效果截图:

总结

通过本文的介绍,我们了解了如何使用uni-app x在鸿蒙平台上实现tabBar底部导航栏。uni-app x提供了简洁的配置方式,通过pages.json和theme.json即可完成tabBar的配置,相比原生ArkUI开发更加简单高效。同时,uni-app x支持跨平台开发,一套代码可以在多个平台运行,大大提高了开发效率。

相关推荐
迪巴拉15252 小时前
基于Yolov8训练的Flask后端和Uniapp野生菌识别系统
yolo·flask·uni-app
特立独行的猫a2 小时前
基于HarmonyOS ArkTS的MVVM架构最佳实践
华为·架构·harmonyos·mvvm·最佳实战
●VON2 小时前
HarmonyOS应用开发实战(基础篇)Day10 -《鸿蒙网络请求实战》
网络·学习·华为·harmonyos·鸿蒙·von
●VON2 小时前
HarmonyOS应用开发实战(基础篇)Day11 -《组件复用》
学习·安全·华为·harmonyos·von
果粒蹬i2 小时前
鸿蒙跨平台实战:React Native在OpenHarmony上的AccessibilityInfo屏幕阅读器适配详解
react native·华为·harmonyos
阿林来了12 小时前
Flutter三方库适配OpenHarmony【flutter_speech】— 与其他 HarmonyOS Kit 的联动
flutter·华为·harmonyos
加农炮手Jinx18 小时前
Flutter for OpenHarmony:web_socket_channel 全平台 WebSocket 通信标准库,从原理到鸿蒙实战(3000字深度解析)
android·前端·网络·websocket·flutter·华为·harmonyos
王码码203518 小时前
Flutter for OpenHarmony:stomp_dart_client 打造实时消息引擎(企业级 WebSocket 通信标准) 深度解析与鸿蒙适配指南
网络·websocket·网络协议·flutter·ui·华为·harmonyos
王码码203518 小时前
Flutter for OpenHarmony:web_socket 纯 Dart 标准 WebSocket 客户端(跨平台兼容性之王) 深度解析与鸿蒙
android·前端·websocket·网络协议·flutter·华为·harmonyos