鸿蒙一次开发,多端部署(九)应用市场首页

本小节将以应用市场首页为例,介绍如何使用自适应布局能力和响应式布局能力适配不同尺寸窗口。

页面设计

一个典型的应用市场首页的UX设计如下所示。

观察应用市场首页的页面设计,不同断点下的页面设计有较多相似的地方。

据此,我们可以将页面分拆为多个组成部分。

  1. 底部/侧边导航栏
  2. 标题栏与搜索栏
  3. 运营横幅
  4. 快捷入口
  5. 精品应用

接下来我们逐一分析各部分的实现。

底部/侧边导航栏

在sm和md断点下,导航栏在底部;在lg断点下,导航栏在左侧。可以通过 Tab组件 的barPosition和vertical属性控制TabBar的位置,同时还可以通过barWidth和barHeight属性控制TabBar的尺寸。

import Home from '../common/Home';//组件请参考相关实例
import TabBarItem from '../common/TabBarItem';@Entry
@Component
struct Index {@State currentIndex: number = 0;@StorageProp('currentBreakpoint') currentBreakpoint: string = 'md';@BuildertabItem(index: number, title: Resource, icon: Resource, iconSelected: Resource) {TabBarItem({index: index,currentIndex: this.currentIndex,title: title,icon: icon,iconSelected: iconSelected})}build() {// 设置TabBar在主轴方向起始或结尾位置Tabs({ barPosition: this.currentBreakpoint === "lg" ? BarPosition.Start : BarPosition.End }) {// 首页TabContent() {Home()}.tabBar(this.tabItem(0, $r('app.string.tabBar1'), $r('app.media.ic_home_normal'), $r('app.media.ic_home_actived')))TabContent() {}.tabBar(this.tabItem(1, $r('app.string.tabBar2'), $r('app.media.ic_app_normal'), $r('app.media.ic_app_actived')))TabContent() {}.tabBar(this.tabItem(2, $r('app.string.tabBar3'), $r('app.media.ic_game_normal'), $r('app.media.ic_mine_actived')))TabContent() {}.tabBar(this.tabItem(3, $r('app.string.tabBar4'), $r('app.media.ic_search_normal'), $r('app.media.ic_search_actived')))TabContent() {}.tabBar(this.tabItem(4, $r('app.string.tabBar4'), $r('app.media.ic_mine_normal'), $r('app.media.ic_mine_actived')))}.backgroundColor('#F1F3F5').barMode(BarMode.Fixed).barWidth(this.currentBreakpoint === "lg" ? 96 : '100%').barHeight(this.currentBreakpoint === "lg" ? '60%' : 56)// 设置TabBar放置在水平或垂直方向.vertical(this.currentBreakpoint === "lg") }
}

另外在sm及lg断点下,TabBar中各个Item的图标和文字是按照垂直方向排布的,在md断点下,TabBar中各个Item的图标和文字是按照水平方向排布的。

@Component
export default struct TabBarItem {@StorageProp('currentBreakpoint') currentBreakpoint: string = 'md';build() {if (this.currentBreakpoint !== 'md' ) {// sm及lg断点下,tabBarItem中的图标和文字垂直排布Column() {// ...}.justifyContent(FlexAlign.Center).height('100%').width('100%')} else {// md断点下,tabBarItem中的图标和文字水平排布Row() {// ...}.justifyContent(FlexAlign.Center).height('100%').width('100%')}}
}

标题栏与搜索栏

标题栏和搜索栏,在sm和md断点下分两行显示,在lg断点下单行显示,可以通过栅格实现。在sm和md断点下,标题栏和搜索栏占满12列,此时会自动换行显示。在lg断点下,标题栏占8列而搜索栏占4列,此时标题栏和搜索栏在同一行中显示。

@Component
export default struct IndexHeader {@Builder searchBar() {Stack({alignContent: Alignment.End}) {TextInput({ placeholder: $r('app.string.search') }).placeholderColor('#FF000000').placeholderFont({ size: 16, weight: 400 }).textAlign(TextAlign.Start).caretColor('#FF000000').width('100%').height(40).fontWeight(400).padding({ top: 9, bottom: 9 }).fontSize(16).backgroundColor(Color.White)Image($r('app.media.ic_public_search')).width(16).height(16).margin({ right: 20 })}.height(56).width('100%')}@Builder titleBar() {Text($r('app.string.tabBar1')).fontSize(24).fontWeight(500).fontColor('#18181A').textAlign(TextAlign.Start).height(56).width('100%')}build() {// 借助栅格实现标题栏和搜索栏在不同断点下的不同布局效果。GridRow() {GridCol({ span: { xs: 12, lg: 8 } }) {this.titleBar()}GridCol({ span: { xs: 12, lg: 4 } }) {this.searchBar()}}.width('100%')}
}

运营横幅

不同断点下的运营横幅,sm断点下显示一张图片,md断点下显示两张图片,lg断点下显示三张图片。可以通过 Swiper组件的displayCount属性 实现目标效果。

@Component
export default struct IndexSwiper {@StorageProp('currentBreakpoint') currentBreakpoint: string = 'md';@Builder swiperItem(imageSrc:Resource) {Image(imageSrc).width('100%').aspectRatio(2.5).objectFit(ImageFit.Fill)}build() {Swiper() {this.swiperItem($r('app.media.ic_public_swiper1'))this.swiperItem($r('app.media.ic_public_swiper2'))this.swiperItem($r('app.media.ic_public_swiper3'))// ...}.autoPlay(true).indicator(false).itemSpace(10)// 配置不同断点下运行横幅中展示的图片数量.displayCount(this.currentBreakpoint === 'sm' ? 1 : (this.currentBreakpoint === 'md' ? 2 : 3)).width('100%').padding({ left: 12, right: 12, bottom: 16, top: 16 })}
}

快捷入口

在不同的断点下,快捷入口的5个图标始终均匀排布,这是典型的均分能力使用场景。

import { entranceIcons } from '../model/HomeData';
import { AllIcons } from '../model/HomeDataType';@Component
export default struct IndexEntrance {build() {// 将justifyContent参数配置为FlexAlign.SpaceEvenly实现均分布局Row() {ForEach(entranceIcons, (icon: AllIcons) => {// 各快捷入口的图标及名称Column() { // ... }})}.width('100%').height(64).justifyContent(FlexAlign.SpaceEvenly).padding({ left: 12, right: 12 })}
}

精品应用

随着可用显示区域的增加,精品应用中显示的图标数量也不断增加,这是典型的延伸能力使用场景。精品游戏的实现与精品应用类似,不再展开分析。

import { AppItem, MyAppSource } from '../model/HomeDataType';@Component
export default struct IndexApps {private title?: Resource;@StorageProp('currentBreakpoint') currentBreakpoint: string = 'md';private apps: AppItem[] = [];@BuilderappListHeader() {Row() {Text(this.title).width(100).fontSize(16).textAlign(TextAlign.Start).fontWeight(500)Blank()Text($r('app.string.more')).fontSize(14).textAlign(TextAlign.End).fontWeight(400).margin({ right: 2 })Image($r('app.media.ic_public_arrow_right')).width(12).height(18).opacity(0.9).objectFit(ImageFit.Fill)}.margin({ bottom: 9, top: 9 }).width('100%').alignItems(VerticalAlign.Bottom)}@BuilderappListItem(app:AppItem) {Column() {Image(app.image).width(this.currentBreakpoint === 'lg' ? 80 : 56).height(this.currentBreakpoint === 'lg' ? 80 : 56).margin({ bottom: 8 })Text(app.title).width(this.currentBreakpoint === 'lg' ? 80 : 56).height(16).fontSize(12).textAlign(TextAlign.Center).fontColor('#18181A').margin({ bottom: 8 })Text($r('app.string.install')).width(this.currentBreakpoint === 'lg' ? 80 : 56).height(28).fontColor('#0A59F7').textAlign(TextAlign.Center).borderRadius(this.currentBreakpoint === 'lg' ? 26 : 20).fontWeight(500).fontSize(12).padding({ top: 6, bottom: 6, left: 8, right: 8 }).backgroundColor('rgba(0,0,0,0.05)')}}build() {Column() {this.appListHeader()// 借助List组件能力,实现延伸能力场景List({ space: this.currentBreakpoint === 'lg' ? 44 : 20}) {LazyForEach(new MyAppSource(this.apps), (app: AppItem)=> {ListItem() {// 每个应用的图标、名称及安装按钮this.appListItem(app)}})}.width('100%').height(this.currentBreakpoint === 'lg' ? 140 : 120).listDirection(Axis.Horizontal)}.width('100%').height(this.currentBreakpoint === 'lg' ? 188 : 164).padding({ bottom: 8, left: 12, right: 12 })}
}

运行效果

将上述各页面主要部分组合在一起后,即可完成整体页面开发。

import IndexSwiper from './IndexSwiper';
import IndexEntrance from './IndexEntrance';
import IndexApps from './IndexApps';
import { appList, gameList } from '../model/HomeData';
import IndexHeader from './IndexHeader';@Component
struct IndexContent {// ...build() {List() {// 运营横幅ListItem() {IndexSwiper()}// 快捷入口ListItem() {IndexEntrance()}// 精品应用ListItem() {IndexApps({ title: $r('app.string.boutique_application'), apps: appList })}// 精品游戏ListItem() {IndexApps({ title: $r('app.string.boutique_game'), apps: gameList })}}.width("100%")}
}@Entry
@Component
export default struct Home {// ...build() {Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Start }) {// 标题栏和搜索栏IndexHeader()// 运营横幅、快捷入口、精品应用、精品游戏等IndexContent()}.height('100%').backgroundColor("#F1F3F5")}
}

本页面的实际运行效果如下图所示。

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python的BBS论坛系统flask-django-nodejs-php

为了更好地发挥本系统的技术优势,根据BBS论坛系统的需求,本文尝试以B/S架构设计模式中的django/flask框架,python语言为基础,通过必要的编码处理、BBS论坛系统整体框架、功能服务多样化和有效性的高级经验和技术实现方法&#xff…

WebClient上载文件——实现将本地文件同步到远端服务器上

问题描述 用户上传产品示例图片到服务器端上,客户端在请求图片资源时,当服务端架设了多个节点的情况下,由于没有负载均衡请求到保存图片资源的服务器,出现图片访问404的问题。 这里保存上传文件时,同时需要将该文件保…

数学建模(层次分析法 python代码 案例)

目录 介绍: 模板: 例题:从景色、花费、饮食,男女比例四个方面去选取目的地 准则重要性矩阵: 每个准则的方案矩阵:​ 一致性检验: 特征值法求权值: 完整代码: 运行结…

1.6 学Python能干什么,Python的应用领域有哪些

Python能干什么,Python的应用领域 Python 作为一种功能强大的编程语言,因其简单易学而受到很多开发者的青睐。那么,Python 的应用领域有哪些呢? Python 有着非广泛的应用,几乎所有大中型互联网公司都在使用 Python&a…

基于甘特图的资源调度优化策略

资源在项目管理中是一个永恒的话题。无论人力、物力还是财力资源,总是捉襟见肘,都希望用最少的资源完成最大的工作。这就要求我们在资源调度方面果断精准,做到最优化。而甘特图作为项目时间规划的重要工具,恰恰能为资源调度提供绝佳帮助。 甘特图能反映出任务之间的制约关系,有…

Flutter 项目架构技术指南

Flutter 项目架构技术指南 视频 https://www.bilibili.com/video/BV1rx4y127kN/ 前言 原文 https://ducafecat.com/blog/flutter-clean-architecture-guide 探讨Flutter项目代码组织架构的关键方面和建议。了解设计原则SOLID、Clean Architecture,以及架构模式MVC…

(MATLAB)第二十一章 Simulink仿真设计初步

Simulink是MATLAB的重要组成部分,可以非常容易地实现可视化建模,并把理论研究和工程实践有机地结合在一起,不需要书写大量程序,只需要使用鼠标和键盘对已有模块进行简单的操作和设置。 21.1 Simulink简介 Simulink是MATLAB软件的…

linux热键,man手册介绍

目录 热键 tab ctrl c ctrl r man 区段 快捷键 热键 tab 可以看到以输入的内容为开头的指令,但无法选择: 当输入的内容匹配到的内容只有一个时,可以自动补全 可以用于输入路径时,自动补全文件名 ctrl c 让当前的程序停掉,可以在 程序或指令出问题而自己无法停止时 使用…

LeetCode---126双周赛

题目列表 3079. 求出加密整数的和 3080. 执行操作标记数组中的元素 3081. 替换字符串中的问号使分数最小 3082. 求出所有子序列的能量和 一、求出加密整数的和 按照题目要求,直接模拟即可,代码如下 class Solution { public:int sumOfEncryptedInt…

设计模式 适配器模式

1.背景 适配器模式,这个模式也很简单,你笔记本上的那个拖在外面的黑盒子就是个适配器,一般你在中国能用,在日本也能用,虽然两个国家的的电源电压不同,中国是 220V,日本是 110V,但是这…

ES的集群节点发现故障排除指南(2)

本文是ES官方文档关于集群节点发现与互联互通的问题排查指南内容,第二部分。 原文参考及相关内容: 英文原文(官网) 第一部分-(1) 已选出主节点但状态不稳定? 当一个节点赢得主节点选举时&…

XR“黑话”

MTP(Motion-To-Photon Latency):实际人体发生运动到图像显示到屏幕上的时间延迟。早期一些vr产生晕动症的主要原因。 ATW(Asynchronous Timewarp):主要解决两个问题,一是延迟,二是补…

AI大模型学习在当前技术环境下的重要性与发展前景

目录 前言1 学科基础与技能要求1.1 数学基础的深厚性1.2 编程能力的必要性1.3 对特定领域业务场景的了解 2 模型结构与算法的优化2.1 模型结构的不断演进2.2 算法优化的重要性2.3 准确性与效率的提升 3 AI大模型学习的应用场景3.1 自然语言处理3.2 计算机视觉3.3 推荐系统 结语…

YOLO算法改进Backbone系列之:Dfformer

摘要:配备多头自注意(MHSA)的模型在计算机性能方面取得了显著的性能。它们的计算复杂性与输入特征图中的像素平方成正比,导致处理缓慢,特别是在处理高分辨率图像时。新型的token Mixer 被提出作为MHSA的替代品&#xf…

抖音,剪映,TikTok,竖屏短视频转场pr模板视频素材

120个叠加效果视频转场过渡素材,抖音,剪映,TikTok,短视频转场pr模板项目工程文件。 效果:VHS、光效、胶片、霓虹灯闪光、X射线、信号、老电影等。 适用软件:Adobe Premiere Pro 2018 12.0或更高版本。 视频素材与大多数应用程序兼容&#xff…

学习几个地图组件(基于react)

去年开发时用的公司封装的地图组件,挺方便的,但是拓展性不强,所以看看有哪些优秀的开源地图组件吧 1、React Leaflet 介绍:开源的JavaScript库,用于在web上制作交互式地图,允许你使用React组件的方式在应…

基于Spring Boot技术的幼儿园管理系统

摘 要 随着信息时代的来临,过去的传统管理方式缺点逐渐暴露,对过去的传统管理方式的缺点进行分析,采取计算机方式构建幼儿园管理系统。本文通过课题背景、课题目的及意义相关技术,提出了一种活动信息、课程信息、菜谱信息、通知公…

【Linux】线程的概念{虚拟地址堆区细分/缺页中断/页/初识线程/创建线程/优缺点}

文章目录 1.前导知识1.1 虚拟地址空间的堆区1.2 缺页中断1.3ELF文件格式1.4页/页框/页帧/页表/MMU1.5虚拟地址到物理地址 2.初识Linux线程2.1之前所学的进程2.2线程的引入2.3如何理解线程2.4如何理解轻量级进程 3.创建线程3.1pthread_create()函数3.2程序测试3.3Makefile怎么写…

时序预测 | Matlab实现BiTCN-GRU双向时间卷积神经网络结合门控循环单元时间序列预测

时序预测 | Matlab实现BiTCN-GRU双向时间卷积神经网络结合门控循环单元时间序列预测 目录 时序预测 | Matlab实现BiTCN-GRU双向时间卷积神经网络结合门控循环单元时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现BiTCN-GRU双向时间卷积神经网络结…

计算机专业保研辅导

接计算机专业保研辅导