鸿蒙开发5.0【基于Swiper的页面布局】

news2024/9/20 14:45:24

场景一:Swiper页面支持自定义动画

方案:

  1. 给Swiper组件设置.nextMargin(50).prevMargin(50)属性。

  2. 给Swiper组件添加onChange事件,设置当前this.currentIndex=index,当currentIndex为首页或者尾页时,设置上一张以及下一张图片的缩放值。

    核心代码:

    
    .onChange((index) => {
    
    console.info('changeIndex' + index)
    
    this.currentIndex = index
    
    // 设置当前index缩放值为最大值
    
    this.scaleArray[this.currentIndex] = MAX_SCALE;
    
    if (this.currentIndex == 0) {
    
    // 当前index=0时,设置上一张图片的缩放值
    
    this.scaleArray[this.scaleArray.length - 1] = MIN_SCALE
    
    } else
    
    // 当前index不为0时,设置上一张图片的缩放值
    
    {
    
    this.scaleArray[this.currentIndex -1] = MIN_SCALE
    
    }
    
    
    
    if (this.currentIndex == this.scaleArray.length - 1) {
    
    // 当index为最后一张图片时,设置下一张图片的缩放值
    
    this.scaleArray[0] = MIN_SCALE
    
    } else
    
    // 当index不为最后一张时,设置上一张图片的缩放值
    
    {
    
    this.scaleArray[this.currentIndex + 1] = MIN_SCALE
    
    }
    
    })
    
  3. 设置Swiper组件的.displayMode(SwiperDisplayMode.STRETCH)使其Swiper滑动一页的宽度为Swiper组件自身的宽度,如果displayMode属性为SwiperDisplayMode.AUTO_LINEAR时,customContentTransition接口不生效。

  4. 给Swiper添加customContentTransition(transition: SwiperContentAnimatedTransition)事件,设置页面移除视窗时超时1000ms下渲染树,然后对视窗内所有页面逐帧回调transition。想要实现显示在视窗内正中间的Index为正常状态,两边的index图片为缩小状态。通过事件回调的proxy获取下面数据,通过滑动的距离来计算滑动过程中图片的缩放值。

    
    .customContentTransition({
    
    // 页面移除视窗时超时1000ms下渲染树
    
    timeout: 1000,
    
    // 对视窗内所有页面逐帧回调transition,在回调中修改opacity、scale、translate、zIndex等属性值,实现自定义动画
    
    transition: (proxy: SwiperContentTransitionProxy) => {
    
    if (this.startSwiperOffset == 0) {
    
    this.startSwiperOffset = proxy.position * proxy.mainAxisLength;
    
    console.info('startSwiperOffset:' + this.startSwiperOffset)
    
    }
    
    console.info('proxy-selectedIndex:' + proxy.selectedIndex + '--index:' + proxy.index +
    
    '--position:' + proxy.position + '--mainAxisLength:' + proxy.mainAxisLength)
    
    let offset: number = proxy.position * proxy.mainAxisLength // 移动距离
    
    let currentScale: number = this.scaleArray[proxy.index] //当前index缩放值
    
    
    
    let nextIndex = (proxy.index == this.scaleArray.length - 2 ? 0 : proxy.index + 1) //计算下一个index
    
    let preIndex = (proxy.index == 0 ? this.scaleArray.length - 2 : proxy.index - 1) //计算上一个index
    
    
    
    let nextScale: number = this.scaleArray[nextIndex] //下一个index缩放值
    
    let preScale: number = this.scaleArray[preIndex] //上一个index缩放值
    
    // 通过滑动的距离来计算滑动过程中图片的缩放值
    
    let distance = Math.abs(offset)
    
    currentScale = MAX_SCALE - Math.min(distance / DRAGGING_MAX_DISTANCE, MAX_SCALE - MIN_SCALE) //当前缩放值
    
    if (this.startSwiperOffset > offset) {
    
    nextScale = MIN_SCALE + Math.min(distance / DRAGGING_MAX_DISTANCE, MAX_SCALE - MIN_SCALE)
    
    preScale = MIN_SCALE
    
    } else {
    
    preScale = MIN_SCALE + Math.min(distance / DRAGGING_MAX_DISTANCE, MAX_SCALE - MIN_SCALE)
    
    nextScale = MIN_SCALE
    
    }
    
    this.scaleArray[this.currentIndex] = currentScale //当前index缩放值
    
    this.scaleArray[nextIndex] = nextScale //下一个index缩放值
    
    this.scaleArray[preIndex] = preScale //上一个index缩放值
    
    }
    
    })
    

