首页 > 其他分享 >在鸿蒙NEXT中实现完全自定义导航栏

在鸿蒙NEXT中实现完全自定义导航栏

时间:2024-12-23 09:42:12浏览次数:3  
标签:20 自定义 鸿蒙 标题 width NEXT 导航 Row

在日常app开发中,导航栏扮演着重要的角色。鸿蒙提供了系统导航栏Navigation,它支持很多属性的修改,但是应用需求更加灵活多变,比如有的导航栏有背景图片,有的导航栏要求渐变色,有的导航栏需要随时隐藏和显示等等。

遇到这些需求系统的Navigation就无法实现,这时候我们就需要自定义导航栏。今天分享一下幽蓝君自己封装的导航栏,并介绍一下它的实现过程。

图片

作为一个导航栏,首先需要标题和返回按钮:

Row() {
  Row(){  
      Image($r('app.media.back'))      
        .width(20)      
        .height(20)      
        .objectFit(ImageFit.Contain)  
      Text(this.title)      
         .fontColor(Color.Black)      
         .fontSize(23)      
         .fontWeight(FontWeight.Bold)      
         .margin({left:5})      
         .maxLines(1)    
   }
}
.alignItems(VerticalAlign.Center)
.backgroundImageSize(ImageSize.Cover)
.width('100%').constraintSize({maxWidth:'100%'})
.linearGradient({  angle: 90,  colors: [[0x00BAAD, 0.0], [0xDCF5F3, 0.6], [0xFFCCA6, 1.0]]})
.padding({left:15,right:15,top:px2vp(this.topRectHeight)})
.width('100%')
.height(70)

上面的代码首先定义导航栏的高度是70,然后留出了顶部的状态栏区域,并设置了背景渐变色。这时候返回按钮和标题都分布在左侧。

除了返回按钮和标题,有时候我们在导航栏右侧也需要添加一些组件:

@BuilderParam menuBuilderParam?: () => void; 


//右侧内容 
Row(){  
  this.menuBuilderParam()
}.constraintSize({  maxWidth:'50%'})

导航栏的标题有时候我们需要它居中,那就在中间再添加一个标题组件,并使用一个状态判断标题是在左侧还是在中间:

//枚举标题位置
export enum YLTitleMode {  Center,  Left} 


Row(){  
    Image($r('app.media.back'))      
      .width(20)      
      .height(20)      
      .objectFit(ImageFit.Contain)  


  if(this.titleModel == YLTitleMode.Left){    
    Text(this.title)     
      .fontColor(Color.Black)      
      .fontSize(23)      
      .fontWeight(FontWeight.Bold)      
      .margin({left:5})      
      .maxLines(1)  
    }
  }
  if(this.titleModel == YLTitleMode.Center){
    Text(this.title)  
      .maxLines(1)  
      .fontSize(23)  
      .fontColor(Color.Black)  
      .fontWeight(FontWeight.Bold)  
      .textOverflow({ overflow: TextOverflow.Ellipsis })  
      .textAlign(TextAlign.Center)
    }

现在有一个问题,导航栏在左、右都有内容的情况下,怎么保持标题的居中?首先想到的是使用SpaceBetween对齐方式,但是这种对齐方式是相对于两侧内容的对齐,只有左右内容长度一致的情况下标题才能居中。

所以我想计算两侧组件的长度,并使他们保持一致:

//右边布局 
Row(){  
  this.menuBuilderParam()
}
.justifyContent(FlexAlign.End)
.constraintSize({maxWidth:'40%'})
.width(parseInt(this.sizeValue)>parseInt(this.sizeValue2)?this.sizeValue:this.sizeValue2)
.onSizeChange((oldValue: SizeOptions, newValue: SizeOptions)=>{  
  this.sizeValue = JSON.stringify(newValue.width)
 })

这样的话当左侧也有自定义的内容时,计算两侧内容的长度,使用较大的值作为他俩的长度,标题就可以绝对居中了。

可能这么介绍会让很多友友摸不着头脑,我就分享代码大家直接拿过去用就行,发一个使用示例:

YLNavigation({title:'自定义导航栏',menuBuilderParam:this.menu,customBuilder:this.mainPage,hideBackButton:true,titleModel:YLTitleMode.Left})

标签:20,自定义,鸿蒙,标题,width,NEXT,导航,Row
From: https://www.cnblogs.com/youlanjihua/p/18623205

