当前位置:首页 > 科技  > 软件

左右拖动切换图片效果案例

来源: 责编: 时间:2024-03-18 09:40:45 105观看
导读想了解更多关于开源的内容,请访问:51CTO 鸿蒙开发者社区https://ost.51cto.com介绍本示例使用滑动手势监听,实时调整左右两侧内容显示区域大小和效果。通过绑定gesture事件中的PanGesture平移手势,实时获取拖动距离。当拖

jtX28资讯网——每日最新资讯28at.com

想了解更多关于开源的内容,请访问:jtX28资讯网——每日最新资讯28at.com

51CTO 鸿蒙开发者社区jtX28资讯网——每日最新资讯28at.com

https://ost.51cto.comjtX28资讯网——每日最新资讯28at.com

介绍

本示例使用滑动手势监听,实时调整左右两侧内容显示区域大小和效果。通过绑定gesture事件中的PanGesture平移手势,实时获取拖动距离。当拖动时,实时地调节左右两个Image组件的宽度,从而成功实现左右拖动切换图片效果的功能。jtX28资讯网——每日最新资讯28at.com

效果图预览

jtX28资讯网——每日最新资讯28at.com

使用说明

点击中间按钮进行左右拖动切换图片。jtX28资讯网——每日最新资讯28at.com

实现思路

本例涉及的关键特性和实现方案如下:jtX28资讯网——每日最新资讯28at.com

创建三个Stack组件,用来展示装修前后对比图,第一个和第三个Stack分别存放装修前的图片和装修后的图片,zIndex设置为1。第二个Stack存放按钮的图片,zIndex设置为2,这样按钮的图片就会覆盖在两张装修图片之上。
源码参考DragToSwitchPicturesView.ets。jtX28资讯网——每日最新资讯28at.com