场景二:Swiper指示器距离底部位置

方案:

此方案只适用于指示点距离底部的位置

将Swiper分成两个部分上部分为Swiper内容区,下部分为一块空白区域, 空白区域专门放置指示器点。可以通过indicator 属性去设置指示器点的部分样式。


@Entry

@Component

struct SwiperPageTwo {

@State message: string = 'Hello World';

private bannerInfo: number[] = [1, 2, 3, 4]

dataList:Color[] = [Color.Gray, Color.Yellow, Color.Blue,Color.Pink,Color.Orange]



build() {

if (this.bannerInfo && this.bannerInfo.length > 0) {

Swiper() {

ForEach(this.bannerInfo, (item: number, index: number) => {

Column() {

// 第一部分 Swiper内容区域

Column()

.width("100%")

.height(200)

.borderRadius("8vp")

.backgroundColor(this.dataList[index])

// 第二部分 指示点区域

Column() {



}.width('100%')

.height(35)

}



})

}

.cachedCount(2)

.autoPlay(true)

.interval(3000)

.vertical(false)

.loop(true)

.margin({ left: "16vp", right: "16vp" })

.indicator(

new DotIndicator()

.bottom(5)

.itemWidth("8vp")

.itemHeight("8vp")

.selectedItemWidth("10vp")

.selectedItemHeight("10vp")

.color(Color.Green)

.selectedColor(Color.Orange)

)

}

}

}

场景三:Swiper自定义指示器

目前Swiper自带的指示器位置限定比较固定,不能完全靠底部、左边或者右边以及不能调整指示器中间间距,因此可以考虑自定义指示器,将指示器位置定位到我们所需的地方。

方案:

给Swiper自带指示器设置.indicator(false),然后在Swiper组件下面写一个自定义的指示器。


// 自定义指示器,可以通过定位

Row() {

ForEach(this.data, (item: string, index: number) => {

Column()

.width(this.currentIndex === index ? 10 : 5)

.height(5)// 设置指示点中间间距

.margin(5)

.borderRadius(5)

.backgroundColor(Color.Green)

.backgroundColor(this.currentIndex === index ? Color.Red : Color.Gray)

}, (item: string) => item)

}

//设置指示点距离Swiper上下的距离

.margin({ top: 5 })



// 设置指示点在Swiper的左边或者右边或者其他地方

// .position({x:0,y:300})

以上就是本篇文章所带来的鸿蒙开发中一小部分技术讲解;想要学习完整的鸿蒙全栈技术。可以在结尾找我可全部拿到!
下面是鸿蒙的完整学习路线,展示如下:
1

除此之外,根据这个学习鸿蒙全栈学习路线,也附带一整套完整的学习【文档+视频】,内容包含如下

内容包含了:(ArkTS、ArkUI、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、鸿蒙南向开发、鸿蒙项目实战)等技术知识点。帮助大家在学习鸿蒙路上快速成长!

鸿蒙【北向应用开发+南向系统层开发】文档

鸿蒙【基础+实战项目】视频

鸿蒙面经

2

为了避免大家在学习过程中产生更多的时间成本,对比我把以上内容全部放在了↓↓↓想要的可以自拿喔!谢谢大家观看!
3

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

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

相关文章

“喂饭级”教程!建筑AI生成设计Stable Diffusion看这篇就够了!

前言 你最近是否看过这样的“魔法案例”,由一张简单的SU体块图片,快速生成多个设计方案,就像这样: ©绘图空间 而看过之后,你是否也在心里想着——“教练!我要学这个!” 今天我们就将带你…

YOLOv7输出层之间的热力图

我们经常看到一些论文里绘制了不同的热力图,来直观的感受其模型的有效性。特别是使用了注意力模块的网络,热力图就可以验证注意力机制是否真正聚焦到了预期的重要特征上,以便对模型的有效性和合理性进行评估。 例如Centralized Feature Pyra…

青蛙跳台阶与汉诺塔问题

hello,各位小伙伴们上次我们复习了C语言小tip之函数递归,这次我们来使用函数递归来完成青蛙跳台阶和汉诺塔问题! 青蛙跳台阶问题 青蛙跳台阶问题:一只青蛙跳n阶台阶,一次可以跳1阶或者两阶,问有多少种情况…

【精选】基于Hadoop的热点事件分析的设计与实现(全网最新定制,独一无二)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

Ubuntu 24.04 LTS源码安装doccano

引言 doccano是一款面向机器学习从业者的开源数据标记工具。您可以使用 doccano 执行不同类型的标记任务,支持多种数据格式。要了解 doccano 的功能,请试用doccano 演示版。 1.软件下载 git clone https://github.com/doccano/doccano.git cd doccano …

