在日常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})

在鸿蒙NEXT中实现完全自定义导航栏的更多相关文章

  1. 分别用ToolBar和自定义导航栏实现沉浸式状态栏

    一.ToolBar 1.在build.gradle中添加依赖,例如: compile 'com.android.support:appcompat-v7:23.4.0' 2.去掉应用的ActionBa ...

  2. ios7以上自定义导航栏标题的字体大小及颜色的方法

    自定义导航栏的字体和颜色,只需要自定义一个lable,然后将lable添加到导航栏的titleview中就可以了 代码如下 UILabel *label = [[UILabel alloc] init ...

  3. iOS 自定义导航栏笔记

    一.UINavigationBar的结构 导航栏几乎是每个页面都会碰到的问题,一般两种处理方式:1.隐藏掉不显示 2.自定义 1. 添加导航栏 TestViewController * mainVC ...

  4. 微信小程序自定义导航栏

    微信小程序需要自定义导航栏,特别是左上角的自定义设置,可以设置返回按钮,菜单按钮,配置如下: 1.在app.json的window属性中增加: navigationStyle:custom 顶部导航栏 ...

  5. iOS:自定义导航栏,随着tableView滚动显示和隐藏

    自定义导航栏,随着tableView滚动显示和隐藏 一.介绍 自定义导航栏是APP中很常用的一个功能,通过自定义可以灵活的实现动画隐藏和显示效果.虽然处理系统的导航栏也可以实现,但是这个是有弊端的,因 ...

  6. 微信小程序——自定义导航栏

    微信头部导航栏可能通过json配置: 但是有时候我们项目需求可能需要自定义头部导航栏,如下图所示: 现在具体说一下实现步骤及方法: 步骤: 1.在 app.json 里面把 "navigat ...

  7. 微信小程序-如何自定义导航栏(navigationStyle)?

    小程序是越来越开放了,微信版本 6.6.0可以自定义导航? 先了解下app.json中window配置navigationStyle属性,即导航栏样式,仅支持 default/custom.custo ...

  8. Taro 小程序 自定义导航栏

    在小程序中,有的页面需求可能需要我们做一个自定义的导航栏, 今天就来踩一踩坑 首先需要在app.js 中给全局的导航栏隐藏, // app.js window: { navigationStyle: ...

  9. uni-app自定义导航栏按钮|uniapp仿微信顶部导航条

    最近一直在学习uni-app开发,由于uniapp是基于vue.js技术开发的,只要你熟悉vue,基本上很快就能上手了. 在开发中发现uni-app原生导航栏也能实现一些顶部自定义按钮+搜索框,只需在 ...

  10. 微信小程序自定义导航栏组件,完美适配所有手机,可实现各种功能和情况

    背景 在做小程序时,关于默认导航栏,我们遇到了以下的问题: Android.IOS 手机对于页面 title 的展示不一致,安卓 title 的显示不居中 页面的 title 只支持纯文本级别的样式控 ...

随机推荐

  1. 让Typecho支持Emoji表情,解决报错:Database Query Error

    最近在使用一个主题时,看到搭配emoji表情可以让改主题更加美观,于是我就上了,结果在将emoji表情放进去保存的时候报错:Database Query Error,于是问起了度娘.最后的结果是: 在 ...

  2. 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性

    学习编程之初就常被告诫:"永远不要相信用户的输入",但实际编码中,可能因为各种原因而忽略这点,本文尝试以 SQL 注入的角度探寻校验输入的重要性 以下实验均以 SQLI labs ...

  3. 机器学习 | 强化学习(2) | 动态规划求解(Planning by Dynamic Programming)

    动态规划求解(Planning by Dynamic Programming) 动态规划概论 动态(Dynamic):序列性又或是时序性的问题部分 规划(Programming):最优化一个程序(Pr ...

  4. 你好,新朋友:生成式AI的第一次对话

    像学习使用智能手机一样开启AI对话 一.从"第一次用智能手机"理解AI交互 还记得初次使用智能手机时的笨拙吗?滑动解锁.输入文字.下载应用-每一步都需要探索.生成式AI的对话也遵循 ...

  5. Python装饰器:套层壳我变得更强了!

    Python装饰器:套层壳我变得更强了 Python装饰器:套层壳我变得更强了 关于作用域和闭包可以聊点什么? 什么是作用域 什么是闭包 装饰器:套层壳我变得更强了 参考资料 昨天阅读了<Pyt ...

  6. openpyxl 写入字典

    def write(self,data_path, sheetname,value): index = len(value) workbook = openpyxl.Workbook() sheet ...

  7. golang gin框架使用swagger生成接口文档

    前言 一份清晰明了的接口文档能够极大地提高前后端双方的沟通效率和开发效率. 本文将介绍如何使用swagger生成接口文档. swagger介绍 Swagger本质上是一种用于描述使用JSON表示的RE ...

  8. ORACLE数据挖掘之 MSET-SPRT

    虽然是熟悉的Oracle数据库,但关于机器学习.数据挖掘这方面的知识笔者起初也是不了解的,文中MSET相关设置来源于同事提供的sample,在测试过程中边查资料边学习吸收,也因此看到了别样的Oracl ...

  9. 【网络】Windows在局域网配置DNS服务器

    [网络]Windows在局域网配置DNS服务器 零.需求 最近因为要搭建一个局域网视频聊天系统,需要用到HTTPS协议,HTTPS协议需要证书,证书需要用到域名,而且IP地址不太好记,就想着直接在聊天 ...

  10. Linux 离线升级 RSYNC

    前言:本文操作是在 CentOS-7 下执行的,不确定在其他 Linux 发布版是否能同样正常执行. 1.检查前置依赖组件 在安装 rsync 之前,需要确认已安装了相关依赖组件: gcc .open ...