黑马程序员鸿蒙课程 ArkUI 组件(适合小白学习)

HarmonyOS鸿蒙开发-ArkTS初学02 申明:文章所有内容均来自于【哔哩哔哩-黑马程序员鸿蒙HarmonyOS NEXT星河版零基础入门到实战,零基础也能快速入门鸿蒙开发教程】本文是学习后的复盘,若有错漏,敬请各位大佬指正!!小包拜谢各位大佬!!! 阅读详情

今天我想和大家聊一聊鸿蒙的ArkUI组件,在此之前我先展示一下这段代码的UI预览效果:

首先,我们先完成标题部分,也就是商品页面的这个Row,Row你可以理解为前端web的div,把页面分割成不同的部分, 我们可以创建一个新的文件命名为CommonComponents.ets:

@Component
export struct Header {
  @Prop private  title: ResourceStr
  build() {

    Row() {
      Image($r('app.media.return'))
        .width(30)
      Text(this.title)
        .fontSize(25)// 调整标题字体大小
        .fontWeight(FontWeight.Bold)
      // 空白,在这个容器中,你没沾满的,我来沾满
      Blank()
      Image($r('app.media.refresh'))
        .width(30)
    }
    .width('100%')
    .height(30)
  }

}

@Prop 表示这是一个从父组件传递的属性。 目的是设置 title属性, 然后传到主的组件中去。设置第一个Row,里面添加各种属性,用 Blank( ) 把这两个   和  分离开, Blank() : 表示空白,在这个容器中,你没沾满的,我来沾满。 OK这些结束后,我们开始写主程序代码,只需要用import导入就好。 


// 这个必须位于文件顶部
import {Header} from '../components/CommonComponents'

  接着我们去创建组件Item的各种属性,比如名字,图片,价格,折扣这些属性。 代码部分这样写:

class Item {
  name: string
  image: ResourceStr
  price: number
  discount: number

  constructor(name: string, image: ResourceStr, price: number, discount: number) {
    this.name = name
    this.image = image
    this.price = price
    this.discount = discount
  }
}

再然后我们可以设置全局自定义构建函数, 这个位置很重要。 需要写在该函数的外面,不能写在它的里面,因为是全局变量。   !!!注意 !!!     这些全局变量都有关键字function, 但是我们后面讲到的局部变量是不可以写function的,否则会报错。

@Entry
@Component
struct ItemPage{
   ......
}

代码部分:

//   全局自定义构建函数   这个位置很重要。
 @Builder
 function ItemCard(item: Item){

   Row({ space: 8}) { // 减小 Row 内部组件的间距
     Image(item.image)
       .width(60) // 缩小图片宽度
     Column({ space: 2 }) { // 减小文字行间距
       Text(item.name)
         .fontSize(16) // 缩小文字字体大小
         .fontWeight(FontWeight.Bold)
       Text('原价: $' + item.price)
         .fontColor('#F36')
         .fontSize(14)
         .decoration({type:TextDecorationType.LineThrough})
       Text('折扣价: $'+(item.price - item.discount))
         .fontColor('#F36')
         .fontSize(14)
       Text('补贴: $'+item.discount)
         .fontColor('#F36')
         .fontSize(14)
     }
     .alignItems(HorizontalAlign.Start)
   }
   .width('100%')
   .height(130) // 减小 Row 的高度
   .backgroundColor('#EFEFEF')
   .padding(10) // 减少内边距

}


// 全局公共样式函数
 @Styles function fillScreen(){
   .width('100%')
   .height(130) // 减小 Row 的高度
   .backgroundColor('#EFEFEF')
   .padding(10) // 减少内边距
 }

