Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >纯血鸿蒙APP实战开发——滑动页面信息隐藏与组件位移效果

纯血鸿蒙APP实战开发——滑动页面信息隐藏与组件位移效果

原创
作者头像
小帅聊鸿蒙
发布于 2025-01-09 05:59:44
发布于 2025-01-09 05:59:44
2750
举报
文章被收录于专栏:鸿蒙开发笔记鸿蒙开发笔记

介绍

在很多应用中,向上滑动"我的"页面,页面顶部会有如下变化效果:一部分信息逐渐隐藏,另一部分信息逐渐显示,同时一些组件会进行缩放或者位置移动。向下滑动时则相反。

效果图预览

使用说明
  1. 向上滑动页面,出现如下变化:用户名/选择身份/设置图标/客服图标逐渐隐藏,用户头像尺寸逐渐缩小并向右上平移,顶部"返回"文本后方用户名逐渐显示。
  2. 滑动到顶部后,向下滑动页面,出现如下变化:用户头像尺寸逐渐变大并向左下平移,顶部"返回"文本后方的用户名逐渐隐藏,原来的用户名/选择身份/设置图标/客服图标逐渐显示。

实现思路

本例涉及的关键特性和实现方案如下:

  1. 将屏幕从上向下分为三部分,第一部分Row组件包含"返回"和初始状态下隐藏的用户名,第二部分Row包含用户头像/用户名/选择身份/设置/客服,下方其余部分位第三部分。本例场景的变化体现在第一和第二部分。
代码语言:typescript
AI代码解释
复制
Column() {
  Row() {...}
  .padding($r('app.integer.slidetohideanddisplace_padding_small'))
  .width($r('app.string.slidetohideanddisplace_size_full'))
  .alignItems(VerticalAlign.Center)
  Row() {...}
  .height($r('app.integer.slidetohideanddisplace_height_one_hundred'))
  .width($r('app.string.slidetohideanddisplace_size_full'))
  Scroll() {...}
}
  1. 在第一和第二部分中,使用@State装饰器装饰相关的组件属性,使之与自定义组件的渲染绑定起来,状态变量改变时,UI会发生对应的渲染改变。用户头像的缩放通过改变其width和height属性值的大小来刷新,用户头像的位移通过改变其margin属性中的top和left的大小来刷新。其他一些组件的显隐变化通过改变其opacity属性值的大小来刷新。
代码语言:typescript
AI代码解释
复制
  @State userRowOpacity: number = 1;
  @State userImageHeight: number = 50;
  ...

  build() {
    Column() {
      Row() {
        ...
        Text($r('app.string.slidetohideanddisplace_phone_number'))
          .opacity(this.userNameOpacity) // userNameOpacity控制顶部用户名的透明度
        Blank()
        Text("设置")
          .opacity(this.userNameOpacity) // 设置的文字透明度与顶部用户名相同
        Text("客服")
          .opacity(this.userNameOpacity) // 客服的文字透明度与顶部用户名相同
      }

      Row() {
        Image($r('app.media.slidetohideanddisplace_batman'))
          .width(this.userImageHeight)
          .height(this.userImageHeight) // userImageHeight控制头像尺寸
          // userImageMarginTop和userImageMarginLeft控制头像在父容器内的位置
          .margin({ top: this.userImageMarginTop, left: this.userImageMarginLeft })

        Column() {...}
        .alignItems(HorizontalAlign.Start)
        .opacity(this.userRowOpacity) // 控制Row组件的透明度
      }
      ...
    }
  }
DD一下:鸿蒙开发各类文档,可关注公Z号<程序猿百晓生>霍取。
代码语言:erlang
AI代码解释
复制
1.OpenHarmony开发基础
2.OpenHarmony北向开发环境搭建
3.鸿蒙南向开发环境的搭建
4.鸿蒙生态应用开发白皮书V2.0 & V3.0
5.鸿蒙开发面试真题(含参考答案) 
6.TypeScript入门学习手册
7.OpenHarmony 经典面试题(含参考答案)
8.OpenHarmony设备开发入门【最新版】
9.沉浸式剖析OpenHarmony源代码
10.系统定制指南
11.OpenHarmonyUboot 驱动加载流程
12.OpenHarmony构建系统--GN与子系统、部件、模块详解
13.ohos开机init启动流程
14.鸿蒙版性能优化指南
.......
  1. 第三部分页面滚动通过 Scroll 组件实现,其中第二栏和第三栏相似,使用 @Builder装饰器 封装了两个自定义构建函数IconAndDescription和CustomRow,增加代码复用。
