蒙HarmonyOS从零实现类微信app效果第二篇,我的+发现页面实现

本着不拖更的原则,今天上新了,今天实现了类微信app的发现页和我的页面。先看效果。
在这里插入图片描述

在这里插入图片描述
效果是不是看着还不错。其实这两个页面功能实现还是比较简单的,接下来还是老规矩,先进行页面的拆分和代码实现,然后进行相关我认为比较重要的知识点的说明。

页面拆分

在这里插入图片描述
页面看似复杂,但是其实经过拆分之后,发现就是由两部分组合。

  • 顶部的TitleBar
  • 内容Cell

复杂的内容区域部分,无非就是由一个个小的内容Cell复用组装起来的嘛,上篇文章也写过了。一个Foreach而已嘛。

代码实现

实现TitleBar,在实现TitleBar的时候,为了练习控件使用,专门引入了RelativeContainer组件的使用。在知识解惑部分会做详细说明。

@Preview
@Component
export default struct SearchTitleBar {@Prop title: string;build() {RelativeContainer() {Text(this.title).fontColor(0x333333).fontSize(18).fontWeight(FontWeight.Medium).alignRules({left: { anchor: "__container__", align: HorizontalAlign.Start },right: { anchor: "__container__", align: HorizontalAlign.End },top: { anchor: "__container__", align: VerticalAlign.Top },bottom: { anchor: "__container__", align: VerticalAlign.Bottom },}).textAlign(TextAlign.Center).id("id_title")Column() {Image($r('app.media.toolbar_search')).width(22).height(22)}.height('100%').margin({right: 12}).justifyContent(FlexAlign.Center).alignRules({right: { anchor: "id_more", align: HorizontalAlign.Start }}).id("id_search")Column() {Image($r('app.media.toolbar_more')).width(22).height(22).margin({right: 16})}.height('100%').justifyContent(FlexAlign.Center).alignRules({right: { anchor: "__container__", align: HorizontalAlign.End },}).id("id_more")}.width('100%').height(50).backgroundColor(0xEDEDED)}
}

对于Cell的实现代码,在下面的讲解Column部分,也会列出来,如果这会不想看,在看完FlexColumn之后,看起来会更加清晰。

import { DiscoverCellEntity } from '../../common/bean/DiscoverCellEntity'
import commonDataViewModel from '../../viewmodel/CommonDataViewModel';@Preview
@Component
export default struct CellItemView {private discoverCellEntity: DiscoverCellEntity;build() {Row({ space: 5 }) {Row() {Image(this.discoverCellEntity.icon).width(22).height(22).margin({ left: 16 })Text(this.discoverCellEntity.title).fontWeight(FontWeight.Regular).fontSize(16).fontColor(0x333333).margin({ left: 12 })Row().width(5).height(5).margin({ left: 4 }).borderRadius(2.5).backgroundColor(0xF14400).visibility(this.discoverCellEntity.hasNew ? Visibility.Visible : Visibility.Hidden)}Row() {Image(commonDataViewModel.getUserAvatar()).width(35).height(35).objectFit(ImageFit.Cover).borderRadius(4).visibility(this.discoverCellEntity.hasAvatar ? Visibility.Visible : Visibility.Hidden)Image($r('app.media.ic_right_arrow')).width(22).height(22).margin({ right: 12 })}.justifyContent(FlexAlign.Center).height('100%').onClick(() => {})}.justifyContent(FlexAlign.SpaceBetween).width('100%').height(60).backgroundColor(0xFFFFFF)}
}

用到的知识点

由于在上篇文章中,牵扯到的一些布局知识点,没有讲解到,我一个同事看了我的文章之后,建议,对于一些基础的知识,也带一带简单做个说明,所以本次会把上次和本地用到的布局相关知识进行一个简单说明,如果对相关的知识比较熟悉,这部分内容可以酌情阅读。

Column和Row

类似于Android中的LinearLayout,只是类似。对于Column和Row本身如果对于前端Flex布局比较熟悉的话,基本上看一眼就知道啥意思了。所以我在讲解Column和Row之前,先讲解一下Flex布局。

如果想做详细理解同学,可以直接先看一下我引入的这篇文章,你会了解到更多关于flex的知识。
flex入门 来源于知乎。

Flex布局

Flex是一个支持横向和纵向填充内容的布局容器。在布局填充到flex中之后,我们可以通过对横向和纵向进行控制,用来实现容器内内容的横竖向排列方式,可以帮我们实现等分、居左、居右等很多种对其方式。
在这里插入图片描述
我们用来在纵向和横向上控制的内容,在flex中,被描述成了相应的主轴和副轴(交叉轴)。比如一个横向的布局排列,主轴就是对应的横向,而副轴(交叉轴)就是竖向了。
在这里插入图片描述

  • justify-content 决定flex items在主轴上的对齐方式
  • align-items: 决定items在交叉轴上的对齐方式
    主轴和交叉轴的操作上,支持类型有以下几种,我这里以主轴为横向排列进行演示,对应的如果竖向排列,逻辑是类似的,自行举一反三即可。
