鸿蒙系统导航栏,HarmonyOS三方件开发指南(18)-Flexbox流式布局组件

本文主要是介绍鸿蒙系统导航栏,HarmonyOS三方件开发指南(18)-Flexbox流式布局组件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引言

上一篇给大家介绍底部导航栏的组件使用及开发指南,本篇将给大家带来另一个鸿蒙三方件的是实现:Flexbox,何为Flexbox,如果对Java的Swing比较熟悉的话一定不会陌生,就是控件根据ViewGroup的宽,自动的往右添加,如果当前行剩余空间不足,则自动添加到下一行。有点所有的控件都往左飘的感觉,第一行满了,往第二行飘~所以也叫流式布局。鸿蒙并没有提供流式布局,但是某些场合中,流式布局还是非常适合使用的,比如关键字标签,搜索热词列表等,比如下图:

dcd5d1b8f3e2a5582bfdad2ba5340674.png

789978478d908f799c9ae7b6c0d84d64.png

这些都特别适合使用Flexbox,本篇会带领大家自己实现Flexbox,然后使用我们自己定义的Flexbox实现上面的标签效果。学会使用一个控件和学会写一个控件,我相信大家都明白,授人以鱼不如授人以渔。

接下来看下鸿蒙模拟器的实现效果,效果图如下:

图(1)默认标签状态

13d4d7be42ec6281304829c5bd70ed53.png

图(2)标签选中状态

ebcaa0d164aad0d76412105bcf0c7d18.png

VideoCache使用指南

Ø 新建工程, 添加组件Har包依赖

在应用模块中添加HAR,只需要将flexboxlibrary-debug.har复制到entry\libs目录下即可

Ø 修改配置文件

1. 在布局中添加如下代码:

ohos:id="$+id:viewgroup"

ohos:height="match_content"

ohos:width="match_parent"

ohos:background_element="gray"

ohos:orientation="vertical"

/>1.2.3.4.5.6.7.

复制

2.在代码中通过以下方式使用://mNames 是item的数据源,可以是任意需要显示的数据类型,根据实际情况去定义

parentLayout = (HWFlowViewGroup) findComponentById(ResourceTable.Id_viewgroup);

parentLayout.HWFlowViewGroup(getContext(), mNames, parentLayout);

parentLayout.setOnItemClickListener((Component view) -> {

//item点击之后的回调

Text text = (Text)view;

if(text.isSelected()){

text.setTextColor(Color.BLACK);

}else{

text.setTextColor(Color.WHITE);

}

});1.2.3.4.5.6.7.8.9.10.11.12.13.

复制

VideoCache开发指南

在上述中,已经说明Flexbox 如何在开发过程中使用,接下来简单的分析下Flexbox 实现思路

1、对于Flexbox ,需要指定的LayoutConfig,我们目前只需要能够识别margin、padding即可

2、measureChild中计算所有childView的宽度,然后根据childView的宽度,计算当前每一行的宽度

3、最后根据计算之后的宽度,对中所有的childView进行布局。

以text为例,计算每个childView 的代码如下:private float measureChild(Text text) {

Paint paint = new Paint();

paint.setTextSize(text.getTextSize());

float childWidth = paint.measureText(text.getText());

childWidth = childWidth + text.getPaddingLeft() + text.getPaddingRight() + text.getMarginLeft() + text.getMarginRight();

return childWidth;

}1.2.3.4.5.6.7.

复制

初始化每行的布局,代码如下:private DirectionalLayout initDirtLayout() {

DirectionalLayout childLayout = new DirectionalLayout(mContext);

childLayout.setOrientation(Component.HORIZONTAL);

DirectionalLayout.LayoutConfig layoutConfig = new DirectionalLayout.LayoutConfig(ComponentContainer.LayoutConfig.MATCH_PARENT, ComponentContainer.LayoutConfig.MATCH_CONTENT);

layoutConfig.setMargins(10, 10, 10, 10);

childLayout.setLayoutConfig(layoutConfig);

return childLayout;

}1.2.3.4.5.6.7.8.

复制