OK, 如果你还没理解全局变量没有关系,我们先理解后面的局部变量,以及For-each循环去遍历这几个Row的块。 我们可以从运行结果这张图看出,每一件商品都是一个块, 是一个Row,直接遍历打印!

 // 局部自定义构建函数, @Builder 后面不需要 + function, 只有全局需要
  @Builder
  ItemCard(item: Item){

  Row({ space: 8}) { // 减小 Row 内部组件的间距
    Image(item.image)
      .width(60) // 缩小图片宽度
    Column({ space: 2 }) { // 减小文字行间距
      if (item.discount){
      Text(item.name)
        .fontSize(16) // 缩小文字字体大小
        .fontWeight(FontWeight.Bold)
      Text('原价: $' + item.price)
        // .fontColor('#F36')
        // .fontSize(14)
        .priceText()
        .decoration({type:TextDecorationType.LineThrough})
      Text('折扣价: $'+(item.price - item.discount))
        // .fontColor('#F36')
        // .fontSize(14)
        .priceText()
      Text('补贴: $'+item.discount)
        // .fontColor('#F36')
        // .fontSize(14)
        .priceText()}
       else {
         Text('原价: $' + item.price)
           // .fontColor('#F36')
           // .fontSize(14)
           .priceText()
       }
    }
    .alignItems(HorizontalAlign.Start)
  }



    .fillScreen()

}

}

@Builder 是一个注解,用于标记 ItemCard 是一个构建函数(可能属于特定框架的声明式 UI 构建方法)

这是我的运行结果截图,在我的虚拟机上:

这是完整的代码: 

// 这个必须位于文件顶部
import {Header} from '../components/CommonComponents'

class Item {
  name: string
  image: ResourceStr
  price: number
  discount: number

  constructor(name: string, image: ResourceStr, price: number, discount: number) {
    this.name = name
    this.image = image
    this.price = price
    this.discount = discount
  }
}

// //    全局自定义构建函数   这个位置很重要。
// @Builder
// function ItemCard(item: Item){
//
//   Row({ space: 8}) { // 减小 Row 内部组件的间距
//     Image(item.image)
//       .width(60) // 缩小图片宽度
//     Column({ space: 2 }) { // 减小文字行间距
//       Text(item.name)
//         .fontSize(16) // 缩小文字字体大小
//         .fontWeight(FontWeight.Bold)
//       Text('原价: $' + item.price)
//         .fontColor('#F36')
//         .fontSize(14)
//         .decoration({type:TextDecorationType.LineThrough})
//       Text('折扣价: $'+(item.price - item.discount))
//         .fontColor('#F36')
//         .fontSize(14)
//       Text('补贴: $'+item.discount)
//         .fontColor('#F36')
//         .fontSize(14)
//     }
//     .alignItems(HorizontalAlign.Start)
//   }
//   .width('100%')
//   .height(130) // 减小 Row 的高度
//   .backgroundColor('#EFEFEF')
//   .padding(10) // 减少内边距
//
// }


// 全局公共样式函数
// @Styles function fillScreen(){
//   .width('100%')
//   .height(130) // 减小 Row 的高度
//   .backgroundColor('#EFEFEF')
//   .padding(10) // 减少内边距
// }

//   @Extend 继承必须写在全局位置。  这里不能使用 @Styles 因为它里面没有字体的属性,也就是说没有 .fontColor关键字 所以要用@Extend去继承Text文本属性
@Extend(Text) function priceText(){
      .fontColor('#F36')
      .fontSize(18)
}



@Entry
@Component
struct ItemPage {

  private items: Array<Item> = [
    new Item('华为Mate60', $r("app.media.HuaweiMate60"), 9150, 500),
    new Item('苹果16', $r('app.media.apple'), 850, 0),
    new Item('小米15', $r('app.media.xiaomi'), 450, 0),
    new Item('ipad4', $r('app.media.ipad'), 400, 0),
    new Item('ipad5', $r('app.media.ipad'), 800, 0),
    new Item('ipad6', $r('app.media.ipad'), 900, 0)
  ]


  //  写在内部,删除 function     局部公共样式函数
  // 这是每个Row的属性, 也就是每个小方块的属性
  @Styles  fillScreen(){
  .width('100%')
  .height(130) // 控制 Row 的高度
  .backgroundColor('#EFEFEF')
  .padding(10) // 控制内边距
}


  build() {
    Column({ space: 4 }) {
      Header({title:'商品页面'})
        .margin({bottom:20})
        .backgroundColor("#FdF")


      // 这是一个滑块,让用户可以自由滑动手机屏幕
      List({ space: 10 }) { // 控制 List 的子项间距 ( 也就是每个小方块之间的距离 )
        // 使用for-each 遍历每个Row, 也就是每个小块
        ForEach(
          this.items,
          (item: Item) => {
            ListItem() {
              // 一定要加this, 因为调用的函数在内部, 是局部函数
              this.ItemCard(item)
            }
          }
        )
      }
    }

  }