//默认起点对齐
justify-content: flex-start;
//终点对齐
justify-content: flex-end;
//居中对齐
justify-content: center;
//两端对齐
justify-content: space-between;
//周围分布相同空间
justify-content: space-around;
//均匀空间
justify-content: space-evenly;

在这里插入图片描述
自己懒得画这些效果图,所以直接从别人博客拿了图。大家理解着看,理解之后,会发现很简单。

接着看一下Column的源码,Row类似,就不做过多分析了
declare class ColumnAttribute extends CommonMethod<ColumnAttribute> {/*** Sets the alignment format of the subassembly in the horizontal direction.* @since 7*//*** Sets the alignment format of the subassembly in the horizontal direction.* @form* @since 9*/alignItems(value: HorizontalAlign): ColumnAttribute;/*** Sets the alignment format of the subassembly in the vertical direction.* @since 8*//*** Sets the alignment format of the subassembly in the vertical direction.* @form* @since 9*/justifyContent(value: FlexAlign): ColumnAttribute;

在学会了Flex之后,在看这个代码是不是豁然开朗?这不就是变种的简化版本Flex吗。我们只管填充内容,接下来的变化,直接交给alignItemsjustifyContent属性帮我们完成就行了。

为了加深理解,看一个我实现过程中的代码片段。

Row({ space: 5 }) {Row() {Image(this.discoverCellEntity.icon).width(22).height(22).margin({ left: 16 })Text(this.discoverCellEntity.title).fontWeight(FontWeight.Regular).fontSize(16).fontColor(0x333333).margin({ left: 12 })Row().width(5).height(5).margin({ left: 4 }).borderRadius(2.5).backgroundColor(0xF14400).visibility(this.discoverCellEntity.hasNew ? Visibility.Visible : Visibility.Hidden)}Row() {Image(commonDataViewModel.getUserAvatar()).width(35).height(35).objectFit(ImageFit.Cover).borderRadius(4).visibility(this.discoverCellEntity.hasAvatar ? Visibility.Visible : Visibility.Hidden)Image($r('app.media.ic_right_arrow')).width(22).height(22).margin({ right: 12 })}.justifyContent(FlexAlign.Center).height('100%').onClick(() => {})}.justifyContent(FlexAlign.SpaceBetween).width('100%').height(60).backgroundColor(0xFFFFFF)

上面的代码,帮我们实现了一个cell效果。是不是很简单,瞬间理解了,有没有。
在这里插入图片描述

RelativeContainer

这个布局被命名为Relative,但是我更觉得应该命名为ConstraintLayout,不能说完全相似,只能说是一模一样。

ColumnRow布局在绘制过程中,简单界面还好,但是如果负责的界面的话,会出现无数的ColumnRow之间的魔鬼嵌套。导致代码层级无限深,阅读代码造成困难,修改更是地狱级别。这个时候RelativeContainer的优势就出来了,使用它可以将布局进行层级平铺,通过布局间的依赖关系控制,实现整体的界面布局。

这是鸿蒙开发者官网上的文档地址: RelativeContainer