获取屏幕的宽度,代码如下:private void getParentWidthAndHeight() {

Optional display = DisplayManager.getInstance().getDefaultDisplay(mContext);

Point pt = new Point();

display.get().getSize(pt);

mParentWidth = (int) pt.getPointX();

}1.2.3.4.5.6.

复制

动态布局:private void initChildViews() {

for (int i = 0; i 

Text text = new Text(mContext);

text.setId(i);

text.setText(mNames[i]);

text.setTextSize(100);

text.setSelected(false);

text.setTextColor(Color.WHITE);

text.setPadding(10, 10, 10, 10);

ShapeElement background = new ShapeElement();

background.setRgbColor(new RgbColor(205, 92, 92));

text.setBackground(background);

DirectionalLayout.LayoutConfig layoutConfig = new DirectionalLayout.LayoutConfig(ComponentContainer.LayoutConfig.MATCH_CONTENT, ComponentContainer.LayoutConfig.MATCH_CONTENT);

layoutConfig.setMargins(20, 10, 20, 10);

text.setLayoutConfig(layoutConfig);

if (i == 0) {

childLayout = initDirtLayout();

mLineWidth = measureChild(text);

childLayout.addComponent(text);

} else {

mLineWidth = mLineWidth + measureChild(text);

if (mLineWidth > (mParentWidth - childLayout.getMarginLeft() - childLayout.getMarginRight())) {

mParentLayout.addComponent(childLayout);

childLayout = initDirtLayout();

mLineWidth = measureChild(text);

}

childLayout.addComponent(text);

if (i == mNames.length - 1) {

mParentLayout.addComponent(childLayout);

}

}

ComponentBean bean = new ComponentBean(text, false);

list.add(bean);

text.setClickedListener(component -> {

text.setSelected(!text.isSelected());

mOnItemClickListener.onItemClick(text);

});

}

}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.

复制

定义接口,实现item的点击事件public interface OnItemClickListener {

void onItemClick(Component view);

}

public void setOnItemClickListener(OnItemClickListener onItemClickListener) {

mOnItemClickListener = onItemClickListener;

}1.2.3.4.5.6.7.

复制

按照思路看下来,是不是很简单呢?我们只需要把握住如何计算childview 的宽度,以及什么情况下添加新的一行即可。

这篇关于鸿蒙系统导航栏,HarmonyOS三方件开发指南(18)-Flexbox流式布局组件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/828280

相关文章

Java docx4j高效处理Word文档的实战指南

《Javadocx4j高效处理Word文档的实战指南》对于需要在Java应用程序中生成、修改或处理Word文档的开发者来说,docx4j是一个强大而专业的选择,下面我们就来看看docx4j的具体使用... 目录引言一、环境准备与基础配置1.1 Maven依赖配置1.2 初始化测试类二、增强版文档操作示例2.

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

创建Java keystore文件的完整指南及详细步骤

《创建Javakeystore文件的完整指南及详细步骤》本文详解Java中keystore的创建与配置,涵盖私钥管理、自签名与CA证书生成、SSL/TLS应用,强调安全存储及验证机制,确保通信加密和... 目录1. 秘密键(私钥)的理解与管理私钥的定义与重要性私钥的管理策略私钥的生成与存储2. 证书的创建与

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

Python包管理工具pip的升级指南

《Python包管理工具pip的升级指南》本文全面探讨Python包管理工具pip的升级策略,从基础升级方法到高级技巧,涵盖不同操作系统环境下的最佳实践,我们将深入分析pip的工作原理,介绍多种升级方... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

PowerShell中15个提升运维效率关键命令实战指南

《PowerShell中15个提升运维效率关键命令实战指南》作为网络安全专业人员的必备技能,PowerShell在系统管理、日志分析、威胁检测和自动化响应方面展现出强大能力,下面我们就来看看15个提升... 目录一、PowerShell在网络安全中的战略价值二、网络安全关键场景命令实战1. 系统安全基线核查

Java操作Word文档的全面指南

《Java操作Word文档的全面指南》在Java开发中,操作Word文档是常见的业务需求,广泛应用于合同生成、报表输出、通知发布、法律文书生成、病历模板填写等场景,本文将全面介绍Java操作Word文... 目录简介段落页头与页脚页码表格图片批注文本框目录图表简介Word编程最重要的类是org.apach

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)