  // 局部自定义构建函数, @Builder 后面不需要 + function, 只有全局需要
  // 设置每一个小块的属性, 然后让主函数来调用它
  @Builder
  ItemCard(item: Item){

  Row({ space: 8}) {
    Image(item.image)
      .width(60) // 图片宽度
    Column({ space: 2 }) {
      // 如果存在折扣价的话, 那就进行以下一系列操作
      if (item.discount){
      Text(item.name)
        .fontSize(16)
        .fontWeight(FontWeight.Bold)
      Text('原价: $' + item.price)
        // .fontColor('#F36')
        // .fontSize(14)
        .priceText()
        // 把原价部分用杠划掉。
        .decoration({type:TextDecorationType.LineThrough})
      Text('折扣价: $'+(item.price - item.discount))
        // .fontColor('#F36')
        // .fontSize(14)
        .priceText()
      Text('补贴: $'+item.discount)
        // .fontColor('#F36')
        // .fontSize(14)
        .priceText()}

      // 没有折扣价的话, 直接显示原价就好
       else {
         Text('原价: $' + item.price)
           // .fontColor('#F36')
           // .fontSize(14)
           .priceText()
       }
    }
    // .alignItems:指定容器中子元素的对齐方式。
    // HorizontalAlign.Start:表示子元素在水平方向上从容器的起始位置对齐(一般为左对齐,取决于布局的方向)。
    .alignItems(HorizontalAlign.Start)
  }


  // .width('100%')
  // .height(130)
  // .backgroundColor('#EFEFEF')
  // .padding(10)

  // 调用每个Row的属性, 也就是每个小方块的属性。  省去了上述已经备注了的代码
    .fillScreen()

}

}

以上是完整的代码, 我想了一下,还是在备注中详细解释比较好,因为前端很多属性假如我单个拿出来讲解不利于大家去理解。

 另外我附加上这些商品图片,免得大家还得去网上找了。

  

 

鸿蒙实战案例(个人期末项目)-----黑马健康(源自黑马程序员)#3 接下来,我们将创建一个名为`SearchHeader`的组件,它将作为顶部的搜索栏。鸿蒙操作系统已经提供了一个专门的搜索栏组件`Search`,我们可以通过将鼠标悬停在`Search`组件上来查看其具体的书写格式。- **营养素统计**:同样使用行式布局,展示碳水化合物、蛋白质和脂肪的摄入情况,每部分旁边也将展示一个环形进度条,帮助用户了解各类营养素的摄入比例。- `Swiper`滑块视图容器是我们在布局分析中提到的穿梭切换卡片部分的关键组件,它为用户界面提供了流畅的滑动体验和动态的视图切换能力。 阅读详情

相关推荐

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(七)

鸿蒙学起来!HarmonyOS4+NEXT星河版入门到企业级实战教程

youyoufenglai的博客 1454

鸿蒙HarmonyOS4.0开发应用学习笔记

鸿蒙harmonyos4.0学习笔记

用作学习记录 4851

HarmonyOS鸿蒙开发指南:构建用户界面 构建布局

开发者可以使用input组件实现输入留言的部分,使用text组件实现留言完成部分,使用commentText的状态标记此时显示的组件(通过if属性控制)。当页面结构较为复杂时,如果使用div循环渲染,容易出现卡顿,因此推荐使用list组件代替div组件实现长列表布局,从而实现更加流畅的列表滚动体验。将页面中的元素分解之后再对每个基本元素按顺序实现,可以减少多层嵌套造成的视觉混乱和逻辑混乱,提高代码的可读性,方便对页面做后续的调整。添加图片区域通常用image组件来实现,使用的方法和text组件类似。

斌擎科技 1971

黑马程序员HarmonyOS4+NEXT星河版入门到企业级实战教程 整理笔记 这篇就够了

注意:组件内自定义构建函数不需要加上function。

制定持续可量化的目标,不断坚持。 1681

f_fs.c 初始化流程(进行中)

前言 之所以选择f_fs.c作为这系列的开始,因为usb在/driver/usb下面的内容实在太多太多,如果讲各种各样点会太分散了。所以决定切入点以实际使用为主,就是f_fs了,目前我了解这是做bulk裸传输使用的,具体的通信协议自己确定。 初始化部分 开始点从这个路径下说起, /drivers/usb/gadget/function/f_fs.c 然后f_fs.c第一个使用的是include/composite.h中的宏定义function #define DECLARE_USB_FUNCTION(_n

