HarmonyOS NEXT零基础入门到实战-第二部分
HarmonyOS NEXT零基础入门到实战-第二部分
Swiper 轮播组件
Swiper是一个 容器 组件,当设置了多个子组件后,可以对这些 子组件 进行轮播显示。(文字、图片...)
1、Swiper基本语法
2、Swiper常见属性
3、Swiper样式自定义
4、案例:小米有品
5、作业:手机淘宝
Swiper相关源代码:
@Entry
@Component
struct Index {
build() {
Column() {
// Swiper 包内容,设尺寸
Swiper() {
Text('1')
.backgroundColor(Color.Orange)
Text('2')
.backgroundColor(Color.Yellow)
Text('3')
.backgroundColor(Color.Brown)
}
.width('100%')
// .height(300)
.aspectRatio(2.4) // 设置和图片一致的宽高比,保证图片正常适配
// 常见属性
.loop(true) // 开启循环
.autoPlay(true) // 自动播放,默认3s
.interval(5000) // 自动轮播间隔
.vertical(false) // 横向/纵向
// 定制小圆点
// .indicator(false)
.indicator(
Indicator.dot() // 小圆点
.itemWidth(10) // 默认的宽
.itemHeight(5) // 默认的高
// .color(Color.Gray) // 默认的颜色
.selectedItemWidth(30) // 选中的宽
.selectedItemHeight(5) // 选中的高
.selectedColor(Color.White) // 选中的颜色
)
Swiper() {
Image($r('app.media.hw'))
.objectFit(ImageFit.Cover)
Image($r('app.media.pg'))
.objectFit(ImageFit.Cover)
Image($r('app.media.xm'))
.objectFit(ImageFit.Cover)
}
.width('100%')
.height(300)
.loop(true) // 开启循环
.autoPlay(true) // 自动播放,默认3s
.interval(5000) // 自动轮播间隔
}
}
}

