HarmonyOS NEXT应用开发—翻页动效案例

news2024/12/26 14:29:41

介绍

翻页动效是应用开发中常见的动效场景,常见的有书籍翻页,日历翻页等。本例将介绍如何通过ArkUI提供的显示动画接口animateTo实现翻页的效果。

效果图预览

使用说明

  1. 本例通过setInterval函数每秒调用一次翻页动画,实现连续翻页效果。

实现思路

如图,左右两侧分别代表打开书籍的左右两面,上下两层用Stack组件堆叠放置。在上下两层,左右两侧,建立4个文本组件(下面用A、B、C、D代称)。当B沿旋转轴旋转180度覆盖在A上时,就体现为翻页效果。C用来占位,不需要做动作。一个翻页动作的完成包括以下几步:

  1. B沿旋转轴旋转180度。这里B的旋转是动画效果。
  2. B旋转时,D会在右侧显示出来,作为书籍的下一页,此时D承载的内容要变为下一页的内容。
  3. B旋转到左侧后,A承载的内容变为B的内容。
  4. 由于A和B互为镜像,所以A显示为B的内容后,需要以A的纵向中线为轴旋转180度。这里A的旋转是设置旋转角度值,是瞬时刷新反向显示的效果,不是动画。
  5. B重新旋转到右边(即B重置回右侧位置),其承载的内容变为下一页的内容。
  6. 连续重复上述动作即可实现连续翻页动效。

开发步骤:

  1. 创建文本组件。动效中用到了4个文本组件,可以定义一个文本组件BookPage,然后对其进行重复调用。创建时为其添加rotate属性,用来控制组件旋转。由于各组件旋转的角度和旋转中心不同,需要父组件在调用时传入对应的参数,所以为对应变量添加@Prop装饰器,用来控制变量传递。源码参考PageTurningAnimation.ets。
@Component
struct BookPage {
  // 为变量添加@Prop装饰器,用于接收父组件的动态传参
  @Prop pageNum: number; // 页面编号
  @Prop rotateAngle: number; // 旋转角度
  @Prop positionX: string; // 旋转中心点参数x,表示水平方向上旋转起始位置
  @Prop positionY: string; // 旋转中心点参数y,表示垂直方向上旋转起始位置

  build() {
    // TODO: 知识点: 创建文本组件。创建时添加rotate属性,用来控制组件旋转。
    Text(`${this.pageNum}`)
      .fontSize($r('app.integer.common_font_size'))
      .fontColor(Color.White)
      .fontWeight(FontWeight.Bold)
      .textAlign(TextAlign.Center)
      .backgroundColor($r('app.color.common_color_dark_blue'))
      .width($r('app.string.common_text_width'))
      .height($r('app.string.common_text_height'))
      .borderRadius($r('app.integer.common_border_radius'))
      .rotate({ // 使用rotate属性控制旋转
        x: 0,
        y: 1, // 指定y轴作为旋转轴
        z: 0,
        angle: this.rotateAngle,
        centerX: this.positionX,
        centerY: this.positionY,
      })
  }
}
  1. 创建父组件框架。由于文本组件分为上下两层,所以在父组件中采用Stack组件进行层叠布局。同时使用Divider组件作为书籍两个页面间的分隔线。源码参考PageTurningAnimation.ets。
...
Stack() {
  // 下层Row
  Row() {
    // Text组件C,用于占位不显示,在Text组件A的下层
    BookPage({
      pageNum: this.pageNumTextC,
      rotateAngle: this.originalAngle,
      positionX: this.leftX,
      positionY: this.leftY
    })
    // Text组件D,用于刷新下一个翻页的页面编号
    BookPage({
      pageNum: this.nextPageNumTextD,
      rotateAngle: this.originalAngle,
      positionX: this.leftX,
      positionY: this.leftY
    })
  }

  // 上层Row
  Row() {
    // Text组件A的页面编号,用于刷新翻页动画结束时的页面编号
    BookPage({
      pageNum: this.pageNumTextA,
      rotateAngle: this.rotateAngleTextA,
      positionX: this.centerX,
      positionY: this.centerY
    })
    // Text组件B的页面编号,用于显示翻页动画的页面编号
    BookPage({
      pageNum: this.animatePageNumTextB,
      rotateAngle: this.rotateAngleTextB,
      positionX: this.leftX,
      positionY: this.leftY
    })
  }

  // 添加两个页面间的分隔线
  Divider().strokeWidth(5).color(Color.White).height($r('app.string.divider_height')).vertical(true)
}
...
  1. 添加翻页动效。在父组件中定义对应的变量,并在调用子组件时分别传入子组件。自定义pageTurningAnimate函数,在其中使用animateTo方法添加动画效果,同时控制动画的时长,以及动画过程中各元素状态的改变。在aboutToAppear方法中,使用setInterval方法重复调用pageTurningAnimate函数,以实现连续翻页动效。源码参考PageTurningAnimation.ets。