代码语言:typescript
AI代码解释
复制
  // 自定义构建函数,将重复使用的UI元素抽象成一个方法。此处样式为:上方图标下方文字
  @Builder
  IconAndDescription(icon: Resource, description: string | Resource, iconSize?: Size, radius?: number) {
    Column() {
      Image(icon)
        .size(iconSize === undefined ? { height: $r('app.integer.slidetohideanddisplace_icon_default_height'),
          width: $r('app.integer.slidetohideanddisplace_icon_default_height') } : iconSize)
        .borderRadius(radius)
      Text(description)
        .margin({ top: $r('app.integer.slidetohideanddisplace_margin_between_icon_and_description') })
    }
  }

  // 自定义构建函数。此处样式为:在Row组件中横向排列IconAndDescription
  @Builder
  CustomRow(iconsAndDescriptions: IconAndDescription[]) {
    Row() {
      ForEach(iconsAndDescriptions, (item: IconAndDescription) => {
        this.IconAndDescription(item.icon, item.description)
      })
    }
    .width($r('app.string.slidetohideanddisplace_size_full'))
    .justifyContent(FlexAlign.SpaceAround)
    .padding($r('app.integer.slidetohideanddisplace_padding_small'))
    .margin({ top: $r('app.integer.slidetohideanddisplace_margin_small') })
    .backgroundColor($r('app.color.slidetohideanddisplace_color_transparent_aa'))
    .borderRadius($r('app.integer.slidetohideanddisplace_border_radius'))
  }

高性能知识点

本例中Scroll组件绑定onScroll滚动事件回调,onScroll属于频繁回调,在回调中需要尽量减少耗时和冗余操作,例如减少不必要的日志打印。

工程结构&模块类型

代码语言:shell
AI代码解释
复制
   slidetohideanddisplace                                      // har包
   |---model
   |   |---Util.ets                         				   // 提供测试数据类     
   |---SlideToHideAndDisplace.ets                              // 滑动变化效果实现页面

写在最后

