玩转HarmonyOS NEXT之IM应用首页布局

本文从目前流行的垂类市场中,选择即时通讯应用作为典型案例详细介绍HarmonyOS NEXT的各类布局在实际开发中的综合应用。即时通讯应用的核心功能为用户交互,主要包含对话聊天、通讯录,社交圈等交互功能。

应用首页

创建一个包含一列的栅格布局,显示文本“首页”,并且监听断点变化,当断点发生变化时更新 currentBreakpoint状态。

  • 示例代码
    @Entry
    @Component
    struct Index {
    
      @StorageLink('currentBreakpoint') currentBreakpoint: string = 'sm';
    
      build() {
        GridRow({ columns: 1 }) {
          GridCol({ span: 1 } ) {
            Column() {
              Text('首页')
            }
            .width('100%')
            .height('100%')
          }
        }
        .onBreakpointChange((breakPoint => {
          this.currentBreakpoint = breakPoint;
        }))
      }
    }
    
    在这里插入图片描述

装饰器

  • @Entry:标记这是一个页面入口
  • @Component:标记这是一个组件

状态管理

  • @StorageLink:全局UI状态存储。
  • currentBreakpoint:声明并初始化了一个字符串类型的状态变量,初始值为 ‘sm’,这可能表示屏幕宽度的断点。

布局和结构

  • GridRowGridCol:表示一个栅格布局,GridRow 包含一行,GridCol 表示该行中的一列。
  • columns: 1span: 1:指定网格布局中的列数和列的跨度。

断点变化处理

  • .onBreakpointChange:绑定一个事件处理函数,当断点变化时触发。
  • (breakPoint => { this.currentBreakpoint = breakPoint; }):定义了一个箭头函数,将新的断点值赋给 currentBreakpoint

HomeTab组件

BottomNavigation构造器

BottomNavigation构建器函数用于创建一个带有图像和文本的底部导航按钮,具有自适应布局和状态变化的功能。通过点击按钮,可以更新当前页面索引,从而改变按钮的显示状态(例如图像和文本的颜色)。

  • 示例代码
interface BottomNavigationProps {
  index: number;
  img: Resource;
  selectImg?: Resource;
  title: Resource | string;
}

 @Builder
  BottomNavigation(button: BottomNavigationProps) {
    Column() {
      Image(this.currentPageIndex === button.index ? button.selectImg : button.img)
        .objectFit(ImageFit.Contain)
        .width(this.currentBreakpoint === 'lg' ? '24vp' : '22vp')
        .height(this.currentBreakpoint === 'lg' ? '24vp' : '22vp')
      Text(button.title)
        .fontColor(this.currentPageIndex === button.index ? '#0A59F7' : Color.Black)
        .opacity(this.currentPageIndex === button.index ? 1 : 0.6)
        .fontWeight(500)
        .textAlign(TextAlign.Center)
        .fontSize('10fp')
        .lineHeight('14vp')
        .fontFamily('HarmonyHeiTi-Bold')
        .margin({ top: '4vp' })
    }
    .alignItems(HorizontalAlign.Center)
    .justifyContent(FlexAlign.Center)
    .onClick(() => {
      this.currentPageIndex = button.index;
    })
  }
}

参数类型约束

interface BottomNavigationProps {
  index: number;
  img: Resource;
  selectImg?: Resource;
  title: Resource | string;
}
  • index:按钮的索引,用于标识按钮。
  • img:按钮的默认图像资源。
  • selectImg:按钮的选中状态图像资源(可选)。
  • title:按钮的标题,可以是资源或字符串。

构造器函数