...
// 在UI显示前,传入各项变量的具体值
aboutToAppear(): void {
  // 通过setInterval函数每秒调用一次动画效果,实现连续翻页
  setInterval(() => {
    this.pageTurningAnimate();
  }, 1000) // 函数调用周期要大于每次动画持续的时长
}

// 通过animateTo方法为组件添加动效,动效时长要小于setInterval函数调用周期
private pageTurningAnimate() {
  // TODO: 知识点: 使用animateTo方法添加动画效果,同时控制动画的时长,以及动画过程中各元素状态的改变。
  animateTo(
    { duration: 700, onFinish: () => {
      // 动画结束时,Text组件A显示的页面编号和B显示的页面编号相等
      this.pageNumTextA = this.animatePageNumTextB;
      // 动画结束时,Text组件A以中心线为轴旋转180度,用于显示左侧翻页动画结束时的页面编号
      this.rotateAngleTextA = 180;
      // 动画结束时,Text组件B的旋转角度重置为0度
      this.rotateAngleTextB = 0;
      // 动画结束时,Text组件B显示的页面编号加1
      this.animatePageNumTextB = (this.animatePageNumTextB + 1) % 8;
    } },
    () => {
      // 动画开始,Text组件B的旋转角度设置为180度
      this.rotateAngleTextB = 180;
      //动画开始,Text组件D的页面编号加1,用于刷新显示下一个翻页的页面编号
      this.nextPageNumTextD = this.animatePageNumTextB + 1;
    })
}
...

高性能知识点

不涉及

工程结构&模块类型

pageturninganimation                           // har类型
|---src\main\ets\view
|   |---PageTurningAnimation.ets               // 视图层-翻页动效页面

模块依赖

不涉及

参考资料

显式动画

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr21.cn/FV7h05

腾讯T10级高工技术,安卓全套VIP课程全网免费送:https://qr21.cn/D2k9D5

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

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

相关文章

【OpenCV】手写字符分割

OpenCV 是一个开源的计算机视觉(Computer Vision)与机器学习软件库,提供了多种图像处理算法与接口。在 OCR 技术中,字符分割用于提取图像中的文字信息,可以应用于车牌识别、身份证识别、文档扫描等场景。本文主要记录如…

基于单片机的家庭防盗报警系统

摘 要 随着社会的发展,人们生活水平的不断提高和家居用品的高档化,家庭安全隐患也随之增加,所以人们便进一步提高了对家庭的保护意识。因此,这就不得不促使安全防盗报警系统的普及与推广。 然而传统的防盗措施难以实现人们的需求…

Tomcat下载安装及纯手动发布一个应用

文章目录 javaWeb介绍一. 下载tomcat二、部署Web项目准备三. 验证tomcat配置是否成功四、安装包中各个文件的解释与用途五、纯手动部署web项目 javaWeb介绍 1、什么是JavaWeb? JavaWeb是一种使用Java语言编写的基于Web的应用程序开发技术。它是通过Java的Web开发框…

Web框架开发-Django的视图层

一、视图函数 一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是任何东西都可以。无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓…

某狗网翻译接口逆向之webpack扣取

​​​​​逆向网址 aHR0cHM6Ly9mYW55aS5zb2dvdS5jb20 逆向链接 aHR0cHM6Ly9mYW55aS5zb2dvdS5jb20vdGV4dA 逆向接口 aHR0cHM6Ly9mYW55aS5zb2dvdS5jb20vYXBpL3RyYW5zcGMvdGV4dC9yZXN1bHQ 逆向过程 请求方式:POST 参数构成: 【s】 1b921dbefaa8d939afca…

网络编程套接字(4)——Java套接字(TCP协议)

目录 一、Java流套接字通信模型 二、TCP流套接字编程 1、ServerSocket ServerSocket构造方法: ServerSocket方法: 2、Socket Socket构造方法: Socket方法: 三、代码示例:回显服务器 1、服务器代码 代码解析 2、客户端…

谁将主导未来AI市场?Claude3、Gemini、Sora与GPT-4的技术比拼

【最新增加Claude3、Gemini、Sora、GPTs讲解及AI领域中的集中大模型的最新技术】 2023年随着OpenAI开发者大会的召开,最重磅更新当属GPTs,多模态API,未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义,不亚…

基于word2vec 和 fast-pytorch-kmeans 的文本聚类实现,利用GPU加速提高聚类速度

