鸿蒙自定义DrawerLayout侧滑菜单实现原理

2024-02-23 07:20

本文主要是介绍鸿蒙自定义DrawerLayout侧滑菜单实现原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

DevEcoStudio版本:

DrawerLayout如何使用:鸿蒙自定义侧滑菜单布局(DrawerLayout)-CSDN博客

实现原理

1、Library创建

新建module选择static library,命名为DrawerLibrary

2、DrawerLayout原理分析

import { DrawerController } from './DrawerController'/*** 自定义抽屉布局*/
@Component
export struct DrawerLayout {@State offsetX: number = 0//缩放比例@State scaleX: number = 1//是否显示侧边栏@Link isShowSideBar: boolean//侧边栏的宽度private sideBarWidth: number = 300// 按下的x坐标private downX = 0@BuilderParamleftView: () => void@BuilderParamrightView: () => void//控制器@Link controller: DrawerController;aboutToAppear() {if (this.isShowSideBar) {this.offsetX = this.sideBarWidththis.scaleX = 0.8} else {this.offsetX = 0this.scaleX = 1}this.controller.showSideBar = () => {this.showSideBar();};this.controller.hideSideBar = () => {this.hideSideBar();};}build() {Row() {Stack() {this.leftView()}.backgroundColor(Color.White).width(this.sideBarWidth).height('100%').offset({ x: this.offsetX - this.sideBarWidth, y: 0 })Stack() {this.rightView()}.backgroundColor(Color.White).width(`${this.scaleX * 100}%`).height(`${this.scaleX * 100}%`).margin({ left: (1 - this.scaleX) * 180 }).offset({ x: this.offsetX - this.sideBarWidth, y: 0 }).onClick(() => {this.controller.hideSideBar()})}// .onTouch((event) => this.touchEvent(event)) //留的手指滑动的口子,大家根据下面原理自己实现.backgroundColor('#CCCCCCCC').width('100%').height('100%')}/*** 显示侧边栏*/private showSideBar() {animateTo({ duration: 300 }, () => {this.offsetX = this.sideBarWidththis.scaleX = 0.8this.isShowSideBar = true})}/*** 隐藏侧边栏*/private hideSideBar() {animateTo({ duration: 300 }, () => {this.offsetX = 0this.scaleX = 1this.isShowSideBar = false})}
}
DrawerController类:
/*** 抽屉布局控制器*/
export class DrawerController {showSideBar: () => void;hideSideBar: () => void;
}

a:偏移量

      通过offset({ x: this.offsetX - this.sideBarWidth, y: 0 })动态调整左右视图在x轴方向的偏移量,有两种状态:显示和隐藏侧边栏,在显示状态下通过animateTo动画将offsetX=0在300ms内改变成offsetX = sideBarWidth(侧边栏宽度),同理在隐藏状态下通过animateTo动画将offsetX =  sideBarWidth(侧边栏宽度)在300ms内改变成 offsetX = 0。

b:右侧内容缩放

      通过动态调整右侧内容的width和height值来实现缩放效果。在显示状态下通过animateTo动画将scaleX = 1在300ms内改变成scaleX = 0.8,同理在隐藏状态下通过animateTo动画将scaleX =  0.8在300ms内改变成 scaleX = 1。

.width(`${this.scaleX * 100}%`)
.height(`${this.scaleX * 100}%`)

c:右侧内容距离左侧侧边栏的距离

      通过动态调整右侧内容的的外边距左侧距离margin({ left: (1 - this.scaleX) * 180 })

通过以上的原理就能实现侧边栏效果了。

思考:

上面的实现原理没有实现通过手指滑动来控制侧边栏的隐藏和显示,通过下图的示意图分析下了手指滑动的原理,这里给大家留一个自己动手的机会,自己实现下如何通过手指控制侧边栏的显示和隐藏。
提示下:通过给最外层Row()设置触摸监听

Row(){}.onTouch((event) => this.touchEvent(event))

这篇关于鸿蒙自定义DrawerLayout侧滑菜单实现原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/737902

相关文章

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

PyCharm中配置PyQt的实现步骤

《PyCharm中配置PyQt的实现步骤》PyCharm是JetBrains推出的一款强大的PythonIDE,结合PyQt可以进行pythion高效开发桌面GUI应用程序,本文就来介绍一下PyCha... 目录1. 安装China编程PyQt1.PyQt 核心组件2. 基础 PyQt 应用程序结构3. 使用 Q

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

Python实现批量提取BLF文件时间戳

《Python实现批量提取BLF文件时间戳》BLF(BinaryLoggingFormat)作为Vector公司推出的CAN总线数据记录格式,被广泛用于存储车辆通信数据,本文将使用Python轻松提取... 目录一、为什么需要批量处理 BLF 文件二、核心代码解析:从文件遍历到数据导出1. 环境准备与依赖库

linux下shell脚本启动jar包实现过程

《linux下shell脚本启动jar包实现过程》确保APP_NAME和LOG_FILE位于目录内,首次启动前需手动创建log文件夹,否则报错,此为个人经验,供参考,欢迎支持脚本之家... 目录linux下shell脚本启动jar包样例1样例2总结linux下shell脚本启动jar包样例1#!/bin

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

Python实现PDF按页分割的技术指南

《Python实现PDF按页分割的技术指南》PDF文件处理是日常工作中的常见需求,特别是当我们需要将大型PDF文档拆分为多个部分时,下面我们就来看看如何使用Python创建一个灵活的PDF分割工具吧... 目录需求分析技术方案工具选择安装依赖完整代码实现使用说明基本用法示例命令输出示例技术亮点实际应用场景扩