HarmonyOS Next应用开发——抽屉布局SideBarContainer

诗林  金牌会员 | 2024-11-22 01:23:08 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 516|帖子 516|积分 1548

【高心星出品】
抽屉布局SideBarContainer

提供侧边栏可以显示和隐蔽的侧边栏容器,通过子组件界说侧边栏和内容区,第一个子组件表现侧边栏,第二个子组件表现内容区。
并且侧边栏可以出现在左侧也可以出现在右侧,侧边栏可以并列跟内容区一起展示,也可以浮动在内容区展示。

常用属性

  1. showSideBar(value: boolean)
复制代码
设置是否显示侧边栏。注意:必须利用$$装饰,否则无效。
  1. showControlButton(value: boolean)
复制代码
设置是否显示控制按钮。
  1. controlButton(value: ButtonStyle)
复制代码
设置控制按钮样式。
  1. sideBarWidth(value: number)
复制代码
设置侧边栏宽度,默认240vp。
  1. SideBarContainer( type?: SideBarContainerType )
复制代码
名称描述Embed侧边栏嵌入到组件内,和内容区并列显示。组件尺寸小于minContentWidth + minSideBarWidth,并且未设置showSideBar时,侧边栏主动隐蔽。未设置minSideBarWidth或者minContentWidth接纳未设置接口的默认值进行计算。组件在主动隐蔽后,如果通过点击控制按钮唤出侧边栏,则侧边栏悬浮在内容区上显示。Overlay侧边栏浮在内容区上面。AUTO10+组件尺寸大于等于minSideBarWidth+minContentWidth时,接纳Embed模式显示。组件尺寸小于minSideBarWidth+minContentWidth时,接纳Overlay模式显示。未设置minSideBarWidth或minContentWidth时,会利用未设置接口的默认值进行计算,若计算的值小于600vp,则利用600vp做为模式切换的断点值。 开发步调:

构建侧边栏:
  1. Column() { //侧边栏内容区默认宽度240vp
  2.   ForEach(this.datas, (item: Data, index: number) => {
  3.     ListItem() {
  4.       Text(item.txt)
  5.         .fontSize(24)
  6.         .fontWeight(FontWeight.Bold)
  7.         .textAlign(TextAlign.Center)
  8.         .border({ width: 2, style: BorderStyle.Dotted })
  9.         .width('100%')
  10.         .padding(20)
  11.         .onClick(() => { //点击列表项
  12.           this.ckitem = index //更新点击下标 进而重新渲染内容区背景颜色
  13.           animateTo({curve:curves.springMotion()},()=>{this.isshowing = false}) //动画关闭侧边栏
  14.         })
  15.     }
  16.   }, (item: Data) => JSON.stringify(item))
  17. }.width('100%')
  18. .height('100%')
  19. .backgroundColor(Color.Gray)
  20. .borderRadius(10)
复制代码
构建内容区:
  1. Column() { //内容区
  2.    Text(this.datas[this.ckitem].txt).fontSize(30).fontWeight(FontWeight.Bold)
  3. }.width('100%')
  4. .height('100%')
  5. .backgroundColor(this.datas[this.ckitem].color)
  6. .justifyContent(FlexAlign.Center)
  7. .onTouch((event) => { //监听手指右边滑动和点击事件
  8.   if (event.type == TouchType.Move) {
  9.     this.movex = event.touches[0].x
  10.     if ((this.movex - this.downx) > 50) { //产生了右侧滑动 打开抽屉
  11.       animateTo({curve:curves.springMotion()},()=>{this.isshowing = true})
  12.     }
  13.   } else if (event.type == TouchType.Down) {
  14.     this.downx = event.touches[0].x
  15.     // 点击内容区就会关闭抽屉
  16.     animateTo({curve:curves.springMotion()},()=>{this.isshowing = false})
  17.   }
  18. })
复制代码
注意: 我们通过切换控制变量来控制侧边栏是否显示,为了显示出抽屉效果,我们给变量的变化都参加了动画。并且组件默认不支持手指滑动显示或关闭侧边栏,所以我们给内容区参加了手指右侧滑动的监听来自界说效果。
完整的代码:

  1. import { curves } from '@kit.ArkUI';
  2. interface Data {
  3.   color: Color
  4.   txt: string
  5. }
  6. @Entry
  7. @Component
  8. struct SlideBarContainerPage {
  9.   // 侧边栏数据源
  10.   @State datas: Data[] = []
  11.   // 点击item
  12.   @State ckitem: number = 0
  13.   // 侧边栏显示控制器
  14.   @State isshowing: boolean = false
  15.   // 手指按下x坐标
  16.   private downx: number = 0
  17.   // 手指移动x坐标
  18.   private movex: number = 0
  19.   aboutToAppear(): void {
  20.     this.datas = [//数据源
  21.       {
  22.         txt: '白色',
  23.         color: Color.White
  24.       },
  25.       {
  26.         txt: '黑色',
  27.         color: Color.Black
  28.       },
  29.       {
  30.         txt: '红色',
  31.         color: Color.Red
  32.       },
  33.       {
  34.         txt: '绿色',
  35.         color: Color.Green
  36.       },
  37.       {
  38.         txt: '蓝色',
  39.         color: Color.Blue
  40.       },
  41.     ]
  42.   }
  43.   build() {
  44.     SideBarContainer(SideBarContainerType.Overlay) {
  45.       Column() { //侧边栏内容区默认宽度240vp
  46.         ForEach(this.datas, (item: Data, index: number) => {
  47.           ListItem() {
  48.             Text(item.txt)
  49.               .fontSize(24)
  50.               .fontWeight(FontWeight.Bold)
  51.               .textAlign(TextAlign.Center)
  52.               .border({ width: 2, style: BorderStyle.Dotted })
  53.               .width('100%')
  54.               .padding(20)
  55.               .onClick(() => { //点击列表项
  56.                 this.ckitem = index //更新点击下标 进而重新渲染内容区背景颜色
  57.                 animateTo({curve:curves.springMotion()},()=>{this.isshowing = false}) //动画关闭侧边栏
  58.               })
  59.           }
  60.         }, (item: Data) => JSON.stringify(item))
  61.       }.width('100%')
  62.       .height('100%')
  63.       .backgroundColor(Color.Gray)
  64.       .borderRadius(10)
  65.       Column() { //内容区
  66.          Text(this.datas[this.ckitem].txt).fontSize(30).fontWeight(FontWeight.Bold)
  67.       }.width('100%')
  68.       .height('100%')
  69.       .backgroundColor(this.datas[this.ckitem].color)
  70.       .justifyContent(FlexAlign.Center)
  71.       .onTouch((event) => { //监听手指右边滑动和点击事件
  72.         if (event.type == TouchType.Move) {
  73.           this.movex = event.touches[0].x
  74.           if ((this.movex - this.downx) > 50) { //产生了右侧滑动 打开抽屉
  75.             animateTo({curve:curves.springMotion()},()=>{this.isshowing = true})
  76.           }
  77.         } else if (event.type == TouchType.Down) {
  78.           this.downx = event.touches[0].x
  79.           // 点击内容区就会关闭抽屉
  80.           animateTo({curve:curves.springMotion()},()=>{this.isshowing = false})
  81.         }
  82.       })
  83.     }
  84.     .height('100%')
  85.     .width('100%')
  86.     .showSideBar($$this.isshowing) //双向绑定 控制抽屉的开和关
  87.   }
  88. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

诗林

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表