weixin_36406973的博客 1967

睿尔曼超轻量仿人机械臂--机械臂接口介绍

本文介绍了睿尔曼超轻量仿人机械臂的控制器接口及末端接口。

realman_Rop的博客 3438

鸿蒙应用开发 常用组件与布局

HarmonyOS ArkUI 提供了丰富多样的 UI 组件,您可以使用这些组件轻松地编写出更加丰富、漂亮的界面。在本篇 Codelab 中,您将通过一个简单的购物社交应用示例,学习如何使用常用的基础组件和容器组件。本示例主要包含:“登录”、“首页”、“我的”三个页面。

GitHub指北 2570

Lumerical官方案例、FDTD时域有限差分法仿真学习(十三)——多模干涉耦合器(MMI)

计算通过 1×2 端口多模干涉 (MMI) 耦合器的宽带传输和光损耗。 使用设备 S 参数在 INTERCONNECT 中创建 MMI 的紧凑模型。 它还展示了如何使用 CML 编译器提取这些参数以生成紧凑模型。 一、概述 了解模拟工作流程和关键结果 低损耗光合路器和分路器是基于 Mach-Zehnder 的光调制器的基本组件,并且是集成电路的关键组成部分。通过在输入/输出波导处使用线性锥形确保输入/输出波导的模式与干涉区域之间的

weixin_45719141的博客 1万+

鸿蒙开发学习笔记 -黑马

鸿蒙开发学习

weixin_54313757的博客 4729

Obsidian免费同步全攻略:手把手教你用OneDrive+Remotely Save插件跨设备同步笔记

本文提供了一份详细的Obsidian免费同步方案指南,核心是利用OneDrive云存储与Remotely Save插件实现跨设备笔记同步。文章手把手教学,涵盖插件安装、OneDrive授权配置、桌面端与移动端的同步设置,并解答了常见问题,帮助用户在不依赖官方付费服务的情况下,构建稳定、自主的免费同步工作流。

bash7scripter的博客 849

【Telephony】Telephony总纲!Phone进程流程(AOSP)

整个Framework层的Telephony框架运行在一个叫做Phone(com.android.phone)的进程中。 Phone进程启动的过程中,会初始化非常多的分支功能,SIM卡流程初始化就是其中之一,所以我觉得有必要写一下Phone进程的框架

weixin_44513784的博客 1975

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(三)

