鸿蒙系统导航栏,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系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

2.1/5.1和7.1声道系统有什么区别? 音频声道的专业知识科普

《2.1/5.1和7.1声道系统有什么区别?音频声道的专业知识科普》当设置环绕声系统时,会遇到2.1、5.1、7.1、7.1.2、9.1等数字,当一遍又一遍地看到它们时,可能想知道它们是什... 想要把智能电视自带的音响升级成专业级的家庭影院系统吗?那么你将面临一个重要的选择——使用 2.1、5.1 还是

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

Python使用qrcode库实现生成二维码的操作指南

《Python使用qrcode库实现生成二维码的操作指南》二维码是一种广泛使用的二维条码,因其高效的数据存储能力和易于扫描的特点,广泛应用于支付、身份验证、营销推广等领域,Pythonqrcode库是... 目录一、安装 python qrcode 库二、基本使用方法1. 生成简单二维码2. 生成带 Log

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

Ubuntu系统怎么安装Warp? 新一代AI 终端神器安装使用方法

《Ubuntu系统怎么安装Warp?新一代AI终端神器安装使用方法》Warp是一款使用Rust开发的现代化AI终端工具,该怎么再Ubuntu系统中安装使用呢?下面我们就来看看详细教程... Warp Terminal 是一款使用 Rust 开发的现代化「AI 终端」工具。最初它只支持 MACOS,但在 20

Python实现数据清洗的18种方法

《Python实现数据清洗的18种方法》本文主要介绍了Python实现数据清洗的18种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录1. 去除字符串两边空格2. 转换数据类型3. 大小写转换4. 移除列表中的重复元素5. 快速统

windows系统下shutdown重启关机命令超详细教程

《windows系统下shutdown重启关机命令超详细教程》shutdown命令是一个强大的工具,允许你通过命令行快速完成关机、重启或注销操作,本文将为你详细解析shutdown命令的使用方法,并提... 目录一、shutdown 命令简介二、shutdown 命令的基本用法三、远程关机与重启四、实际应用

Debian如何查看系统版本? 7种轻松查看Debian版本信息的实用方法

《Debian如何查看系统版本?7种轻松查看Debian版本信息的实用方法》Debian是一个广泛使用的Linux发行版,用户有时需要查看其版本信息以进行系统管理、故障排除或兼容性检查,在Debia... 作为最受欢迎的 linux 发行版之一,Debian 的版本信息在日常使用和系统维护中起着至关重要的作