@Builder
BottomNavigation(button: BottomNavigationProps) {
  • @Builder:表示这是一个构建器函数,用于构建UI组件。
  • BottomNavigation(button: BottomNavigationProps):定义了接收一个 BottomNavigationProps 类型的参数 button。

组件布局

Column() {
  Image(this.currentPageIndex === button.index ? button.selectImg : button.img)
    .objectFit(ImageFit.Contain)
    .width(this.currentBreakpoint === 'lg' ? '24vp' : '22vp')
    .height(this.currentBreakpoint === 'lg' ? '24vp' : '22vp')
  • Column():创建一个列布局,用于垂直排列组件。
  • Image(...):根据当前页面索引和按钮索引是否匹配来选择显示按钮的图像或选中状态的图像。
  • objectFit(ImageFit.Contain):设置图像的适应方式为“Contain”。
  • .width(...) 和 .height(...):根据断点调整图像的宽度和高度。

文本设置

Text(button.title)
  .fontColor(this.currentPageIndex === button.index ? '#0A59F7' : Color.Black)
  .opacity(this.currentPageIndex === button.index ? 1 : 0.6)
  .fontWeight(500)
  .textAlign(TextAlign.Center)
  .fontSize('10fp')
  .lineHeight('14vp')
  .fontFamily('HarmonyHeiTi-Bold')
  .margin({ top: '4vp' })
  • Text(button.title):显示按钮的标题。
  • .fontColor(...):根据按钮是否被选中设置字体颜色。
  • .opacity(...):根据按钮是否被选中设置透明度。
  • .fontWeight(500):设置字体粗细。
  • .textAlign(TextAlign.Center):设置文本对齐方式为居中。
  • .fontSize('10fp') 和 .lineHeight('14vp'):设置字体大小和行高。
  • .fontFamily('HarmonyHeiTi-Bold'):设置字体样式。
  • margin({ top: '4vp' }):设置顶部外边距。

列对齐和点击事件

.alignItems(HorizontalAlign.Center)
.justifyContent(FlexAlign.Center)
.onClick(() => {
  this.currentPageIndex = button.index;
})
  • .alignItems(HorizontalAlign.Center):设置列交叉轴居中对齐。
  • .justifyContent(FlexAlign.Center):设置列主轴居中对齐。
  • .onClick(...):绑定点击事件处理函数,当按钮被点击时更新 currentPageIndex 为按钮的索引。

HomeTab布局

构建了一个包含底部导航栏的界面布局。使用TabsTabContent组件来构建一个带有多个标签页的布局,每个标签页都通过BottomNavigation函数生成按钮,这些按钮包含图像和文本,并且具有自适应布局和状态变化的功能。通过点击标签页按钮,可以更新currentPageIndex,从而改变当前显示的页面内容。

  • 示例代码
interface BottomNavigationProps {
  index: number;
  img: Resource;
  selectImg?: Resource;
  title: Resource | string;
}

@Component
export default struct HomeTab {

  @StorageProp('currentBreakpoint') currentBreakpoint: string = 'sm';
  @Link currentPageIndex: number;

  build() {
    Column() {
      Tabs({ barPosition: this.currentBreakpoint === 'lg' ? BarPosition.Start : BarPosition.End }) {
        TabContent()
          .tabBar(this.BottomNavigation({
            index: 0,
            img: $r('app.media.icon_message'),
            selectImg: $r('app.media.icon_message_selected'),
            title: '消息'
          }))
        TabContent()
          .tabBar(this.BottomNavigation({
            index: 1,
            img: $r('app.media.icon_contacts'),
            selectImg: $r('app.media.icon_contacts_selected'),
            title: '通讯录'
          }))
        TabContent()
          .tabBar(this.BottomNavigation({
            index: 2,
            img: $r("app.media.icon_social_circle"),
            selectImg: $r("app.media.icon_social_circle_selected"),
            title: '朋友圈'
          }))
        TabContent()
          .tabBar(this.BottomNavigation({
            index: 3,
            img: $r('app.media.icon_me'),
            selectImg: $r('app.media.icon_me'),
            title: '我的'
          }))
      }
      .vertical(this.currentBreakpoint === 'lg')
      .height('100%')
      .margin({
        top: this.currentBreakpoint === 'lg' ? '' : '6.5vp',
        bottom: this.currentBreakpoint === 'lg' ? '' : '7.5vp'
      })
    }
    .backgroundColor('#F1F3F5')
    .expandSafeArea([], [SafeAreaEdge.BOTTOM])
  }

  @Builder
  BottomNavigation(button: BottomNavigationProps) {
    Column() {
      Image(this.currentPageIndex === button.index ? button.selectImg : button.img)
        .objectFit(ImageFit.Contain)
        .width(this.currentBreakpoint === 'lg' ? '24vp' : '22vp')
        .height(this.currentBreakpoint === 'lg' ? '24vp' : '22vp')
      Text(button.title)
        .fontColor(this.currentPageIndex === button.index ? '#0A59F7' : Color.Black)
        .opacity(this.currentPageIndex === button.index ? 1 : 0.6)
        .fontWeight(500)
        .textAlign(TextAlign.Center)
        .fontSize('10fp')
        .lineHeight('14vp')
        .fontFamily('HarmonyHeiTi-Bold')
        .margin({ top: '4vp' })
    }
    .alignItems(HorizontalAlign.Center)
    .justifyContent(FlexAlign.Center)
    .onClick(() => {
      this.currentPageIndex = button.index;
    })
  }
}

Link状态存储

@Link currentPageIndex: number;
  • @Link:标记currentPageIndex为一个Link状态变量,子组件中被@Link装饰的变量与其父组件中对应的数据源建立双向数据绑定。
  • currentPageIndex:当前页面的索引。

标签页

Tabs({ barPosition: this.currentBreakpoint === 'lg' ? BarPosition.Start : BarPosition.End }) {
  • Tabs:创建一个标签页组件。
  • barPosition:根据当前断点设置标签栏的位置,如果断点为 lg,则标签栏位置为Start,否则为End

安全区域

.backgroundColor('#F1F3F5')
.expandSafeArea([], [SafeAreaEdge.BOTTOM])
  • .expandSafeArea([], [SafeAreaEdge.BOTTOM]):扩展安全区域到底部,确保内容不会被系统导航栏遮挡。

实现效果图

在这里插入图片描述

参考文章

  • 栅格布局
  • 线性布局
  • 全局状态存储

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/801784.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式总结(设计模式的原则及分类)

1.什么是设计模式? 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结…

数据结构(4.0)——串的定义和基本操作

串的定义(逻辑结构) 串,即字符串(String)是由零个或多个字符组成的有序数列。 一般记为Sa1a2....an(n>0) 其中,S是串名,单引号括起来的字符序列是串的值;ai可以是字母、数字或其他字符;串中字符的个数n称为串的长度。n0时的…

Proxyman for Mac v5.6.1 抓包调试工具

Mac分享吧 文章目录 效果一、下载软件二、功能三、开始安装1、双击运行软件,将其从左侧拖入右侧文件夹中,等待安装完毕2、应用程序显示软件图标,表示安装成功 四、运行测试1、打开软件 安装完成!!! 效果 一…

SpringBoot介绍以及第一个SpringBoot程序

T04BF 👋专栏: 算法|JAVA|MySQL|C语言 🫵 今天你敲代码了吗 文章目录 2.第一个SpringBoot程序2.1Spring Boot介绍2.2使用idea创建Spring Boot程序2.2.1 社区版idea2.2.2专业版idea2.2.3创建SpringBoot项目2.2.4项目代码和目录介绍目录介绍pom文件 2.3Web…

leetcode 周赛(406)全AC留念

纪念第一次 leetcode 周赛(406)全AC 1.(100352. 交换后字典序最小的字符串) 题目描述: 给你一个仅由数字组成的字符串 s,在最多交换一次 相邻 且具有相同 奇偶性 的数字后,返回可以得到的 字典序最小的字符串 。 如…

量化发展历史简述,QMT/PTrade+恒生UFT、LDP极速柜台适用哪些情形?

量化发展简述 1.2004年萌发阶段:策略局限在量化择时,量化选股等; 光大保德信量化核 心基金 上投摩根阿尔法基 金 金融危机,海归引入。 2.2010量化元年:中低频交易为主,主要依靠套利、对冲、多因子策略等…

Nginx入门到精通一(基本概念介绍)

下面内容整理自bilibili-尚硅谷-Nginx青铜到王者视频教程 Nginx相关文章 Nginx入门到精通二(安装配置)-CSDN博客 Nginx入门到精通三(Nginx实例1:反向代理)-CSDN博客 Nginx入门到精通四(反向代理2&…

linux服务器登录mysql无异常,本地登录报1045 -Access denied for user

1、本地登录linux服务器报“1045 -Access denied for user (用户访问被拒绝)” 造成上面链接问题的原因是,用户权限不足,需要在linux服务器上执行如下2条命令即可 CREATE USER root127.0.0.1 IDENTIFIED BY root123; GRANT ALL P…

蔚来Java实习一面总结

此文用于个人面经总结,答案可能存在出入,望理性食用~~ 1. 分析时间复杂度的工具 2. 数组和链表的区别 数组:线性表,存储空间连续,可以通过下标直接访问元素,查找时间复杂度为O(1),插入的时间…

前端Vue组件化实践:打造自定义等宽tabs标签组件

在前端开发的世界里,随着业务复杂度的提升和需求的多样化,传统的整体式开发方式已经难以满足快速迭代和高效维护的需求。组件化开发作为一种重要的解决方案,正逐渐受到广大开发者的青睐。本文将结合Vue框架,探讨如何通过组件化开发…

Linux 网络配置与连接

一、网络配置 1.1 ifconfig 网卡配置查询 ifconfig #查看所有启动的网络接口信息 ifconfig 指定的网卡 #查看指定网络接口信息 1.2 修改网络配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33 #ens33网络配置文…

数据驱动未来,Xinstall全渠道统计方案引领行业变革

在这个信息爆炸的时代,App市场的竞争日益激烈。对于每一个开发者或营销人员来说,掌握准确、全面的数据分析能力,是提升产品竞争力、优化营销策略的关键。然而,面对投放渠道的分散、数据打通的困难以及作弊流量的困扰,许…

CentOS7.X系统部署Zabbix6.0版本(可跟做)

文章目录 一、部署环境说明二、基本环境部署步骤1、环境初始化操作2、部署并配置Nginx3、部署并配置PHP4、测试NginxPHP环境5、部署并配置MariaDB 三、Zabbix-Server部署步骤1、编译安装Zabbix-Server2、导入Zabbix初始化库3、配置Zabbix前端UI4、启动Zabbix-Server5、WEB页面配…

大厂必争之地!AI搜索产品万字长文分析

多年以前,百度、谷歌等就在开始做智能搜索,但彼时的智能搜索只是对搜索结果的简单整理归纳,效果并不如人意。当前AI爆火,在AI的加持下,搜索会不会更强大一些呢?其实并不是,至少当前AI搜索的使用…

【Linux杂货铺】期末总结篇2:文件操作命令 | 目录操作命令

🌈个人主页:聆风吟_ 🔥系列专栏:Linux实践室、网络奇遇记 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 第四章4.1 ⛳️Linux与windows的文件系统差别4.2 ⛳️目录相关的常用术语4.3 ⛳️Linux文件类型…

环境配置|PyCharm——Pycharm本地项目打包上传到Github仓库的操作步骤

一、Pycharm端的设置操作 通过Ctrl+Alt+S快捷组合键的方式,打开设置,导航到版本控制一栏中的Git,在Git可执行文件路径中,输入Git.exe。 按照下图顺序,依次点击,完成测试。输出如图标④的结果,即可完成测试。 输出下图结果,配置Git成功,如本地未安装Git,需自行安装。

机器学习 | 深入理解激活函数

什么是激活函数? 在人工神经网络中,节点的激活函数定义了该节点或神经元对于给定输入或一组输入的输出。然后,将此输出用作下一个节点的输入,依此类推,直到找到原始问题的所需解决方案。 它将结果值映射到所需的范围…

Java的数组

概念:用于存储同一数据类型的多个元素[容器] 声明格式:数据类型[] 变量名; 初始化: 1. 静态初始化 数据类型[] 数组名 new 数据类型[]{元素一,元素二,元素三....}简化格式: 数据类型[] 数组名 {元素一,元素二,元素三....} 简…

phenocycler发现免疫治疗反应关键的肿瘤微环境区域

T 细胞介导的抗原特异性反应对于有效的免疫监视至关重要。然而T细胞如何进入肿瘤微环境并操纵局部组织微环境来实现效应器功能,以及这些局部的细胞结构如何对T细胞疗法或者其他免疫治疗做出反应仍然不清楚。近期来自斯坦福大学的研究者利用小鼠模型和临床患者样本&a…

【LeetCode力扣】006. Z 字形变换(Python)

最快解法 参考了运行时间最短的代码&#xff0c;其使用的思路就是按列排序后连接。 class Solution:def convert(self, s: str, numRows: int) -> str:if numRows < 2 : # numRows1时候&#xff0c;对应输出为原字符串return sn len(s)lst [ for _ in range(numRows…