Row() {  Stack() {...}  .zIndex(CONFIGURATION.ZINDEX1)  .width(this.leftImageWidth) // z序设为1,为了使按钮图片浮在装修图片上。  Stack() {...}  .width($r('app.integer.drag_button_stack_width'))  .zIndex(CONFIGURATION.ZINDEX2) // z序设为2,为了使按钮图片浮在装修图片上。  Stack() {...}  .zIndex(CONFIGURATION.ZINDEX1) // z序设为1,为了使按钮图片浮在装修图片上。  .width(this.rightImageWidth)}.justifyContent(FlexAlign.Center).width($r('app.string.full_size'))

将Image组件放在Row容器里,将Row容器的宽度设置为状态变量,再利用clip属性对于Row容器进行裁剪。
源码参考DragToSwitchPicturesView.ets。jtX28资讯网——每日最新资讯28at.com

Row() {  Image($r('app.media.before_decoration'))    .width($r('app.integer.decoration_width'))// Image的width固定,Row的宽度变化,通过裁剪实现布局效果。    .height($r('app.integer.decoration_height'))    .draggable(false) // 设置Image不能拖动,不然长按Image会被拖动。  }  .width(this.leftImageWidth) // 将左侧Row的width设置为leftImageWidth,这样左侧Row的width随leftImageWidth的变化而变化。  .clip(true) // clip属性设置为true,裁剪超出Row宽度的图片。  .zIndex(CONFIGURATION.ZINDEX1) // z序设为1,为了使水印浮在装修图片上。  .borderRadius({    topLeft: $r('app.integer.borderradius'),    bottomLeft: $r('app.integer.borderradius')  }) // 将Row的左上角和左下角弧度设为10实现效果。

右边的Image组件与左边同样的操作,但是新增了一个direction属性,使元素从右至左进行布局,为的是让Row从左侧开始裁剪。
源码参考DragToSwitchPicturesView.ets。jtX28资讯网——每日最新资讯28at.com

Row() { Image($r('app.media.after_decoration'))   .width($r('app.integer.decoration_width'))   .height($r('app.integer.decoration_height'))   .draggable(false)}.width(this.rightImageWidth).clip(true).zIndex(CONFIGURATION.ZINDEX1) // z序设为1,为了使水印浮在装修图片上。// TODO: 知识点:左边Row使用clip时从右边开始裁剪,加了Direction.Rtl后,元素从右到左布局,右边Row使用clip时从左边开始裁剪,这是实现滑动改变视图内容大小的关键。.direction(Direction.Rtl).borderRadius({ topRight: $r('app.integer.borderradius'), bottomRight: $r('app.integer.borderradius')}) // 将Row的右上角和右下角弧度设为10实现效果。

中间的Image组件通过手势事件中的滑动手势对Image组件滑动进行监听,对左右Image组件的宽度进行计算从而重新布局渲染。
源码参考DragToSwitchPicturesView.ets。jtX28资讯网——每日最新资讯28at.com

Image($r('app.media.drag_button'))  .width($r('app.integer.drag_button_image_width'))  .height($r('app.integer.decoration_height'))  .draggable(false)  .gesture( // TODO: 知识点:拖动手势事件设置一个手指,滑动的最小距离设置为1vp,实现滑动时按钮跟手动效。    PanGesture({ fingers: CONFIGURATION.PANGESTURE_FINGERS, distance: CONFIGURATION.PANGESTURE_DISTANCE })      .onActionStart(() => {        this.dragRefOffset = CONFIGURATION.INIT_VALUE; // 每次拖动开始时将图标拖动的距离初始化。      })      // TODO: 性能知识点: 该函数是系统高频回调函数,避免在函数中进行冗余或耗时操作,例如应该减少或避免在函数打印日志,会有较大的性能损耗。      .onActionUpdate((event: GestureEvent) => {        // 通过监听GestureEvent事件,实时监听图标拖动距离        this.dragRefOffset = event.offsetX;        this.leftImageWidth = this.imageWidth + this.dragRefOffset;        this.rightImageWidth = CONFIGURATION.IMAGE_FULL_SIZE - this.leftImageWidth;        if (this.leftImageWidth >= CONFIGURATION.LEFT_IMAGE_RIGHT_LIMIT_SIZE) { // 当leftImageWidth大于等于310vp时,设置左右Image为固定值,实现停止滑动效果。          this.leftImageWidth = CONFIGURATION.LEFT_IMAGE_RIGHT_LIMIT_SIZE;          this.rightImageWidth = CONFIGURATION.RIGHT_IMAGE_RIGHT_LIMIT_SIZE;        } else if (this.leftImageWidth <= CONFIGURATION.LEFT_IMAGE_LEFT_LIMIT_SIZE) { // 当leftImageWidth小于等于30vp时,设置左右Image为固定值,实现停止滑动效果。          this.leftImageWidth = CONFIGURATION.LEFT_IMAGE_LEFT_LIMIT_SIZE;          this.rightImageWidth = CONFIGURATION.RIGHT_IMAGE_LEFT_LIMIT_SIZE;        }      })      .onActionEnd((event: GestureEvent) => {        if (this.leftImageWidth <= CONFIGURATION.LEFT_IMAGE_LEFT_LIMIT_SIZE) {          this.leftImageWidth = CONFIGURATION.LEFT_IMAGE_LEFT_LIMIT_SIZE;          this.rightImageWidth = CONFIGURATION.RIGHT_IMAGE_LEFT_LIMIT_SIZE;          this.imageWidth = CONFIGURATION.LEFT_IMAGE_LEFT_LIMIT_SIZE;        } else if (this.leftImageWidth >= CONFIGURATION.LEFT_IMAGE_RIGHT_LIMIT_SIZE) {          this.leftImageWidth = CONFIGURATION.LEFT_IMAGE_RIGHT_LIMIT_SIZE;          this.rightImageWidth = CONFIGURATION.RIGHT_IMAGE_RIGHT_LIMIT_SIZE;          this.imageWidth = CONFIGURATION.LEFT_IMAGE_RIGHT_LIMIT_SIZE;        } else {          this.leftImageWidth = this.imageWidth + this.dragRefOffset; // 滑动结束时leftImageWidth等于左边原有Width+拖动距离。          this.rightImageWidth = CONFIGURATION.IMAGE_FULL_SIZE - this.leftImageWidth; // 滑动结束时rightImageWidth等于340-leftImageWidth。          this.imageWidth = this.leftImageWidth; // 滑动结束时ImageWidth等于leftImageWidth。        }      })  )

工程结构&模块类型

dragtoswitchpictures                             // har包   |---common   |   |---Constants.ets                            // 常量类   |---data   |   |---DragToSwitchPicturesData.ets             // 生成模拟数据   |---datasource   |   |---BasicDataSource.ets                      // Basic数据控制器   |   |---DragToSwitchPicturesDataSource.ets       // 左右拖动切换图片数据控制器   |---mainpage   |   |---DragToSwitchPictures.ets                 // 主页面   |---model   |   |---DragToSwitchPicturesModule.ets           // 左右拖动切换图片数据模型   |---view   |   |---DragToSwitchPicturesView.ets             // 左右拖动切换图片视图   |   |---DesignCattleView.ets                     // AI设计视图   |   |---TabsWaterFlowView.ets                    // 瀑布流嵌套Tabs视图

模块依赖

routermodulejtX28资讯网——每日最新资讯28at.com

高性能知识点

本例使用了onActionUpdate函数。该函数是系统高频回调函数,避免在函数中进行冗余或耗时操作,例如应该减少或避免在函数打印日志,会有较大的性能损耗。jtX28资讯网——每日最新资讯28at.com

本示例使用了LazyForEach进行数据懒加载,WaterFlow布局时会根据可视区域按需创建FlowItem组件,并在FlowItem滑出可视区域外时销毁以降低内存占用。jtX28资讯网——每日最新资讯28at.com

本示例使用了cachedCount设置预加载的FlowItem的数量,只在LazyForEach中生效,设置该属性后会缓存cachedCount个FlowItem,LazyForEach超出显示和缓存范围的FlowItem会被释放。jtX28资讯网——每日最新资讯28at.com

想了解更多关于开源的内容,请访问:jtX28资讯网——每日最新资讯28at.com

51CTO 鸿蒙开发者社区jtX28资讯网——每日最新资讯28at.com

https://ost.51cto.comjtX28资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-76513-0.html左右拖动切换图片效果案例

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 实战 | 生产环境中如何动态调整线程池大小?

下一篇: 2024 年这五个 Node.js 后端框架最受欢迎!

标签:
  • 热门焦点
  • 7月安卓手机好评榜:三星S23Ultra好评率第一

    7月安卓手机好评榜:三星S23Ultra好评率第一

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年7月1日至7月31日,仅限国内市场。第一名:三星Galaxy S23 Ultra好评率:95.71%在即将迎来新
  • 7月安卓手机性能榜:红魔8S Pro再夺榜首

    7月安卓手机性能榜:红魔8S Pro再夺榜首

    7月份的手机市场风平浪静,除了红魔和努比亚带来了两款搭载骁龙8Gen2领先版处理器的新机之外,别的也想不到有什么新品了,这也正常,通常6月7月都是手机厂商修整的时间,进入8月份之
  • 三言两语说透设计模式的艺术-单例模式

    三言两语说透设计模式的艺术-单例模式

    写在前面单例模式是一种常用的软件设计模式,它所创建的对象只有一个实例,且该实例易于被外界访问。单例对象由于只有一个实例,所以它可以方便地被系统中的其他对象共享,从而减少
  • 三言两语说透柯里化和反柯里化

    三言两语说透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是两种很有用的技术,可以帮助我们写出更加优雅、泛用的函数。本文将首先介绍柯里化和反柯里化的概念、实现原理和应用
  • 一篇文章带你了解 CSS 属性选择器

    一篇文章带你了解 CSS 属性选择器

    属性选择器对带有指定属性的 HTML 元素设置样式。可以为拥有指定属性的 HTML 元素设置样式,而不仅限于 class 和 id 属性。一、了解属性选择器CSS属性选择器提供了一种简单而
  • 为什么你不应该使用Div作为可点击元素

    为什么你不应该使用Div作为可点击元素

    按钮是为任何网络应用程序提供交互性的最常见方式。但我们经常倾向于使用其他HTML元素,如 div span 等作为 clickable 元素。但通过这样做,我们错过了许多内置浏览器的功能。
  • 本地生活这块肥肉,拼多多也想吃一口

    本地生活这块肥肉,拼多多也想吃一口

    出品/壹览商业 作者/李彦编辑/木鱼拼多多也看上本地生活这块蛋糕了。近期,拼多多在App首页&ldquo;充值中心&rdquo;入口上线了本机生活界面。壹览商业发现,该界面目前主要
  • 到手价3099元起!iQOO Neo8 Pro今日首销:安卓性能最强旗舰

    到手价3099元起!iQOO Neo8 Pro今日首销:安卓性能最强旗舰

    5月23日,iQOO如期举行了新品发布会,全新的iQOO Neo8系列也正式与大家见面,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更
  • AI艺术欣赏体验会在上海梅赛德斯奔驰中心音乐俱乐部上演

    AI艺术欣赏体验会在上海梅赛德斯奔驰中心音乐俱乐部上演

    光影交错的镜像世界,虚实幻化的视觉奇观,虚拟偶像与真人共同主持,这些场景都出现在2019世界人工智能大会的舞台上。8月29日至31日,“AI艺术欣赏体验会”在上海
Top
Baidu
map