一、Image 图片显示组件,有三种设置图片来源的方式:(1)来源于网络,需要申请网络访问权限(可查看文档如何配置申请此权限,下文有具体方法)(2)PixelMap格式,如果仅用来显示图片,没必要用这种方式(3)Resource格式,加载本地图片,有两种设置目录的方式:a.Image(

youyoufenglai的博客 1544

OpenCv案例(七): 基于OpenCvSharp计算图像的清晰度(自动对焦)

自动对焦,其实是对相机成像的清晰值得计算,若对焦不清晰,成像的清晰度低,视觉效果模糊。若是在工业检测行业,对焦不准确,可能会造成严重后果;对焦准确的图像,其清晰度高,对比度鲜明,层次明显。

qq_37835727的博客 7113

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(四)

鸿蒙学起来!HarmonyOS4+NEXT星河版入门到企业级实战教程

youyoufenglai的博客 962

802.1x之EAP-TLS测试方法

CA证书一般是由权威的认证机构发出,用来验证该机构签名的证书,持有CA证书的设备可以验证对端的证书是否由自己信任的机构颁发的。在我们内部使用证书时,我没可以自己充当CA认证机构,管理私钥和CA证书,使用他们签名服务器、客户端证书。2、使用证书请求文件server_csr.pem、CA私钥、CA公钥生成服务器证书(正常情况下自己不拥有CA私钥,是把证书请求文件发给认证机构,由认证机构返回证书)进行802.1x EAP-TLS认证时需要IPC、服务器分别存储CA证书、设备证书、私钥,通过交换证书实现身份验证。

写作是为了更好的思考 2163

GEE案例教程:融合Sentinel-1 SAR数据、Sentinel-2光学影像和WorldPop人口数据,构建完整的洪水监测与影响评估工作流

本文介绍了一个专为巴基斯坦哈扎拉分区设计的洪水监测系统,该系统整合了Sentinel-1 SAR数据、Sentinel-2光学影像和WorldPop人口数据等多源遥感数据。系统通过VV极化SAR数据的水体提取算法(阈值-13dB)实现洪水范围监测,结合10米分辨率的光学影像进行可视化验证,并利用100米分辨率人口数据评估受灾人口。系统提供完整的技术实现,包括研究区加载、遥感数据处理、日期选择界面和洪水变化检测等功能模块,为灾害应急响应提供科学依据。

此星光明博客 191

黑马视频HarmonyOS零基础

本文章是根据黑马程序员鸿蒙 HarmonyOS NEXT星河版零基础入门到实战00-鸿蒙开发环境准备_哔哩哔哩_bilibili记录HarmonyOS的基础。该视频真的非常适合有点了解前端的小伙伴学习,里面有很多最基础的东西。有的小伙伴看这个视频就非常的容易理解,直接看以下的笔记,认真过一遍就可以了。以下是我的练习仓库:HarmonyOS-learn: 对HarmonyOS的基础学习记录 (gitee.com)后续将持续更新该视频的笔记。

qq_59598977的博客 1790

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

开发鸿蒙项目黑马健康APP系列项目

今天,我主要致力于开发程序的欢迎界面。在这个环节中,我重点研究并实践了以下几个关键的设计元素:首先是ArkUI组件中的行容器(Row)和列容器(Column),它们是构建界面布局的基础;其次是图片的嵌入,这涉及到选择合适的图像资源并将其恰当地放置在界面中;最后是对页面布局细节的精细打磨,确保整体视二、运行效果及主要设计思路的介绍觉效果和用户体验的一致性和协调性。首先来向大家展示一下我所做的欢迎页面的最终效果图吧!

m0_73672734的博客 951

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

黑马程序员HarmonyOS4+NEXT星河版入门到企业级实战教程笔记【0~17】

HarmonyOS NEXT是纯血鸿蒙,鸿蒙原生应用,彻底摆脱安卓本课程是基于harmony os4的,与next仅部分api有区别。

sylviiiiiia的博客 1070

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(五)

鸿蒙学起来!HarmonyOS4+NEXT星河版入门到企业级实战教程

youyoufenglai的博客 496

【成长纪实】三个月的鸿蒙成长之路:大学生从0开始的鸿蒙心得与体会

在大一暑假偶然接触鸿蒙后,通过黑马程序员教程系统学习,并记录学习过程于优快云。随后参加了河南省首届开源鸿蒙大赛,凭借静态页面药品管理APP获得三等奖。大三时重新学习鸿蒙6.0.0,并准备参加第二届比赛开发宠物智能助手。文章介绍了基础页面结构、ArkUI框架的跨设备适配等优势,并附有学习资源和时间表,为初学者提供了参考路径。

欢迎大家一起讨论交流 2143

鸿蒙非原创--DevEco Studio开发的黑马云音乐App

本项目基于鸿蒙系统ArkUI框架开发,使用ArkTs语言和Node.js数据库,构建了一个功能完整的音乐应用。主要页面包括推荐页和音乐播放页,采用现代化UI设计,实现了丰富的交互效果。推荐页采用垂直滚动布局,包含搜索栏、轮播图、每日推荐和歌单模块,使用声明式UI编程和状态管理技术。音乐播放页模拟唱片机效果,实现唱片旋转动画、播放控制等功能,整合社交互动和播放列表管理。项目运用了多种UI组件、动画技术、状态管理和音频播放功能,为用户提供沉浸式的音乐体验。

编程乐学的博客 2168

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(十三)

HarmonyOS4学习笔记,鸿蒙学起来~

youyoufenglai的博客 1432

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(十)

《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记

youyoufenglai的博客 1144

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(六)

鸿蒙学起来!HarmonyOS4+NEXT星河版入门到企业级实战教程

youyoufenglai的博客 696

基于鸿蒙5.0开发“黑马云音乐”项目全程实录02

基于HarmonyOS 5.0开发的“黑马云音乐”项目全程实录

xiaoyuyuxixi2022的博客 651
下一篇: 2023黑马程序员鸿蒙课程-状态管理-任务统计案例
魏凯文2000
博客等级 码龄5年 8粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值