相关文章

  • 鸿蒙Next ArkTS语法适配背景概述
    一、引言ArkTS在保持TypeScript(TS)基本语法风格的基础上,通过规范强化静态检查和分析,在程序开发期检测更多错误,提升程序稳定性与运行性能。本文将阐述为何建议将TS代码适配为ArkTS代码。二、程序稳定性(一)动态类型语言的问题以JavaScript(JS)为代表的动态类型语言,虽能让开发者快速......
  • 鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Ne
    鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析万物智联,打造无缝智能生态在科技不断迭代更新的今天,每一次技术的飞跃都是对未来的深刻探索。华为,这个始终站在科技前沿的企业,再次以HarmonyOS5.0(Next)这一操作系统的新篇章,向我们展示了科技如何以前所未有的方......
  • HarmonyOS 5.0 (Next)应用开发实战:使用ArkTS构建开箱即用的登录页面【HarmonyOS 5.0(Next
    HarmonyOS5.0(Next)应用开发实战:使用ArkTS构建开箱即用的登录页面【HarmonyOS5.0(Next)】一、HarmonyOS5.0美学与科技的完美融合在科技飞速发展的今天,每一个细微的创新都可能引领一场变革。华为,作为科技领域的领航者,再次以HarmonyOS5.0(Next)这一里程碑式的操作系统升级,向我们展......
  • 开箱即用的个人主页页面开发实战—基于HarmonyOS 5.0 (Next)和ArkTS的实现【HarmonyOS 5
    开箱即用的个人主页页面开发实战—基于HarmonyOS5.0(Next)和ArkTS的实现【HarmonyOS5.0(Next)】一、HarmonyOS5.0(Next)革新设计理念,打造和谐美学在科技日新月异的今天,操作系统作为智能设备的灵魂,正不断推动着数字生活的变革。华为,作为全球领先的科技企业,于近期正式推出了其原生鸿......
  • 探索HarmonyOS开发:用ArkTS构建个人主页和活动管理系统【HarmonyOS 5.0(Next)】
    探索HarmonyOS开发:用ArkTS构建个人主页和活动管理系统【HarmonyOS5.0(Next)】一、一个系统,统一生态口号:“一个系统,统一生态”,旨在全面突破操作系统核心技术,实现系统架构由内到外的焕然一新。流畅度提升:相比前代,HarmonyOS5.0(Next)的流畅度提升了30%,系统运行更加丝滑。续航增强:手......
  • HarmonyOS应用开发实战-开箱即用的首页页面构建与ArkTS解析【HarmonyOS 5.0(Next)】
    HarmonyOS应用开发实战-开箱即用的首页页面构建与ArkTS解析【HarmonyOS5.0(Next)】一、HarmonyOSNext5.0的优势AI能力:HarmonyOSNext5.0通过系统级AI能力,将AI下沉至操作系统并赋能给多个子系统,从而提升了应用的智能化体验。例如,小艺助手在HarmonyOSNext5.0中得到了显著增强......
  • HarmonyOS应用开发实战:基于ArkTS的开箱即用登录页面实现【样式方式实现①】【HarmonyO
    HarmonyOS应用开发实战:基于ArkTS的开箱即用登录页面实现【样式方式实现①】【HarmonyOS5.0(Next)】一.HarmonyOSNext5.0发布时间:2024年10月22日,在华为全场景新品发布会上正式发布。地位:HarmonyOSNEXT成为全球继苹果iOS和安卓系统后的第三大移动操作系统,标志着华为在操作系统......
  • 鸿蒙初学者学习手册_应用开发页面路由(页面路由(Navigation )(一))
    实现页面路由可以分为两种方法,Router和Navigation首先,想象一下你在玩手机上的一个App,比如淘宝。你从一个页面(比如首页)跳到另一个页面(比如商品详情页),这就是页面跳转。页面路由(@ohos.router):这就像是一条条固定的路,比如从家到学校的路。你只能按照这些路走,不能随意偏离。在......
  • C# winform自定义图片空间 缩放、拖拽、绘画
    首先简单介绍一下图片自定义的功能1、滑动鼠标滚轮缩放图片;2、按住鼠标左键拖拽图片;3、可选绘画矩形、圆、直线、画笔;4、可选连续绘画、单次绘画;5、每次绘画通过事件返回起点坐标、终点坐标;6、右击可重置图片大小(适应窗口)、原始尺寸(100%)、另存当前图片、清除绘画;7、For......
  • 在SpringBoot项目中接入sensitive-word实现敏感词过滤(DFA算法、为敏感词打上标签、忽
    文章目录1.前言2.敏感词过滤的常见解决方案3.DFA算法3.1什么是DFA算法3.2DFA算法的原理3.2.1数据是如何存储的3.2.2数据是如何检索的3.3DFA算法的应用场景4.sensitive-word简介4.1什么是sensitive-word4.2sensitive-word的官网4.3sensitive-word的性能5.......