鸿蒙HarmonyOS应用 - ArkUI组件

news2025/1/16 19:58:01

ArkUI组件

基础组件

Image

声明Image组件并设置图片源

网络权限:ohos.permission.INTERNET

Image(scr: string | PixelMap | Resource)

// 1. string:用于加载网络图片,需要申请网络权限
Image("https://xxx.png")

// 2. PixelMap:像素图
Image(PixelMapObj)

// 3. Resource:加载本地图片
// $r: resouce/base/media/mate60.png
Image($r('app.media.mate60'))
// $rawfile: resouce/rawfile/mate60.png
Image($rawfile('mate60.png'))

添加图片属性

Image("https://xxx.jpg")
    .width('50%')

在模拟器运行需要申请网络权限

src/main/module.json5 中添加权限申请

"module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.INTERNET"
      }
    ],
    // ...
}

Text

声明Text组件并设置文本内容

Text(content?: string | Resource)
// string
Text("用户名")

// Resource:用于国际化i18n
Text($r('app.string.username_label'))

配置国际化,使用string.json配置标签

image-20240202194734566
// zh_CN
{
  "string": [
    // ...
    {
      "name": "ImageWidth_label",
      "value": "图片宽度"
    }
  ]
}

// en_US
{
  "string": [
    // ...
    {
      "name": "ImageWidth_label",
      "value": "Image Width"
    }
  ]
}
@Entry
@Component
struct Index {
  build() {
    // 内置组件:容器组件(Row、Column)、基础组件(Text)
    Row() {
      Column() {
        Image("https://xxx.jpg")
          .width('50%')
          .borderRadius(5)

        Text($r('app.string.ImageWidth_label'))
          .fontSize(20)
          .fontWeight(FontWeight.Bold)
      }
      .width('100%')
    }
    .height('100%')
  }
}

TextInput

声明TextInput组件

TextInput({placeholder?: Resourcestr, text?: Resourcestr})
  1. placeHoder:输入框无输入时的提示文本
  2. text:输入框当前的文本内容

属性方法和事件

TextInput({text:'当前输入文本'})
    .width(150)	//宽
    .height(30)	//高
    .backgroundColor('#FFF')	//背景色
    .type(InputType.Password)	//输入框类型
    .onChange(value => {
    	// 处理value
	})

修改图片宽度案例:

Image("https://xxx.jpg")
    .width(this.image_width)
    .borderRadius(5)

Text($r('app.string.ImageWidth_label'))
    .fontSize(20)
    .fontWeight(FontWeight.Bold)


TextInput({ placeholder: "请输入图片宽度", text: this.image_width.toFixed(0) })
    .width(150)
    .type(InputType.Number)
    .onChange(value => {
    console.log('image_width', this.image_width.toString())
    console.log('value', value)
    if (value != '') {
        this.image_width = parseInt(value)
    }
})

Button

声明Button组件,label是按钮文字

Button(label?: ResourceStr)

属性与事件

Button('缩小')
    .width(80).fontSize(20)
    .onClick(() => {
    if (this.image_width >= 10) {
        this.image_width -= 10
    }
})

Button('放大')
    .width(80).fontSize(20)
    .onClick(() => {
    if (this.image_width < 300) {
        this.image_width += 10
    }
})

Slider 滑动条

Slider({
    min: 0, // 最小值
    max: 300, // 最大值
    value: this.image_width, // 当前值
    step: 1, // 滑动步长
    style: SliderStyle.OutSet, // 样式: Outset/InSet
    direction: Axis.Horizontal, // 方向: Horizontal/Vertical
    reverse: false // 是否反向滑动
})
    .width('90%')
    .showTips(true)
    .trackThickness(6)
    .onChange(val => {
    this.image_width = val
})

布局组件

属性方法名说明参数
justifyContent设置子元素在主轴方向的对齐格式FlexAlign枚举
alignItems设置子元素在交叉轴方向的对齐格式Row使用VerticalAlign枚举
Column使用HorizontalAlign枚举

