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

news/发布时间2024/5/14 4:51:24

前言

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))

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

如若内容造成侵权/违法违规/事实不符,请联系编程老四网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

Java Web(七)__Tomcat(二)

Tomcat工作模式 Tomcat作为Servlet容器,有以下三种工作模式。 1)独立的Servlet容器,由Java虚拟机进程来运行 Tomcat作为独立的Web服务器来单独运行,Servlet容器组件作为Web服务器中的一部分而存在。这是Tomcat的默认工作模式。…

一些可以参考的文档集合16

之前的文章集合: 一些可以参考文章集合1_xuejianxinokok的博客-CSDN博客 一些可以参考文章集合2_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合3_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合4_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合5…

.NET指定图片地址下载并转换Base64字符串

需求描述 需要调用第三方图片上传接口上传图片,对方图片格式只能接收Base64字符串。所以我们需要将系统服务器的图片通过Url下载下来,然后转换成Base64字符串。接下来我们将使用HttpClient类库下载图片并将其转换为Base64格式的字符串。 代码示例 /// &…

Kafka快速实战以及基本原理详解

Kafka快速实战以及基本原理详解 基本概念 Kafka是一个分布式、支持分区、多副本,基于ZK的分布式消息系统,最大的特性就是可以实时的处理大量数据以满足各种需求场景,比如Hadoop的批处理系统、低延迟的实时系统、Storm/Spark流式处理引擎、日…

计算机网络-网络互联与互联网(一)

1.常用网络互联设备: 1层物理层:中继器、集线器2层链路层:网桥、交换机3层网络层:路由器、三层交换机4层以上高层:网关 2.网络互联设备: 中继器Repeater、集线器Hub(又叫多端口中继器&#xf…

harbor(docker仓库)仓库部署 - 高可用

harbor(docker仓库)仓库部署 - 高可用 1. harbor高可用1.1 方案说明1. 双主复制2. 多harbor实例共享后端存储 1.2 部署高可用(多harbor实例共享后端存储)1. 服务器划分2. 安装harbor(先部署一套Harbor,用于…

Windows 远程控制 Mac 电脑怎么操作

要从 Windows 远程控制 Mac 电脑,您可以使用内置 macOS 功能或第三方软件解决方案。以下是一些方法: 一、使用内置 macOS 功能(屏幕共享) 1、在 macOS 上启用屏幕共享 转至系统偏好设置 > 共享;选中“屏幕共享”…

通俗易懂分析:Vite和Webpack的区别

1、对项目构建的理解 先从浏览器出发, 浏览器是由浏览器内核和JS引擎组成;浏览器内核编译解析html代码和css代码,js引擎编译解析JavaScript代码;所以从本质上,浏览器只能识别运行JavaScript、CSS、HTML代码。 而我们在…

Redis篇之Redis持久化的实现

持久化即把数据保存到可以永久保存的存储设备当中(磁盘)。因为Redis是基于内存存储数据的,一旦redis实例当即数据将会全部丢失,所以需要有某些机制将内存中的数据持久化到磁盘以备发生宕机时能够进行恢复,这一过程就称…

LabVIEW储氢材料循环寿命测试系统

LabVIEW储氢材料循环寿命测试系统 随着氢能技术的发展,固态储氢技术因其高密度和安全性成为研究热点。储氢材料的循环寿命是衡量其工程应用的关键。然而,传统的循环寿命测试设备存在成本高、测试效率低、数据处理复杂等问题。设计了一种基于LabVIEW软件…

【03】逆序数组

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 一、逆序函数是什么? 二、逆序函数原码 1.直接逆序 2.创建临时数组逆序 三、结言 💥一、逆序函数是什么? 示例:输入1 4 …

JVM运行时数据区域

一、jvm的位置 从上边这幅图当中我们可以看的很清楚操作系统之所以能够让硬件运行起来,是因为各种硬件的驱动实现了操作系统的接口,操作系统调用这些接口就能管理硬件。操作系统还向程序员提供了一层接口,叫做系统呼叫层,程序员可…

Java实现房屋出售出租系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 房屋销售模块2.2 房屋出租模块2.3 预定意向模块2.4 交易订单模块 三、系统展示四、核心代码4.1 查询房屋求租单4.2 查询卖家的房屋求购单4.3 出租意向预定4.4 出租单支付4.5 查询买家房屋销售交易单 五、免责说明 一、摘…

mac拼图软件有哪些?推荐5款拼图软件

mac拼图软件有哪些?在数字图像处理中,拼图软件扮演着至关重要的角色。对于Mac用户来说,选择一款功能强大、操作简便的拼图软件是提升工作效率和创作体验的关键。本文将为你介绍五款优秀的Mac拼图软件,帮助你轻松完成图片拼接、制作…

CyberDAO:web3时代的引领者

Web3.0正在改写着世界运行的规则,AGI将为人类未来的生产效率、工作方式与目标带来改变,区块链经过十余年发展开启了去中心化新格局,带来生产关系的变革。人类正在从过往以时间换取收入、听命完成工作,转变为以个性化、自主追求人生…

基于SSH打通隧道实现异地组网

前言 最近有异地组网的需求,我目前的是用蒲公英X1盒子来进行组网,但是蒲公英X1非会员账号有设备限制3个(这个是硬伤),虽然说可以打通P2P但是在复杂的网络环境下概率不是特别高 所以研究下SSH异地组网的方式&#xff…

JWT学习笔记

了解 JWT Token 释义及使用 | Authing 文档 JSON Web Token Introduction - jwt.io JSON Web Token (JWT,RFC 7519 (opens new window)),是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准((RFC 7519)。该 token 被设计为紧凑…

Hive JDBC

Hive远程模式搭建好之后&#xff0c;可以使用Beeline客户端或JDBC远程访问Hive了 启动HiveServer2服务 $ hive --service hiveserver2 & 新建Java Maven项目&#xff0c;在pom.xml中添加以下依赖 <dependencies><dependency><groupId>jdk.tools</g…

Linux---进程间通信(下)

1、System V 共享内存 原理如下图 系统调用接口介绍 int shmget(key_t key, size_t size, int shmflg) 功能&#xff1a;用来创建共享内存 参数 key&#xff1a;这个共享内存段名字&#xff0c;内核用key来标识共享内存size&#xff1a;共享内存大小shmflg&#xff1a;由九个权…

iMazing3终极iPhone数据设备管理软件

iMazing是一款功能丰富的iOS设备管理软件&#xff0c;具备多种实用功能&#xff0c;以下是它的主要功能的详细介绍&#xff1a; iMazing3Mac-最新绿色安装包下载如下&#xff1a; https://wm.makeding.com/iclk/?zoneid49816 iMazing3Win-最新绿色安装包下载如下&#xff1…
推荐文章