python学习——爬虫之session请求处理cookie

import requestssessionrequests.session() url"https://passport.17k.com/ck/user/login" data{"loginName": "19139186287","password":"2001022600hzk"} ressession.post(url,datadata) print(res.text)# session通过会话…

vue-创建项目、工程

安装node.js 自己百度 安装vue-cli 在cmd 命令行窗口输入 npm install --global vue-cli,vue-cli是创建脚手架的工具 安装完成之后,输入 vue -V 查看版本号,出现版本号说明安装成功 创建vue项目 默认创建 首先创建一个test测试文件夹 然后在文件内的地址栏输入…

Kimi 化身为你的私人翻译神器

在这个全球化的时代,无论是职场上的无缝沟通、学习资料的快速获取,还是日常生活中的轻松跨语言交流,我们都渴望拥有一个强大且便捷的翻译伙伴。Kimi,正是这样一位值得信赖的翻译神器。今天,就让我们一同探索如何高效地…

使用nvitop来监控 NVIDIA GPU 的使用情况

1.安装nvitop: pip install nvitop2.运行 nvitop: nvitop显示如下: 显示信息含义 1. 顶部信息栏 当前时间:显示当前的系统时间(Sat Aug 31 16:33:03 2024)。提示信息:提示可以按 h 键获取帮助或按 q 键…

论文4解析(复现):带有初速度的S形路径轨迹规划方法

论文:带有初速度的S形路径轨迹规划方法,史伟民 论文介绍了一种带有初速度的情况下进行轨迹规划的方法。 总得来说,是可以实现在运动过程中重新进行轨迹规划。 指数加减速:..... 直线型加减速:..... S形加减速&…

中仕公考:公务员考试缺考有影响吗?

公务员考试缺考的影响根据考试阶段的不同又所区别,中仕为大家介绍一下: 笔试阶段的缺考后果: 在公务员考试中,若考生未能按时参加笔试,将自动视为放弃该次考试机会。此行为不会对考生的个人信用产生任何负面效应&…

2024最新软件测试面试题(含答案解析+文档)

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、软件测试基础面试题 1、阐述软件生命周期都有哪些阶段? 常见的软件生命周期模型有哪些? 软件生命周期是指一个计算机软件从功能确定设计,到…

软件测试面试八股文(答案解析+文档)

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、软件测试基础面试题 1、阐述软件生命周期都有哪些阶段? 常见的软件生命周期模型有哪些? 软件生命周期是指一个计算机软件从功能确定设计,到…

LlamaIndex 工作流

LlamaIndex 内部提供了一个简单的工作流引擎,为什么要有工作流引擎?做过 OA 的同学都了解工作流引擎,工作流的优势在于模块化开发,把业务节点进行抽象,流程于业务逻辑分离,方便进行业务节点组装&#xff0c…

还在为低效工作烦恼?Kimi使用指南,让你的效率飞跃提升

在这个信息爆炸的时代,效率成为了我们追求的重要目标。今天,我要为大家介绍一个能够显著提升工作效率的智能助手——Kimi。Kimi不仅能够理解复杂的指令,还能处理多种文件格式,甚至还能进行网页内容解析。这篇文章将带你一文看懂Ki…

如何打开终端?

终端也叫黑窗口,命令行,可以用代码命令的方式控制计算机,如何打开呢? 输入WinR 在左下角输入cmd 点击确定 出现这个界面证明打开

住宅物业满意度计算方式中满意率和满意度指数的区别

满意率和满意度指数是用于计算住宅物业满意度的两种不同方式,它们的区别如下: 1、满意率:满意率是通过计算满意的居民人数与总参与调查的居民人数之间的比例来衡量满意度。它以百分比形式表示,可以直观地了解居民对物业管理的整体…

关于lua调用DLL的c/c++动态库(相关搜索:数据库)

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…

8个Python编程进阶常用技巧!

介绍 Python 炫酷功能(例如,变量解包,偏函数,枚举可迭代对象等)的文章层出不穷。但是还有很多 Python 的编程小技巧鲜被提及。因此,本文会试着介绍一些其它文章没有提到的小技巧,这些小技巧也是…

《黑神话:悟空》:30%抽成真相

《黑神话:悟空》自建服务器出售?揭秘游戏界的30%抽成真相! 近年来,随着游戏行业的迅猛发展,游戏开发商与发行平台之间的利益分配问题逐渐成为业界关注的焦点。其中,《黑神话:悟空》作为一款备受…