样式&结构重用
@Extend:扩展组件(样式、事件)
比如:
@Extend(Text)
function bannerItem(bgColor: ResourceColor, msg: string) {
.fontSize(30)
.fontColor(Color.White)
.backgroundColor(bgColor)
.textAlign(TextAlign.Center)
.onClick(() => {
AlertDialog.show({
message: msg
})
})
}
Swiper() {
Text('1')
.bannerItem(Color.Orange, '轮播图 1')
Text('2')
.bannerItem(Color.Brown, '轮播图 2')
Text('3')
.bannerItem(Color.Green, '轮播图 3')
}
@Styles:抽取通用属性、事件
针对所有组件的公有属性,比如说宽高、背景色、点击事件等,@Styles不支持传参
1、全局定义(不支持this.调用)
@Styles function commonStyles() {
.width(100)
.height(100)
.onClick(() => { ... })
}
2、在组件内定义(省略function) 才能通过this访问到自己的状态 这种使用相对全局使用较多
@Styles setBg() {
.backgroundColor(Color.Red)
}
@Builder:自定义构建函数(结构、样式、事件)
// 全局 Builder
@Builder
function navItem(icon: ResourceStr, txt: string) {
Column({space: 10}) {
Image(icon)
.width('80%')
Text(txt)
}
.width('25%')
.onClick(() => {
AlertDialog.show({
message: '点了' + txt
})
})
}
@Entry
@Component
struct Index {
@State builderStr: string = '@Builder'
// 局部builder 只能定义在组件内 this.xxx
@Builder
navItem(icon: ResourceStr, txt: string) {
Column({space: 10}) {
Image(icon)
.width('80%')
Text(txt)
}
.width('25%')
.onClick(() => {
AlertDialog.show({
message: '点了' + txt + this.builderStr
})
})
}
build() {
Column() {
Row() {
navItem($r('app.media.xm'), '小米手机')
navItem($r('app.media.hw'), '华为手机')
this.navItem($r('app.media.pg'), '苹果手机')
}
}
}
}
总结
@Extend 抽取 特定组件 样式、事件 可以传递参数
@Styles 抽取 公共样式、事件 不可以传递参数
@Builder 抽取结构、样式、事件 可以传递参数
滚动容器Scroll
当子组件的布局尺寸超过Scroll的尺寸时,内容可以滚动
学习目录:
1、Scroll 的核心用法
2、Scroll 的常见属性
3、Scroll 的控制器
4、Scroll 的事件
5、案例:京东案例实战
源代码:
@Entry
@Component
struct Index {
build() {
Column() {
// 如果希望内容溢出,能够滚动
Scroll() {
Column({space: 10}) {
ForEach(Array.from({length: 10}), (item: string, index: number) => {
Text('测试文本' + (index + 1))
.width('100%')
.height(100)
.textAlign(TextAlign.Center)
.backgroundColor(Color.Orange)
.fontSize(20)
.fontColor(Color.White)
.borderRadius(20)
})
}
.padding(10)
.width('100%')
}
// .scrollable(ScrollDirection.Horizontal)
// .scrollBar(BarState.Auto)
// .scrollBarColor(Color.Blue)
// .scrollBarWidth(5)
.edgeEffect(EdgeEffect.Spring) // 滑动效果:弹簧
}
.width('100%')
.height(200)
}
}
Scroll的控制器:
核心步骤:
1、实例化 Scroller 的控制器
2、绑定给 Scroll 组件
3、控制器的方法 控制滚动, 控制器属性 获取滚动距离
Scroll 事件:
Scroll 组件提供了一些事件,让开发者可以在适当的时候添加逻辑
Scroll(){
}
.onScroll((x, y) => {
// 滚动时一直触发 可以结合 scroller的currentOffset方法 获取滚动距离
})
.onWillScroll((offset: number) => {
console.log('onWillScroll 已经滑动的距离', this.myScroller.currentOffset().yOffset + offset)
})
.onScroll((x, y) => {
console.log('onScroll 已经滑动的距离', this.myScroller.currentOffset().yOffset)
})
滚动容器Scroll - 京东案例实战
需求说明:
1、点击火箭回到顶部
2、火箭显示效果切换
2.1 默认隐藏
2.2 超过400 ---->显示,反之--->隐藏
@State yOffset : number = 0;
.onScroll((x, y) => {
yOffset = this.myScroller.currentOffset().yOffset
})
if(yOffset > 400) {
// 渲染
}
源代码:
@Entry
@Component
struct Index {
// 1、创建 Scroller 对象(实例化)
myScroller: Scroller = new Scroller()
build() {
Column() {
// 如果希望内容溢出,能够滚动
// 2、绑定给 Scroll 组件
Scroll(this.myScroller) {
Column({space: 10}) {
ForEach(Array.from({length: 10}), (item: string, index: number) => {
Text('测试文本' + (index + 1))
.width('100%')
.height(100)
.textAlign(TextAlign.Center)
.backgroundColor(Color.Orange)
.fontSize(20)
.fontColor(Color.White)
.borderRadius(20)
})
}
.padding(10)
.width('100%')
}
.width('100%')
.height(400)
// .scrollable(ScrollDirection.Horizontal)
// .scrollBar(BarState.Auto)
// .scrollBarColor(Color.Blue)
// .scrollBarWidth(5)
.edgeEffect(EdgeEffect.Spring) // 滑动效果:弹簧
.onWillScroll((offset: number) => {
console.log('onWillScroll 已经滑动的距离', this.myScroller.currentOffset().yOffset + offset)
})
.onScroll((x, y) => {
console.log('onScroll 已经滑动的距离', this.myScroller.currentOffset().yOffset)
})
Button('控制滚动条位置').margin(20)
.onClick(() => {
this.myScroller.scrollEdge(Edge.Top) // 会滚动顶部
})
Button('获取已经滚动的距离')
.onClick(() => {
const y = this.myScroller.currentOffset().yOffset
AlertDialog.show({
message: `y:${y}`
})
})
}
}
}
====
容器组件 Tabs
当页面内容较多时,可以通过Tabs组件进行 分类展示
学习目录:
1、Tabs 基本用法
2、Tabs 常见属性
3、滚动导航栏
4、自定义TabBar
5、案例: 小米有品底部Tabs
源代码:
@Entry
@Component
struct Index {
titles: string[] = [
'首页', '关注', '热门', '军事','体育',
'八卦', '数码', '财经', '美食','旅行'
]
build() {
Column() {
// 调整位置 顶部或者底部(参数)
Tabs({barPosition: BarPosition.Start}) {
ForEach(this.titles, (item: string, index) => {
TabContent() {
Text(`${item}内容`)
}
.tabBar(item)
})
}
.vertical(false) // 调整导航水平或者垂直
.scrollable(true) // 是否开启手势滑动
.animationDuration(0) // 点击滑动动画时间
.barMode(BarMode.Scrollable) // 滚动导航栏
}
}
}
自定义的TabBar
1、基础结构 2、高亮切换
源代码:
@Entry
@Component
struct Index {
// 准备状态,存储激活的索引
@State selectedIndex: number = 0;
build() {
// 调整位置 顶部或者底部(参数)
Tabs({barPosition: BarPosition.End}) {
TabContent() {
Text('购物车')
}
.tabBar(this.myBuilder(0, '购物车', $r('app.media.startIcon'), $r('app.media.xm')))
TabContent() {
Text('我的')
}
.tabBar(this.myBuilder(1, '我的', $r('app.media.startIcon'), $r('app.media.hw')))
}
// .vertical(false) // 调整导航水平或者垂直
// .scrollable(true) // 是否开启手势滑动
// .animationDuration(0) // 点击滑动动画时间
// .barMode(BarMode.Scrollable) // 滚动导航栏
.onChange((index: number) => {
this.selectedIndex = index
})
}
@Builder
myBuilder(itemIndex: number,title: string, img: ResourceStr, selectedImg: ResourceStr) {
Column() {
Image(itemIndex == this.selectedIndex ? selectedImg : img)
.width(30)
Text(title)
.fontColor(itemIndex == this.selectedIndex ? Color.Red : Color.Black)
}
}
}
案例 小米有品底部Tabs:
实现思路:
1、基础结构 2、高亮控制 3、中间特殊结构
源代码:
@Entry
@Component
struct Index {
// 准备状态,存储激活的索引
@State selectedIndex: number = 0;
build() {
// 调整位置 顶部或者底部(参数)
Tabs({barPosition: BarPosition.End}) {
TabContent() {
Text('购物车')
}
.tabBar(this.myBuilder(0, '购物车', $r('app.media.startIcon'), $r('app.media.xm')))
// 特殊形状的Tab
TabContent(){
Text('活动内容')
}
.tabBar(this.centerBuilder())
TabContent() {
Text('我的')
}
.tabBar(this.myBuilder(2, '我的', $r('app.media.startIcon'), $r('app.media.hw')))
}
// .vertical(false) // 调整导航水平或者垂直
// .scrollable(true) // 是否开启手势滑动
// .animationDuration(0) // 点击滑动动画时间
// .barMode(BarMode.Scrollable) // 滚动导航栏
.onChange((index: number) => {
this.selectedIndex = index
})
}
@Builder
myBuilder(itemIndex: number,title: string, img: ResourceStr, selectedImg: ResourceStr) {
Column() {
Image(itemIndex == this.selectedIndex ? selectedImg : img)
.width(30)
Text(title)
.fontColor(itemIndex == this.selectedIndex ? Color.Red : Color.Black)
}
}
@Builder
centerBuilder() {
Image($r('app.media.pg'))
.width(30)
.height(30)
.margin({bottom: 20})
}
}
相关文章:
HarmonyOS NEXT零基础入门到实战-第二部分
HarmonyOS NEXT零基础入门到实战-第二部分 Swiper 轮播组件 Swiper是一个 容器 组件,当设置了多个子组件后,可以对这些 子组件 进行轮播显示。(文字、图片...) 1、Swiper基本语法 2、Swiper常见属性 3、Swiper样式自定义 4、案例&…...
《小程序02:云开发之增删改查》
一、前置操作 // 一定要用这个符号包含里面的${}才会生效 wx.showToast({title: 获取数据成功:${colorLista}, })1.1:初始化介绍 **1、获取数据库引用:**在开始使用数据库 API 进行增删改查操作之前,需要先获取数据库的引用 cons…...
SQL执行流程、SQL执行计划、SQL优化
select查询语句 select查询语句中join连接是如何工作的? 1、INNER JOIN 返回两个表中的匹配行。 2、LEFT JOIN 返回左表中的所有记录以及右表中的匹配记录。 3、RIGHT JOIN 返回右表中的所有记录以及左表中的匹配记录。 4、FULL OUTER JOIN 返回左侧或右侧表中有匹…...
【前端】JavaScript入门及实战41-45
文章目录 41 嵌套的for循环42 for循环嵌套练习(1)43 for循环嵌套练习(2)44 break和continue45 质数练习补充 41 嵌套的for循环 <!DOCTYPE html> <html> <head> <title></title> <meta charset "utf-8"> <script type"…...
更加深入Mysql-04-MySQL 多表查询与事务的操作
文章目录 多表查询内连接隐式内连接显示内连接 外连接左外连接右外连接 子查询 事务事务隔离级别 多表查询 有时我们不仅需要一个表的数据,数据可能关联到俩个表或者三个表,这时我们就要进行夺标查询了。 数据准备: 创建一个部门表并且插入…...
基于最新版的flutter pointycastle: ^3.9.1的AES加密
基于最新版的flutter pointycastle: ^3.9.1的AES加密 自己添加pointycastle: ^3.9.1库config.dartaes_encrypt.dart 自己添加pointycastle: ^3.9.1库 config.dart import dart:convert; import dart:typed_data;class Config {static String password 成都推理计算科技; // …...
K8S内存资源配置
在 Kubernetes (k8s) 中,资源请求和限制用于管理容器的 CPU 和内存资源。配置 CPU 和内存资源时,使用特定的单位来表示资源的数量。 CPU 资源配置 CPU 单位:Kubernetes 中的 CPU 资源以 “核” (cores) 为单位。1 CPU 核心等于 1 vCPU/Core…...
【多任务YOLO】 A-YOLOM: You Only Look at Once for Real-Time and Generic Multi-Task
You Only Look at Once for Real-Time and Generic Multi-Task 论文链接:http://arxiv.org/abs/2310.01641 代码链接:https://github.com/JiayuanWang-JW/YOLOv8-multi-task 一、摘要 高精度、轻量级和实时响应性是实现自动驾驶的三个基本要求。本研究…...
数学建模--灰色关联分析法
目录 简介 基本原理 应用场景 优缺点 优点: 缺点: 延伸 灰色关联分析法在水质评价中的具体应用案例是什么? 如何克服灰色关联分析法在主观性强时的数据处理和改进方法? 灰色关联分析法与其他系统分析方法(如A…...
NetSuite Saved Search迁移工具
我们需要在系统间迁移Saved Search,但是采用Copy To Account或者Bundle时,会有一些Translation不能迁移,或者很多莫名其妙的Dependency,导致迁移失败。因此,我们想另辟蹊径,借助代码完成Saved Search的迁移…...
Java IO模型深入解析:BIO、NIO与AIO
Java IO模型深入解析:BIO、NIO与AIO 一. 前言 在Java编程中,IO(Input/Output)操作是不可或缺的一部分,它涉及到文件读写、网络通信等方面。Java提供了多种类和API来支持这些操作。本文将从IO的基础知识讲起ÿ…...
《从C/C++到Java入门指南》- 9.字符和字符串
字符和字符串 字符类型 Java 中一个字符保存一个Unicode字符,所以一个中文和一个英文字母都占用两个字节。 // 计算1 .. 100 public class Hello {public static void main(String[] args) {char a A;char b 中;System.out.println(a);System.out.println(b)…...
Adobe国际认证详解-视频剪辑
在数字化时代,视频剪辑已成为创意表达和视觉传播的重要手段。随着技术的不断进步,熟练掌握视频剪辑技能的专业人才需求日益增长。在这个背景下,Adobe国际认证应运而生,成为全球创意设计领域的重要标杆。 Adobe国际认证是由Adobe公…...
昇思25天学习打卡营第19天|MindNLP ChatGLM-6B StreamChat
文章目录 昇思MindSpore应用实践ChatGML-6B简介基于MindNLP的ChatGLM-6B StreamChat Reference 昇思MindSpore应用实践 本系列文章主要用于记录昇思25天学习打卡营的学习心得。 ChatGML-6B简介 ChatGLM-6B 是由清华大学和智谱AI联合研发的产品,是一个开源的、支持…...
.NET在游戏开发中有哪些成功的案例?
简述 在游戏开发的多彩世界中,技术的选择往往决定了作品的成败。.NET技术,以其跨平台的性能和强大的开发生态,逐渐成为游戏开发者的新宠。本文将带您探索那些利用.NET技术打造出的著名游戏案例,领略.NET在游戏开发中的卓越表现。 …...
搜维尔科技:我们用xsens完成了一系列高难度的运动项目并且捕获动作
我们用xsens完成了一系列高难度的运动项目并且捕获动作 搜维尔科技:我们用xsens完成了一系列高难度的运动项目并且捕获动作...
深入探讨:Node.js、Vue、SSH服务与SSH免密登录
在这篇博客中,我们将深入探讨如何在项目中使用Node.js和Vue,并配置SSH服务以及实现SSH免密登录。我们会一步步地进行讲解,并提供代码示例,确保你能轻松上手。 一、Node.js 与 Vue 的结合 1.1 Node.js 简介 Node.js 是一个基于 …...
Unity UGUI 之 Toggle
本文仅作学习笔记与交流,不作任何商业用途本文包括但不限于unity官方手册,唐老狮,麦扣教程知识,引用会标记,如有不足还请斧正 1.什么是Toggle? Unity - Manual: Toggle 带复选框的开关,可…...
Git报错:error: fsmonitor--daemon failed to start处理方法
问题描述 git用了很久了,但是后面突然发现执行命令时,后面都会出现这个报错,虽然该报错好像不会影响正常的命令逻辑,但是还是感觉有天烦人,就去找了找资料。 $ git status error: fsmonitor--daemon failed to start…...
【项目】星辰博客介绍
目录 一、项目背景 二、项目功能 1. 登录功能: 2. 列表页面: 3. 详情页面: 4. 写博客: 三、技术实现 四、功能页面展示 1. 用户登录 2. 博客列表页 3. 博客编辑更新页 4.博客发表页 5. 博客详情页 五.系统亮点 1.强…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
【深尚想】TPS54618CQRTERQ1汽车级同步降压转换器电源芯片全面解析
1. 元器件定义与技术特点 TPS54618CQRTERQ1 是德州仪器(TI)推出的一款 汽车级同步降压转换器(DC-DC开关稳压器),属于高性能电源管理芯片。核心特性包括: 输入电压范围:2.95V–6V,输…...
LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考
目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候,显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...
Netty自定义协议解析
目录 自定义协议设计 实现消息解码器 实现消息编码器 自定义消息对象 配置ChannelPipeline Netty提供了强大的编解码器抽象基类,这些基类能够帮助开发者快速实现自定义协议的解析。 自定义协议设计 在实现自定义协议解析之前,需要明确协议的具体格式。例如,一个简单的…...
项目进度管理软件是什么?项目进度管理软件有哪些核心功能?
无论是建筑施工、软件开发,还是市场营销活动,项目往往涉及多个团队、大量资源和严格的时间表。如果没有一个系统化的工具来跟踪和管理这些元素,项目很容易陷入混乱,导致进度延误、成本超支,甚至失败。 项目进度管理软…...
