鸿蒙应用开发从入门到实战(十六):线性布局案例

news/2025/9/28 9:21:28/文章来源:https://www.cnblogs.com/heimatengyun/p/19116110

线性布局案例:商品列表

大家好,我是潘Sir,持续分享IT技术,帮你少走弯路。《鸿蒙应用开发从入门到项目实战》系列文章持续更新中,陆续更新AI+编程、企业级项目实战等原创内容、欢迎关注!

ArkUI提供了丰富的系统组件,用于制作鸿蒙原生应用APP的UI,本文通过简单案例演示如何使用Column和Row组件实现线性布局。

一、商品列表

1.1 效果图

3折扣价列表

相关知识:

​ 线性布局

​ 渲染控制:循环渲染、条件渲染

1.2 实现代码

拷贝素材

​ 将mate60.png拷贝到resources/base/media目录

​ 在pages/layout/linear下新建ProductListPage.ets文件

1.2.1 先实现静态界面

界面分析

0布局分析

@Entry
@Component
struct ProductListPage {build() {Column({ space: 8 }) {// 标题Row() {Text('商品列表').fontSize(30).fontWeight(FontWeight.Bold)}.width('100%').margin({ bottom: 20 })// 商品列表Row({ space: 10 }) {Image($r('app.media.mate60')).width(100)Column({ space: 4 }) {Text('华为Mate60').fontSize(20).fontWeight(FontWeight.Bold)Text('¥ 6999').fontColor('#F36').fontSize(18)}.height('100%').alignItems(HorizontalAlign.Start)}.width('100%').backgroundColor('#FFF').borderRadius(20).height(120).padding(10)}.width('100%').height('100%').backgroundColor('#EFEFEF').padding(20)}
}

效果图

1静态界面

1.2.2 数据循环渲染

由于列表项都相同,因此可以直接复制实现界面。但是这会导致大量重复代码,因此考虑使用循环渲染实现,先定义数据类型Item,接着定义数据items,再使用foreach循环渲染数据到界面,将写死的数据从items里取出即可。

class Item {name: string //小写image: ResourceStrprice: numberconstructor(name: string, image: ResourceStr, price: number) {this.name = namethis.image = imagethis.price = price}
}@Entry
@Component
struct ProductListPage {// 商品数据private items: Array<Item> = [new Item('华为Mate60', $r('app.media.mate60'),6999),new Item('MateBookProX', $r('app.media.mate60'),13999),new Item('WatchGT4', $r('app.media.mate60'),1438),new Item('FreeBuds Pro3', $r('app.media.mate60'),1499),new Item('Mate X5', $r('app.media.mate60'),12999)]build() {Column({ space: 8 }) {// 标题Row() {Text('商品列表').fontSize(30).fontWeight(FontWeight.Bold)}.width('100%').margin({ bottom: 20 })// 商品列表ForEach(this.items,(item:Item)=>{Row({ space: 10 }) {Image(item.image).width(100)Column({ space: 4 }) {Text(item.name).fontSize(20).fontWeight(FontWeight.Bold)Text('¥'+item.price).fontColor('#F36').fontSize(18)}.height('100%').alignItems(HorizontalAlign.Start)}.width('100%').backgroundColor('#FFF').borderRadius(20).height(120).padding(10)})}.width('100%').height('100%').backgroundColor('#EFEFEF').padding(20)}
}

效果图

2循环列表

1.2.3 数据条件渲染

有的商品参加打折活动,会多一个折扣价,因此需要根据商品是否打折显示不同的价格信息。

首先修改商品数据类型,添加折扣discount字段;然后再打折商品上添加折扣价;最后再通过条件渲染界面。

class Item {name: string //小写image: ResourceStrprice: numberdiscount: numberconstructor(name: string, image: ResourceStr, price: number, discount: number = 0) {this.name = namethis.image = imagethis.price = pricethis.discount = discount}
}@Entry
@Component
struct ProductListPage {// 商品数据private items: Array<Item> = [new Item('华为Mate60', $r('app.media.mate60'),6999, 500),new Item('MateBookProX', $r('app.media.mate60'),13999),new Item('WatchGT4', $r('app.media.mate60'),1438),new Item('FreeBuds Pro3', $r('app.media.mate60'),1499),new Item('Mate X5', $r('app.media.mate60'),12999)]build() {Column({ space: 8 }) {// 标题Row() {Text('商品列表').fontSize(30).fontWeight(FontWeight.Bold)}.width('100%').margin({ bottom: 20 })// 商品列表ForEach(this.items,(item:Item)=>{Row({ space: 10 }) {Image(item.image).width(100)Column({ space: 4 }) {if(item.discount){Text(item.name).fontSize(20).fontWeight(FontWeight.Bold)Text('原价:¥' + item.price).fontColor('#CCC').fontSize(14).decoration({type: TextDecorationType.LineThrough})Text('折扣价:¥' + (item.price - item.discount)).fontColor('#F36').fontSize(18)Text('补贴:¥' + item.discount).fontColor('#F36').fontSize(18)}else {Text(item.name).fontSize(20).fontWeight(FontWeight.Bold)Text('¥'+item.price).fontColor('#F36').fontSize(18)}}.height('100%').alignItems(HorizontalAlign.Start)}.width('100%').backgroundColor('#FFF').borderRadius(20).height(120).padding(10)})}.width('100%').height('100%').backgroundColor('#EFEFEF').padding(20)}
}

效果图

3折扣价列表

《鸿蒙应用开发从入门到项目实战》系列文章持续更新中,陆续更新AI+编程、企业级项目实战等原创内容,防止迷路,欢迎关注!

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

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

相关文章

SQL注入流程

SQL注入流程 1.寻找注入点 得到目标网站的一般信息和技术分析信息之后,就要寻找注入点和测试注入点,这些点位都是与数据库有交互的地方 常用注入点在哪里? 我们一般在三个地方,寻找注入点表单中的输入参数 URL中的…

Spring Boot 3.x + Security + OpenFeign:如何避免内部服务调用被重复拦截? - 详解

Spring Boot 3.x + Security + OpenFeign:如何避免内部服务调用被重复拦截? - 详解2025-09-28 09:17 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; ov…

完整的GLFW应用程序示例

/** 完整的GLFW应用程序示例* 包含窗口创建、输入处理、渲染循环等所有主要功能* 每行代码都有详细注释,便于学习GLFW的使用*/#include <GLFW/glfw3.h> // GLFW主头文件 #include <iostream> // 用…

网站规划建设实训大型电商网站开发方案

1. 引言 Go&#xff08;也称为Golang&#xff09;是一种开源的编程语言&#xff0c;由Google在2007年启动的项目中开发而来。它是一种静态类型的编译型语言&#xff0c;旨在提供高效、可靠的性能。相比于其他编程语言&#xff0c;Golang具有更高的执行效率和并发能力&#xff…

物理笔记

\(P\cdot V=N\cdot K\cdot T\) \(N\) 为分子数量 \(K\) 为常量 \(1.38\times 10^{-23} J\cdot K^{-1}\) 现在推到温度 \(T\) 代表分子平均动能。 考虑单个分子在正方体内运动 \(\Delta p=2mv_x\) \(F=\frac{\Delta p}{…

基于Python+Vue开发的商城管理系统源码+运行步骤

项目简介该项目是基于Python+Vue开发的商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Pyt…

HTML5-和-CSS3-迁移即时入门-全-

HTML5 和 CSS3 迁移即时入门(全)原文:zh.annas-archive.org/md5/94106B0DE1B83990A3B43B022F07C0DB 译者:飞龙 协议:CC BY-NC-SA 4.0前言 采用新技术总是一个具有挑战性的过程,特别是当它被视为对流行和广为认可…

HTML5-多人游戏开发-全-

HTML5 多人游戏开发(全)原文:zh.annas-archive.org/md5/58B015FFC16EF0C30C610502BF4A7DA3 译者:飞龙 协议:CC BY-NC-SA 4.0前言 欢迎来到《使用 HTML5 开发多人游戏》。本书将教你如何开发支持多个玩家在同一游戏…

HTML5-地理位置即时操作指南-全-

HTML5 地理位置即时操作指南(全)原文:zh.annas-archive.org/md5/d561e9d990e59031e96fb80bd9bd24f6 译者:飞龙 协议:CC BY-NC-SA 4.0前言 欢迎来到 Instant HTML5 Geolocation How-to。本指南将帮助你快速轻松地使…

暖色网站专项培训网站建设方案

51单片机—————8位单片机 裸机驱动 无系统 linux驱动 有系统 驱动-----反映硬件变化 MCU 微控器 MPU CPU GPU 图像处理 IDE 集成开发环境 peripheral 外设 SOC&#xff1a; system on chip P0&#xff1a;8bit——8个引脚 位运算 & …

哪里有免费的网站网址商城网站栏目

声明 下面的题目作答都是自己认为正确的答案&#xff0c;并非官方答案&#xff0c;如果有不同的意见&#xff0c;可以评论区交流。 这些题目也是笔者从各个地方收集的&#xff0c;感觉有些题目答案并不正确&#xff0c;所以在个别题目会给出自己的见解&#xff0c;欢迎大家讨论…

[Kernel] - Heterogeneous Memory Management (HMM)

[Kernel] - Heterogeneous Memory Management (HMM)Heterogeneous Memory Management (HMM) https://www.kernel.org/doc/html/latest/mm/hmm.html Provide infrastructure and helpers to integrate non-conventional…

GreenPlum - Get field types

GreenPlum - Get field types import psycopg2conn = psycopg2.connect(dbname="your_db",user="your_user",password="your_password",host="your_host",port="5432&qu…

搭建环境

环境的流程 一、介绍环境(在linux搭建) 多有米 jdk+linux+服务器(tomcat)+mysql+代码包 jdk 1.8版本 linux(centos) 服务器 tomcat(目前用) 、apache、nginx 数据库 mysql 数据包(后缀 是.mysql)…

山东建设厅科技处网站python官网下载安装

写在前面 如果只有一个kafka实例的话&#xff0c;那么文章中提到kafka集群kafka实例 一、什么是消息发送者端的ack机制 ack机制&#xff1a;消息确认发送成功的标识 由谁发起该标识&#xff1a;kafka集群 发起该标识的场景&#xff1a;kafka集群确认已经收到了消息。 由谁接收…

20250928

周末了 看了下棕榈 前期好像走了个小五波吧 要涨么?不过大周期看还有个Yc的波段

Easysearch 国产替代 Elasticsearch:8 大核心挑战解读

Easysearch 国产替代 Elasticsearch:8 大核心挑战解读pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&q…

Typescript概述和思维导图

TypeScript 简要概述 TypeScript 是由微软开发的开源编程语言,它是 JavaScript 的一个超集。这意味着任何有效的 JavaScript 代码也都是有效的 TypeScript 代码。 核心价值在于其强大的静态类型系统。主要特点:静态类…

9-28

初态只有一个,终态可以有多个 自动机是进行词法分析的工具

Qt结合ffmpeg代码实现udp推流/组播推流/rtp推流/监控GB28181推流/onvif推流

一、前言说明 之前已经用ffmpeg代码实现了rtsp和rtmp推流,在没有搞过推流的时候,以为很难,其实推流就是保存文件到一个rtsp/rtmp地址,完全复用保存到MP4文件的代码,唯一不同的时候就是在avformat_alloc_output_co…