当前位置:   article > 正文

鸿蒙自定义DrawerLayout侧滑菜单实现原理_鸿蒙 drawer 侧边栏实现

鸿蒙 drawer 侧边栏实现

前言

DevEcoStudio版本:

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

实现原理

1、Library创建

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

2、DrawerLayout原理分析

  1. import { DrawerController } from './DrawerController'
  2. /**
  3. * 自定义抽屉布局
  4. */
  5. @Component
  6. export struct DrawerLayout {
  7. @State offsetX: number = 0
  8. //缩放比例
  9. @State scaleX: number = 1
  10. //是否显示侧边栏
  11. @Link isShowSideBar: boolean
  12. //侧边栏的宽度
  13. private sideBarWidth: number = 300
  14. // 按下的x坐标
  15. private downX = 0
  16. @BuilderParam
  17. leftView: () => void
  18. @BuilderParam
  19. rightView: () => void
  20. //控制器
  21. @Link controller: DrawerController;
  22. aboutToAppear() {
  23. if (this.isShowSideBar) {
  24. this.offsetX = this.sideBarWidth
  25. this.scaleX = 0.8
  26. } else {
  27. this.offsetX = 0
  28. this.scaleX = 1
  29. }
  30. this.controller.showSideBar = () => {
  31. this.showSideBar();
  32. };
  33. this.controller.hideSideBar = () => {
  34. this.hideSideBar();
  35. };
  36. }
  37. build() {
  38. Row() {
  39. Stack() {
  40. this.leftView()
  41. }
  42. .backgroundColor(Color.White)
  43. .width(this.sideBarWidth)
  44. .height('100%')
  45. .offset({ x: this.offsetX - this.sideBarWidth, y: 0 })
  46. Stack() {
  47. this.rightView()
  48. }
  49. .backgroundColor(Color.White)
  50. .width(`${this.scaleX * 100}%`)
  51. .height(`${this.scaleX * 100}%`)
  52. .margin({ left: (1 - this.scaleX) * 180 })
  53. .offset({ x: this.offsetX - this.sideBarWidth, y: 0 })
  54. .onClick(() => {
  55. this.controller.hideSideBar()
  56. })
  57. }
  58. // .onTouch((event) => this.touchEvent(event)) //留的手指滑动的口子,大家根据下面原理自己实现
  59. .backgroundColor('#CCCCCCCC')
  60. .width('100%')
  61. .height('100%')
  62. }
  63. /**
  64. * 显示侧边栏
  65. */
  66. private showSideBar() {
  67. animateTo({ duration: 300 }, () => {
  68. this.offsetX = this.sideBarWidth
  69. this.scaleX = 0.8
  70. this.isShowSideBar = true
  71. })
  72. }
  73. /**
  74. * 隐藏侧边栏
  75. */
  76. private hideSideBar() {
  77. animateTo({ duration: 300 }, () => {
  78. this.offsetX = 0
  79. this.scaleX = 1
  80. this.isShowSideBar = false
  81. })
  82. }
  83. }
DrawerController类:
  1. /**
  2. * 抽屉布局控制器
  3. */
  4. export class DrawerController {
  5. showSideBar: () => void;
  6. hideSideBar: () => void;
  7. }

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。

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

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

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

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

思考:

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/279388?site
推荐阅读
相关标签
  

闽ICP备14008679号