主轴方向

Column容器:

Row容器:

交叉轴方向

Column容器:

image-20240204212642772

Row容器:

盒子模型

渲染控制

ForEach

ForEach类似于Vue的v-for,keyGenerator函数类似于:key,是对象的唯一标识。在修改数据后只会去渲染修改的那部分组件,提高效率。

@Entry
@Component
struct Index {
  private names: string[] = ['wmh', 'wmh1024', 'rexhao', 'NDS.wmh']
  build() {
    Column() {
      Row() {
        Text("分数列表")
          .padding(20)
          .fontSize(40)
      }.width('100%')

      ForEach(this.names, (item) => {
        Row() {
          Image("https://xxx.jpg")
            .width(60)
            .margin({
              right: 20,
              left: 20
            })
            .borderRadius(5)
          Column() {
            Text(item)
              .fontSize(25)
            Text("Rating: 14300")
              .fontSize(15)
          }
          .alignItems(HorizontalAlign.Start)
        }
        .width('100%')
        .margin({bottom: 20})
      })
    }
  }
}
image-20240205200331872

if-else

类似于Vue中的v-if

if ( 条件 ) {
    // 内容A
} else {
    // 内容B
}

列表组件

列表(List)是一种复杂容器

特点:

  1. 列表项(ListItem)数量过多超出屏幕后,会自动提供滚动功能
  2. 列表项(ListItem)既可以纵向排列,也可以横向排列

image-20240205201822300

高度权重值,默认为0。把高度按照权重分配。

.layoutWeight(1)
@Entry
@Component
struct Index {
  private names: string[] = ['wmh', 'wmh1024', 'rexhao',
    'wmh1024', 'rexhao', 'NDS.wmh', 'wmh', 'wmh1024', 'rexhao',
    'NDS.wmh', 'wmh1024', 'rexhao', 'NDS.wmh']

  build() {
    Column() {
      Row() {
        Text("分数列表")
          .padding(20)
          .fontSize(40)
      }.width('100%')

      List() {
        ForEach(this.names, (item) => {
          ListItem() {
            Row() {
              Image("https://xxx.jpg")
                .width(60)
                .margin({
                  right: 20,
                  left: 20
                })
                .borderRadius(5)
              Column() {
                Text(item)
                  .fontSize(25)
                Text("Rating: 14300")
                  .fontSize(15)
              }
              .alignItems(HorizontalAlign.Start)
            }
            .width('100%')
            .margin({ bottom: 20 })
          }
        }
        )
      }.width('100%')
      .layoutWeight(1)
    }
  }
}

自定义组件

创建自定义组件

封装并导出组件

@Component
export struct Header {
  private title: string

  build() {
    Row() {
      Text(this.title)
        .padding(20)
        .fontSize(40)
    }.width('100%')
  }
}

使用组件

import { Header } from './Header'

Header({ title: "分数列表" })