文章目录 简介GPU加速 代码实现kmeans聚类结果kmeans 绘图函数相关资料参考 简介 本文使用text2vec模型,把文本转成向量。使用text2vec提供的训练好的模型权重进行文本编码,不重新训练word2vec模型。 直接用训练好的模型权重,方便又快捷 完整…

软件无线电系列——模拟无线电、数字无线电、软件无线电

本节目录 一、模拟无线电 二、数字无线电 1、窄带数字无线电 2、宽带数字无线电 三、软件无线电本节内容 一、模拟无线电 20世纪80年代的模拟体制(美国的AMPS/欧洲的TACS)被称为第一代移动通信,简称1G,主要目标是为在大范围内有限的用户提供移动电话服务。最主要的…

uniapp遇到的问题

【uniapp】小程序中input输入框的placeholder-class不生效解决办法 解决:写在scope外面 uniapp设置底部导航 引用:https://www.jianshu.com/p/738dd51a0162 【微信小程序】moveable-view / moveable-area的使用 https://blog.csdn.net/qq_36901092/…

Figure与OpenAI 联手推出新机器人;荣耀首款「AI PC」即将发布

▶ Figure 与 OpenAI 联手推出新机器人 AI 机器人公司 Figure 发布了他们与 OpenAI 的合作成果,将 OpenAI 的大模型运用在其机器人 Figure 01 上。 据介绍,OpenAI 大模型加持的 Figure 01 机器人现在可以与人全面对话。 OpenAI 模型为机器人提供了高级…

微信小程序(五十九)使用鉴权组件时原页面js自动加载解决方法(24/3/14)

注释很详细,直接上代码 上一篇 新增内容: 1.使用覆盖函数的方法阻止原页面的自动执行方法 2.使用判断实现只有当未登录时才进行方法覆盖 源码: app.json {"pages": ["pages/index/index","pages/logs/logs"],…

mac删除带锁标识的app

一 、我们这里要删除FortiClient.app 带锁 常规方式删除不掉带锁的 app【如下图】 二、删除命令,依次执行即可。 /bin/ls -dleO /Applications/FortiClient.app sudo /usr/bin/chflags -R noschg /Applications/FortiClient.app /bin/ls -dleO /Applications/Forti…

2024计算机二级3

1. 2. 3. 4. 5. 6. append每次只能添加一个元素,两个元素都在同一个列表内相当于是一个整体 7. d.get后边括号内会存在一个默认值,如果题目给出的选项内没有已经存在的键值名,则会返回后边的默认值 8. 字典是映射数据类型,不属于…

【QT】TCP简易聊天框

我们首先复习一下TCP通信的流程 基于linuxTCP客户端和服务器 QT下的TCP处理流程 服务器先启动(处于监听状态) 各函数的意义和使用 QTcpServer Class *QTcpServer*类提供了一个基于TCP的服务器。这个类可以接受传入的TCP连接。您可以指定端口或让QTcpS…

碳储量监测的新技术:遥感在草原碳汇评估中的潜力

在全球环境问题日益严重的今天,以全球变暖为主要特征的气候变化成为了人类面临的巨大挑战。它威胁着地球的生态平衡,对全球可持续发展构成了严峻的挑战。为了应对这一挑战,各国纷纷采取行动,致力于实现碳达峰和碳中和的目标。 在…

Zabbix 监控 tomcat

zabbix-java-gateway服务组件 zabbix监控tomcat需要用到zabbix-java-gateway组件,它充当zabbix服务和java应用程序之间的网关。它允许zabbix服务器用过java网关与java应用程序进行通信,从而监控和收集java应用程序的性能数据。 zabbix-agent服务&#xf…

gradio部署视频输入输出示例,gradio网页输出视频nan,输出视频无法播放解决方法

gradio部署视频输入输出示例,gradio网页输出视频nan,输出视频无法播放 Opencv不能采用h64格式进行编码解决方案moviepy介绍浏览器接受的视频编码格式:采用h264编码合成视频: gradio部署视频输入输出示例Gradio视频组件使用详解简介…

小程序学习3 goods-card

pages/home/home home.wxml <goods-listwr-class"goods-list-container"goodsList"{{goodsList}}"bind:click"goodListClickHandle"bind:addcart"goodListAddCartHandle"/> <goods-list>是一个自定义组件&#xff0c;它具…

【MIT 6.S081】2020, 实验记录(8),Lab: locks

目录 Task 1&#xff1a;Memory allocator (moderate)</font>Task 2&#xff1a;Buffer cache (hard)</font> Task 1&#xff1a;Memory allocator (moderate) 这个任务就是练习将一把大锁拆分为多个小锁&#xff0c;同时可以更加深入地理解 memory allocator 运行…