  • 容器内子组件区分水平方向,垂直方向:
    水平方向为left, middle, right,对应容器的HorizontalAlign.Start, HorizontalAlign.Center, HorizontalAlign.End。
  • 垂直方向为top, center, bottom,对应容器的VerticalAlign.Top, VerticalAlign.Center, VerticalAlign.Bottom。
  • 子组件可以将容器或者其他子组件设为锚点:
    参与相对布局的容器内组件必须设置id,不设置id的组件不显示,容器id固定为__container__。
    此子组件某一方向上的三个位置可以将容器或其他子组件的同方向三个位置为锚点,同方向上两个以上位置设置锚点以后会跳过第三个。
    前端页面设置的子组件尺寸大小不会受到相对布局规则的影响。子组件某个方向上设置两个或以上alignRules时不建议设置此方向尺寸大小。
    对齐后需要额外偏移可设置offset。
  • 特殊情况
    互相依赖,环形依赖时容器内子组件全部不绘制。
    同方向上两个以上位置设置锚点但锚点位置逆序时此子组件大小为0,即不绘制。
    容器不设置宽高时,容器与容器内子组件不绘制。

上面的话,不知道你看懂了没有。下面我使用下面的图,进行一个说明。
在这里插入图片描述
如果我们要实现上面的效果,可以先写五个Row().width(100).height(100)元素,设置不同颜色之后,放置在RelativeContainer容器中。
上下左右四个角的元素,我们分析发现,其实我们要把他们定位到正确位置,只需要依赖父容器的上下左右位置即可。比如左上的大红色=>上(top)是和父容器上(top)对其的,左边是和父容器的左边对其的。就很容器写出如下的代码

.alignRules({top: {anchor: "__container__", align: VerticalAlign.Top},left: {anchor: "__container__", align: HorizontalAlign.Start}})

当运行代码,你会发现确实和和想象中一样,左上的大红色固定到了指定位置了。其余的左下、右上、右下也是类似的。

剩下中间的这个元素,我们分析,发现和父容器都没有任何关系。但是和四周的四个元素是有依赖关系的。中间元素左上=>左上元素右下中间元素右上=>右上元素左下以此类推。不难写出代码。

.alignRules({top: {anchor: "row1", align: VerticalAlign.Bottom},left: {anchor: "row1", align: HorizontalAlign.End},right: {anchor: "row2", align: HorizontalAlign.Start}
})

夜已深,今天就到这里了,谢谢你的阅读。

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

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

相关文章

2023年亚太杯APMCM数学建模大赛数据分析题MySQL的使用

2023年亚太杯APMCM数学建模大赛 以2022年C题全球变暖数据为例 数据分析&#xff1a; 以2022年亚太杯数学建模C题为例&#xff0c;首先在navicat建数据库然后右键“表”&#xff0c;单击“导入向导”&#xff0c;选择对应的数据格式及字符集进行数据导入 导入之后&#xff0c…

c# 字符串转化成语音合成,System.Speech

C# 语音合成可以使用 System.Speech.Synthesis 命名空间中的 SpeechSynthesizer 类来实现。SpeechSynthesizer 类提供了一系列方法和属性&#xff0c;可以用来控制语音合成的过程&#xff0c;包括设置语音、音调、语速等。 下面是一个简单的示例&#xff0c;用来演示如何使用 …

[量子计算与量子信息] 2.1 线性代数

2.1 线性代数 符号对照表 量子力学中&#xff0c;向量使用 ∣ ψ ⟩ \ket \psi ∣ψ⟩ (ket)来表示&#xff0c;可以理解为一个列向量。其对偶向量为 ⟨ ψ ∣ \bra \psi ⟨ψ∣ &#xff0c;可以理解为行向量。 向量空间中零向量直接用 0 0 0 表示&#xff0c; ∣ 0 ⟩ \…

卸载本地开发环境,拥抱容器化开发

以前在公司的时候&#xff0c;使用同事准备的容器化环境&#xff0c;直接在 Docker 内进行开发&#xff0c;爽歪歪呀。也是在那时了解了容器化开发的知识&#xff0c;可惜了&#xff0c;现在用不到那种环境了。所以打算自己在本地也整一个个人的开发环境&#xff0c;不过因为我…

S-Clustr(影子集群) 重磅更新!黑入工业PLC设备!

公告 项目地址:https://github.com/MartinxMax/S-Clustr 更新预告内容进度SIEMENS S7-200 SMART远程控制进行中 开发人员Blog联系方式提交时间提交内容授权情况ASH_HHhttps://blog.csdn.net/m0_53711047/article/details/133691537?spm1001.2014.3001.5502匿名2023-10-16 2…

USB复合设备构建CDC+HID鼠标键盘套装

最近需要做一个小工具&#xff0c;要用到USB CDCHID设备。又重新研究了一下USB协议和STM32的USB驱动库&#xff0c;也踩了不少坑&#xff0c;因此把代码修改过程记录一下。 开发环境&#xff1a; ST-LINK v2 STM32H743开发板 PC windows 11 cubeMX v6.9.2 cubeIDE v1.13.2 cub…

Feature Pyramid Networks for Object Detection(2017.4)

文章目录 Abstract1. Introduction3. Feature Pyramid NetworksBottom-up pathwayTop-down pathway and lateral connections 7. Conclusion FPN Abstract 特征金字塔是识别系统中检测不同尺度物体的基本组成部分。但最近的深度学习对象检测器避免了金字塔表示&#xff0c;部分…

VS Code画流程图:draw.io插件

文章目录 简介快捷键 简介 Draw.io是著名的流程图绘制软件&#xff0c;开源免费&#xff0c;对标Visio&#xff0c;用过的都说好。而且除了提供常规的桌面软件之外&#xff0c;直接访问draw.io就可以在线使用&#xff0c;堪称百分之百跨平台&#xff0c;便捷性直接拉满。 那么…

重生之我是一名程序员 31

大家晚上好&#xff01;前面给大家分享了指针与数组的知识&#xff0c;所以今天要给大家分享的知识是——指针数组 相信大家在这里都会有疑问&#xff0c;指针数组是指针还是数组&#xff1f; 在这我们可以类⽐⼀下其他类型的数组&#xff0c;比如整型数组是存放整型的数组&am…

python科研绘图:绘制X-bar图

目录 1.X-bar 图的基本概念 2.X-bar 图的绘制过程 3.X-bar 图的优势 4.X-bar 图的绘制 1.X-bar 图的基本概念 X-bar控制图是一种统计工具&#xff0c;用于监控和控制生产过程中的质量变量。它是过程能力分析和统计过程控制&#xff08;SPC&#xff0c;Statistical Process…

SystemVerilog学习 (5)——接口

一、概述 验证一个设计需要经过几个步骤&#xff1a; 生成输入激励捕获输出响应决定对错和衡量进度 但是&#xff0c;我们首先需要一个合适的测试平台&#xff0c;并将它连接到设计上。 测试平台包裹着设计,发送激励并且捕获设计的输出。测试平台组成了设计周围的“真实世界”,…

Python---数据序列中的公共方法

公共方法就是 支持大部分 数据 序列。 常见公共方法---简单 运算符描述支持的容器类型合并字符串、列表、元组*复制字符串、列表、元组in元素是否存在字符串、列表、元组、字典not in元素是否不存在字符串、列表、元组、字典 案例&#xff1a; 合并 代码&#xff1a; # …

【Nginx】nginx | 微信小程序验证域名配置

【Nginx】nginx | 微信小程序验证域名配置 一、说明二、域名管理 一、说明 小程序需要添加头条的功能&#xff0c;内容涉及到富文本内容显示图片资源存储在minio中&#xff0c;域名访问。微信小程序需要验证才能显示。 二、域名管理 服务器是阿里云&#xff0c;用的宝塔管理…

【探索Linux】—— 强大的命令行工具 P.15(进程间通信 —— system V共享内存)

阅读导航 引言一、system V的概念二、共享内存(1) 概念(2) 共享内存示意图(3) 共享内存数据结构 三、共享内存的使用1. 共享内存的使用步骤&#xff08;1&#xff09;包含头文件&#xff08;2&#xff09;获取键值&#xff08;ftok函数&#xff09;&#xff08;3&#xff09;创…

计算机视觉基础(7)——相机基础

前言 从这一节开始&#xff0c;我们来学习几何视觉。中层视觉包括相机模型、单目几何视觉、对极几何视觉和多目立体视觉等。在学习几何视觉最开始&#xff0c;我们先来学习一下相机模型&#xff0c;了解相机的基本原理&#xff0c;了解相机如何记录影像。 一、数字相机 1.1 基…

nodejs+vue黄河风景线旅游网站的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计

本文首先对该系统进行了详细地描述&#xff0c;然后对该系统进行了详细的描述。管理人员增加了系统首页、个人中心、用户管理、景点分类管理、景点简介管理、旅游路线管理、文章分类管理、公告文章管理、系统管理理等功能。这套黄河风景线旅游网站是根据当前的现实需要&#xf…

如何在 Nginx Proxy Manager(NPM)上部署静态网站

前言 众所周知&#xff0c;我们在之前介绍过 Nginx Proxy Manager&#xff08;以下简称 NPM) 这个反向代理的神器&#xff0c;对于一些 Docker 搭建的 Web 项目&#xff0c;NPM 能够很轻松地给他们做反向代理。 然而对于一些静态网站&#xff0c;小伙伴们可能不知道怎么用 NP…

Unity反编译:IL2CPP 打包输出的cpp文件和dll(程序集)位置、Mono打包输出的dll(程序集)位置

目录 如题&#xff1a;IL2CPP 打包输出的cpp文件和dll位置(并不会出现在APK里) 如题&#xff1a;Mono打包输出的dll位置 校验平台&#xff1a;Android 如题&#xff1a;IL2CPP 打包输出的cpp文件和dll位置(并不会出现在APK里) Unity Assets同级目录下 Temp/StagingArea/Il2…

Vue CLI脚手架安装、搭建、配置 和 CLI项目分析

目录 一、CLI快速入门 1. 官方介绍 : 2.安装Vue CLI : 3.搭建Vue CLI : 4.IDEA配置Vue CLI : 二、Vue CLI项目分析 1.结构分析 : 1.1 config 1.2 node_modules 1.3 src 1.4 static 2.流程分析 : 2.1 main.js 2.2 router/index.js 2.3 components/HelloWorld.vue 2.4 A…

《QT从基础到进阶·二十七》进度条QProgressBar

ui.ProgressBar.setValue(45); //45% ui.ProgressBar.setMin(0); ui.ProgressBar.setMax(255);0到100分为255份&#xff0c;值为215时&#xff0c;进度条为100/255*215 84% 点击主界面弹出进度条QProgressDialog 常用功能&#xff1a; setWindowFlags(Qt::Dialog | Qt::Cu…