构建函数@Builder

  • 定义在struct外部:全局自定义构建函数
  • 定义在struct内部:局部自定义构建函数(不加function、调用需要加this.

构建函数的创建

@Builder function ItemCard(item: string) {
  Row() {
    Image("https://xxx.jpg")
      .width(60)
      .margin({
        right: 20,
        left: 20
      })
      .borderRadius(5)
    Column() {
      Text(item)
        .fontSize(25)
      Text("Rating: 14300")
        .fontSize(15)
    }
    .alignItems(HorizontalAlign.Start)
  }
  .width('100%')
  .margin({ bottom: 20 })
}

构建函数的使用

List() {
    ForEach(this.names, (item: string) => {
        ListItem() {
            ItemCard(item)
        }
    })
}.width('100%').layoutWeight(1)

自定义公共样式

@Styles

自定义公共样式:封装通用样式(属性必须是公共属性

// 定义
@Styles function width_full() {
  .width('100%')
}

// 调用
.width_full()
@Extend()

@Style,用于封装特有属性

@Extend(Text) function DefaultFontSize() {
  .fontSize(15)
}

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

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

相关文章

快递物流订阅推送API接口如何对接

快递物流订阅推送API接口指的是订阅国内物流快递信息&#xff0c;当运单状态发生变化时&#xff0c;会推送到您的回调地址&#xff0c;直到这些运单号生命周期结束。简单点说就是先订阅快递单号再推送物流信息。那么快递物流订阅推送API接口该如何对接呢&#xff1f; 首先我们…

JVM学习笔记(四)类加载与字节码技术

目录 一、类文件结构 二、字节码指令 2.3 图解方法执行流程 1&#xff09;原始 java 代码 2&#xff09;编译后的字节码文件 3&#xff09;常量池载入运行时常量池 4&#xff09;方法字节码载入方法区 5&#xff09;main 线程开始运行&#xff0c;分配栈帧内存 6&…

道路检测车理想伴侣,国产高智能道路病害识别系统,可灵活兼容行车记录仪、无人机等数据源!

什么是视觉AI&#xff1f;通俗地说&#xff0c;视觉AI是机器代替人眼来做测量和判断&#xff0c;例如博雅仔为大家介绍的易模真人手办定制项目是基于公司独有的AI将拍摄到的实际影像“翻译”“制作”成数字3D模型&#xff0c;再经过3D打印固化成纪念手办送到用户朋友们的手上。…

将Python机器学习模型集成到C++ Qt客户端应用程序中|Qt调用python详解

0、前言 有几个不同的选项可以将你的Python机器学习模型集成到你的C Qt客户端应用程序中。以下是一些可能的解决方案&#xff1a; 创建API&#xff1a; 将你的机器学习模型部署为一个API服务。你可以使用像Flask这样的轻量级Web框架来创建一个简单的HTTP服务。这样&#xff0…

如何在一台服务器上同时运行搭载JDK 8, JDK 17, 和 JDK 21的项目:终极指南

&#x1f42f; 如何在一台服务器上同时运行搭载JDK 8, JDK 17, 和 JDK 21的项目&#xff1a;终极指南 &#x1f680; 摘要 在企业开发环境中&#xff0c;常常需要在同一台服务器上运行使用不同Java开发工具包&#xff08;JDK&#xff09;版本的多个项目。本文详细介绍如何在L…

华为鸿蒙应用--封装通用标题栏:CommonTitleBar(鸿蒙工具)-ArkTs

0、效果图 自定义通用标题栏 支持左、中、右常规标题栏设置&#xff1b; 支持自定义视图&#xff1b; 支持搜索功能 一、CommTitleBar代码 import router from ohos.router; import { Constants } from ../../constants/Constants; import { StyleConstants } from ../../…

JavaEE 初阶篇-深入了解 UDP 通信与 TCP 通信(综合案例:实现 TCP 通信群聊)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 UDP 通信 1.1 DatagramSocket 类 1.2 DatagramPacket 类 1.3 实现 UDP 通信&#xff08;一发一收&#xff09; 1.3.1 客户端的开发 1.3.2 服务端的开发 1.4 实现 …

FTP与SMB深度对比:文件传输协议谁更胜一筹?

在数字化时代&#xff0c;文件传输已成为日常工作中不可或缺的一部分。 FTP&#xff08;文件传输协议&#xff09;和SMB&#xff08;服务器消息块&#xff09;是两种最为常见的文件传输协议。它们各自在文件传输领域拥有独特的优势和特点&#xff0c;但同时也存在一些差异。 今…

六个月滴滴实习:轻松、舒心又高薪!

不久前&#xff0c;一位在滴滴后端研发部门实习了六个月的小伙伴在牛客网上分享了他的实习体验&#xff0c; 作者详细描述了他在滴滴的实习生活。 从他的叙述中&#xff0c;我们可以感受到与其他互联网公司相比&#xff0c;滴滴的工作环境显得相对轻松和舒适。 他提到&#x…

【汇编语言】流程转移和子程序

【汇编语言】流程转移和子程序 文章目录 【汇编语言】流程转移和子程序前言一、“转移”综述二、操作符offset三、jmp指令jmp指令——无条件转移jmp指令&#xff1a;依据位移进行转移两种段内转移远转移&#xff1a;jmp far ptr 标号转移地址在寄存器中的jmp指令转移地址在内存…

神经网络进阶

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

socket套接字在tcp客户端与tcp服务器之间的通信,以及socket中常用的高效工具epoll

1.socket&#xff08;套接字&#xff09;的概念 Socket是对TCP/IP协议的封装&#xff0c;Socket本身并不是协议&#xff0c;而是一个调用接口&#xff08;API&#xff09;&#xff0c;通过Socket&#xff0c;我们才能使用TCP/IP协议,主要利用三元组【ip地址&#xff0c;协议&am…

10G网络布线:DAC线缆与AOC光缆的选择指南

在10G网络部署中&#xff0c;选择合适的传输介质是确保网络性能和可靠性的关键。本文将全面比较10G DAC高速线缆和10G AOC有源光缆&#xff0c;帮助您做出明智的选择。 10G DAC高速线缆 VS 10G AOC有源光缆 定义与构造 10G DAC高速线缆&#xff08;Direct Attach Cable&…

配置有效的防爬虫技术保护网站

本文主要介绍了防爬虫的概念、目的以及一些有效的防爬虫手段。防爬虫是指网站采取各种技术手段阻止爬虫程序对其数据进行抓取的过程。为了保护网站的数据和内容的安全性&#xff0c;防止经济损失和恶意竞争&#xff0c;以及减轻服务器负载&#xff0c;网站需要采取防爬虫机制。…

文心一言4.0、智谱清言、MoonshotAI实测对比(上)

前言 前两天看到这张图&#xff0c;又刚好拿到了文心一言的4.0内测号&#xff0c;就想着把新版国内御三家横向对比测评一下。 文末领取免费领取AI学习基地 AI交流群 前一段时间也一直在研究复杂提示词&#xff08;结构化提示词&#xff09;向国内大模型迁移适配的问题&#…

matlab新手快速上手5(蚁群算法)

本文根据一个较为简单的蚁群算法框架详细分析蚁群算法的实现过程&#xff0c;对matlab新手友好&#xff0c;源码在文末给出。 蚁群算法简介&#xff1a; 蚁群算法是一种启发式优化算法&#xff0c;灵感来源于观察蚂蚁寻找食物的行为。在这个算法中&#xff0c;解决方案被看作是…

Fhopify:跨境电商行业迎来发展新机遇打造购物者天堂

随着全球化的推进和互联网的普及,跨境电商作为一种新型的商业模式,日益受到人们的关注和重视。它通过互联网平台,打破了地域限制,使得消费者可以便捷地购买来自世界各地的商品,同时也为企业提供了更广阔的市场和发展空间。在这样的背景下,跨境电商的新趋势和未来发展备受关注。…

ShardingSphere 5.x 系列【24】集成 Nacos 配置中心

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址:https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 前言2. ShardingSphereDriverURLProvider3. 方式一:基于 Nacos Java SDK…

初学python记录:力扣2739. 总行驶距离

题目&#xff1a; 卡车有两个油箱。给你两个整数&#xff0c;mainTank 表示主油箱中的燃料&#xff08;以升为单位&#xff09;&#xff0c;additionalTank 表示副油箱中的燃料&#xff08;以升为单位&#xff09;。 该卡车每耗费 1 升燃料都可以行驶 10 km。每当主油箱使用了…

演示在一台Windows主机上运行两个Mysql服务器(端口号3306 和 3307),安装步骤详解

目录 在一台Windows主机上运行两个Mysql服务器&#xff0c;安装步骤详解因为演示需要两个 MySQL 服务器终端&#xff0c;我只有一个 3306 端口号的 MySQL 服务器&#xff0c;所以需要再创建一个 3307 的。创建一个3307端口号的MySQL服务器1、复制 mysql 的安装目录2、修改my.in…