HarmonyOS 开发-多模态页面转场动效实现案例

介绍

本示例介绍多模态页面转场动效实现:通过半模态转场实现半模态登录界面,通过配置NavDestinationMode类型为DIALOG,实现半模态的背景为透明,再与全屏模态和组件转场结合实现多模态组合登录场景,其中手机验证码登录与账号密码登录都为组件,通过TransitionEffect.asymmetric()和TransitionEffect.move()实现组件间转场达到近似页面转场的效果。

效果图预览

使用说明

登录方式有两种,验证码登录和账号密码登录

  1. 点击主页"多模态页面转场动效实现案例",跳转半模态登录页面。
  2. 在半模态窗口中选中同意协议键,并点击获取验证码按钮,跳转至手机验证码登录页面。
  3. 通过点击手机验证码登录页面中的"账号密码登录",向右切换跳转至账号密码登录页面。
  4. 通过点击账号密码登录页面中的"手机验证码登录",向左切换跳转至手机验证码登录页面。

实现思路

场景:半模态转场至验证码登录,验证码登录和账户登录可以相互切换

登录方式有两种,验证码登录和账户,需要在一个全屏模态窗口CaptureLogin中切换,使用if进行条件渲染。

1、通过配置NavDestinationMode类型为 DIALOG ,实现半模态的背景为透明的效果。

typescript 复制代码
import { RouterInfo } from '@ohos/dynamicsRouter/Index';
pageMap(name: string, param: ESObject) {
  NavDestination() {}
  // 按需将NavDestinationMode配置为DIALOG类型,此时背景默认透明
  .mode(name === RouterInfo.MULTI_MODAL_TRANSITION.moduleName + "/" + RouterInfo.MULTI_MODAL_TRANSITION.pageName ?
  NavDestinationMode.DIALOG : NavDestinationMode.STANDARD)
}

2、通过bindSheet属性为主页无样式的Text绑定半模态页面,再通过bindContentCover属性为主页无样式的Text绑定全屏模态页面。

typescript 复制代码
Text()
  /**
   * TODO: 知识点: 通过bindSheet属性为组件绑定半模态页面,由于半模态必须绑定组件,
   * 此处绑定无样式的Text组件作为开屏半模态展示。
   * isPresent:是否显示半模态页面
   */
  .bindSheet($$this.isPresent, this.halfModalLogin(), { // Text绑定半模态转场
    height: this.sheetHeight, // 半模态高度
    dragBar: this.showDragBar, // 是否显示控制条
    backgroundColor: $r('app.color.btn_bgc'),
    showClose: true, // 是否显示关闭图标
    shouldDismiss: ((sheetDismiss: SheetDismiss) => { // 半模态页面交互式关闭回调函数
      sheetDismiss.dismiss();
      this.pageStack.pop();
    })
})

Text()
  /**
   * TODO: 知识点: 通过bindContentCover属性为组件绑定全屏模态页面,由于全屏模态必须绑定组件,
   * 此处绑定无样式的Text组件作为手机验证码组件和账号密码组件的全屏模态展示。
   * isPresentInLoginView:是否显示全屏模态页面
   */
  .bindContentCover($$this.isPresentInLoginView, this.defaultLogin())

3、在半模态页面中的验证码登录按钮点击时打开全屏模态转场,并将对应的组件入场动效置为空,此时进场只保留全屏模态入场动效。

typescript 复制代码
@Builder
halfModalLogin() { // 半模态窗口页面
  Button("验证码登录")
    .onClick(() => {
      if (this.isConfirmed) { // 判断是否同意协议
        // 半模态页面中跳转全屏模态登录页
        this.isPresentInLoginView = true;
        // 用于标识转场类型,从半模态跳转至手机验证码组件时为false,从账号密码组件跳转至手机验证码组件时为true
        this.isShowTransition = false;
      }
    })
}

4、通过点击第二步中的按钮跳转到全屏模态组件(CaptureLogin),并通过isDefaultLogin控制两种登录组件的条件渲染:true(手机验证码登录),false(二维码登录),同时通过TransitionEffect.asymmetric()和TransitionEffect.move()实现组件间转场,

从而实现组件转场类似页面转场的效果。

typescript 复制代码
// 1.1、定义验证码登录页的转场效果1:用于定义半模态转场到此组件的进场动效和组件间后续切换的转场动效,进场时无动效,转场时从左边推出,
private effect1: TransitionEffect =
  TransitionEffect.asymmetric(
    TransitionEffect.IDENTITY,
    TransitionEffect.move(TransitionEdge.START).animation({ duration: EFFECT_DURATION, curve: Curve.Linear }))
// 1.2、定义验证码登录页的转场效果2:用于后面组件切换到此组件时转场的动效,从左边推出。
private effect3: TransitionEffect =
  TransitionEffect
    .move(TransitionEdge.START).animation({ duration: EFFECT_DURATION, curve: Curve.Linear })
        
build() {
  Stack({ alignContent: Alignment.TopStart }) {
    if (this.isDefaultLogin) {
      CaptchaLogin() // 手机验证码登录
        /* 验证码登录组件绑定转场
         * TODO: 知识点: 当isShowTransition为false,此时从半模态进入手机验证码组件:此时关闭组件进场动效,开启全模态进场动效,
         * 当isShowTransition为true,此时从账号密码组件返回此组件:打开组件进场动效,此时左滑进入手机验证码组件。
         */
        .transition(this.isShowTransition ? this.effect3 : this.effect1)
    } else {
      AccountLogin() // 账号密码登录
        .transition(TransitionEffect.move(TransitionEdge.END).animation({
          duration: EffectDuration,
          curve: Curve.Linear
        })) // 从右边推出
    }
  }
}

工程结构&模块类型

复制代码
multimodaltransition                            // har类型
|---src/main/ets/view
|   |---HalfModalWindow.ets                     // 视图层-主页
|---src/main/ets/model
|   |---AccountLogin.ets                        // 模型层-账号密码登录页 
|   |---CaptchaLogin.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://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题

2.性能优化方向

3.架构方向

4.鸿蒙开发系统底层方向

5.鸿蒙音视频开发方向

6.鸿蒙车载开发方向

7.鸿蒙南向开发方向

相关推荐
虎头金猫3 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
youyin3 天前
HarmonyOS ArkUI 组件与自定义组件零基础:从搭页面到组件化开发
华为·harmonyos
wuyk5553 天前
《WiFi 嵌入式物联网开发全套实战》| 第 16 章 ESP32 AP+STA 双模共存原理与工程坑点
网络·stm32·物联网
-梅3 天前
linux(8) 软硬链接
linux·运维·服务器
Wang's Blog3 天前
Java 项目实战: 外卖平台-文件下载与ServletOutputStream回写浏览器
服务器·项目开发
琥珀色糖3 天前
SimlpeHttp
linux·服务器
第十人i3 天前
Linux 日志管理系统:journald 配置与优化
linux·服务器
HwJack203 天前
【HarmonyOS开发小实践】ArkTS 从 TypeScript 到方舟语言的演进
华为·harmonyos
QYRdata3 天前
年均增速24.2%!机器人数据湖未来六年增长动能强劲
网络·机器人·服务发现
张星河zen3 天前
4096卡、8EFLOPS、7.2T NPO:华为昇腾960超节点详解
华为·ai训练·ai推理·超节点·npo·昇腾960·hi-one