如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:

  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力;
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识;
  • 想要获取更多完整鸿蒙最新学习知识点,可关注B站:码牛课堂;

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
纯血鸿蒙APP实战开发——评论组件案例实现
评论组件在目前市面上的短视频app中是一种很常见的场景,本案例使用 全局状态保留能力弹窗 来实现评论组件。点击评论按钮弹出评论组件,点击空白处隐藏该组件,再次点击评论按钮则会恢复上一次浏览的组件状态。
小帅聊鸿蒙
2024/12/27
2260
纯血鸿蒙APP实战开发——评论组件案例实现
纯血鸿蒙APP实战开发——ArkWeb同层渲染
该方案展示了ArkWeb 同层渲染 :将系统原生组件直接渲染到前端H5页面上,原生组件不仅可以提供H5组件无法实现的一些功能,还能提升用户体验的流畅度。
小帅聊鸿蒙
2025/01/07
2170
纯血鸿蒙APP实战开发——ArkWeb同层渲染
纯血鸿蒙APP实战开发——长列表滑动到指定列表项动效实现案例
在长列表场景时,当用户在浏览过程中打断时,列表会从第一项开始重新加载,此时我们使用 scrollToIndex 跳转到某个列表项时,当开启smooth动效时,会对经过的所有item进行加载和布局计算,当大量加载item时会导致性能问题,影响用户体验。因此我们使用 currentOffset方法 获取并记录偏移量,然后使用 scrollTo方法 跳转到上次浏览记录功能,可以流畅滑动到上次列表的位置。
小帅聊鸿蒙
2025/01/16
2810
纯血鸿蒙APP实战开发——长列表滑动到指定列表项动效实现案例
纯血鸿蒙APP实战开发——投票动效实现案例
本示例介绍使用绘制组件中的Polygon组件配合使用显式动画以及borderRadius实现投票pk组件。
小帅聊鸿蒙
2025/01/14
1820
纯血鸿蒙APP实战开发——投票动效实现案例
纯血鸿蒙APP实战开发——TabContent内容可以在TabBar上显示并响应滑动事件案例
本示例实现了tabContent内容可以在tabBar上显示并且tabBar可以响应滑动事件的功能。
小帅聊鸿蒙
2025/01/08
5110
纯血鸿蒙APP实战开发——TabContent内容可以在TabBar上显示并响应滑动事件案例
纯血鸿蒙APP实战开发——下拉展开图片和时间轴效果实现案例
下拉展开图片效果:初始时顶部图片只显示中间部分,其余部分,分别隐藏在屏幕上边缘和时间轴模块下方,随着下拉,图片会逐渐展开。
小帅聊鸿蒙
2025/01/19
1630
纯血鸿蒙APP实战开发——下拉展开图片和时间轴效果实现案例
纯血鸿蒙APP实战开发——左右拖动切换图片效果案例
本示例使用滑动手势监听,实时调整左右两侧内容显示区域大小和效果。通过绑定gesture事件中的PanGesture平移手势,实时获取拖动距离。当拖动时,实时地调节左右两个Image组件的宽度,从而成功实现左右拖动切换图片效果的功能。
小帅聊鸿蒙
2025/01/03
5050
纯血鸿蒙APP实战开发——左右拖动切换图片效果案例
纯血鸿蒙APP实战开发——首页下拉进入二楼效果案例
本示例主要介绍了利用position和onTouch来实现首页下拉进入二楼、二楼上划进入首页的效果场景,利用translate和opacity实现动效的移动和缩放,并将界面沉浸式(全屏)显示。
小帅聊鸿蒙
2025/01/19
2530
纯血鸿蒙APP实战开发——首页下拉进入二楼效果案例
纯血鸿蒙APP实战开发——元素超出List区域
List组件clip属性默认为true,超出容器边缘的子组件会按照List的布局范围被裁剪。为此,可以在List组件内部添加一个占位的ListItem,以达到预期的布局效果。List占满整个窗口或者不可滚动的情况下,也可以在List外占位,同时设置List的clip属性为false达成同样的效果。
小帅聊鸿蒙
2025/01/04
1640
纯血鸿蒙APP实战开发——元素超出List区域
纯血鸿蒙APP实战开发——Navigation实现多设备适配案例
在应用开发时,一个应用需要适配多终端的设备,使用Navigation的mode属性来实现一套代码,多终端适配。
小帅聊鸿蒙
2024/12/26
5260
纯血鸿蒙APP实战开发——Navigation实现多设备适配案例
纯血鸿蒙APP实战开发——列表项交换案例
本案例通过List组件、组合手势GestureGroup、swipeAction属性以及attributeModifier属性等实现了列表项的交换和删除。
小帅聊鸿蒙
2025/01/18
2450
纯血鸿蒙APP实战开发——列表项交换案例
纯血鸿蒙APP实战开发——全屏登录页面
小帅聊鸿蒙
2024/12/30
2940
纯血鸿蒙APP实战开发——标题下拉缩放案例
本示例使用了 LazyForEach 进行数据懒加载以及 显式动画animateTo 实现文本偏移。
小帅聊鸿蒙
2025/01/15
1810
纯血鸿蒙APP实战开发——标题下拉缩放案例
纯血鸿蒙APP实战开发——Swiper高度可变化效果实现
在很多应用中,swiper组件每一个page的高度是不一致的,所以需要swiper组件下方页面的高度跟着一起变化。
小帅聊鸿蒙
2025/01/10
1910
纯血鸿蒙APP实战开发——Swiper高度可变化效果实现
纯血鸿蒙APP实战开发——阻塞事件冒泡
本示例主要介绍在点击事件中,子组件enabled属性设置为false的时候,如何解决点击子组件模块区域会触发父组件的点击事件问题;以及触摸事件中当子组件触发触摸事件的时候,父组件如果设置触摸事件的话,如何解决父组件也会被触发的问题。
小帅聊鸿蒙
2025/01/22
2460
纯血鸿蒙APP实战开发——阻塞事件冒泡
纯血鸿蒙APP实战开发——边缘渐变实现
滑动列表的图片,当一侧边缘有渐变色时表示还没有滑动到边缘,该侧仍有内容可以浏览,当滑动到边缘时,渐变色消失。
小帅聊鸿蒙
2025/02/17
1140
纯血鸿蒙APP实战开发——边缘渐变实现
纯血鸿蒙APP实战开发——跨文件样式复用和组件复用
本示例主要介绍了跨文件样式复用和组件复用的场景。在应用开发中,我们通常需要使用相同功能和样式的ArkUI组件,例如购物页面中会使用相同样式的Button按钮、Text显示文字,我们常用的方法是抽取公共样式或者封装成一个自定义组件到公共组件库中以减少冗余代码。
小帅聊鸿蒙
2025/01/06
1720
纯血鸿蒙APP实战开发——跨文件样式复用和组件复用
纯血鸿蒙APP实战开发——组件堆叠
本示例介绍运用Stack组件以构建多层次堆叠的视觉效果。通过绑定Scroll组件的onScroll滚动事件回调函数,精准捕获滚动动作的发生。当滚动时,实时地调节组件的透明度、高度等属性,从而成功实现了嵌套滚动效果、透明度动态变化以及平滑的组件切换。
小帅聊鸿蒙
2025/01/02
2650
纯血鸿蒙APP实战开发——组件堆叠
纯血鸿蒙APP实战开发——自定义安全键盘案例
金融类应用在密码输入时,一般会使用自定义安全键盘。本示例介绍如何使用TextInput组件实现自定义安全键盘场景,主要包括TextInput.customKeyboard绑定自定义键盘、自定义键盘布局和状态更新等知识点。
小帅聊鸿蒙
2025/01/05
3300
纯血鸿蒙APP实战开发——自定义安全键盘案例
纯血鸿蒙APP实战开发——自定义TabBar
本示例主要介绍了TabBar中间页面如何实现有一圈圆弧外轮廓以及TabBar页签被点击之后会改变图标显示,并有一小段动画效果。
小帅聊鸿蒙
2024/12/27
2840
纯血鸿蒙APP实战开发——自定义TabBar
推荐阅读
相关推荐
纯血鸿蒙APP实战开发——评论组件案例实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档