鸿蒙开发应用中侧边栏容器SideBarContainer组件与瀑布流 WaterFlow组件及Math对象

566 阅读2分钟

一. 侧边栏容器SideBarContainer

SideBarContainer提供侧边栏可以显示和隐藏的侧边栏容器,通过子组件定义侧边栏和内容区,第一个子组件表示侧边栏,第二个子组件表示内容区域。

动画5.gif

1. 参数:

参数名参数类型必填参数描述
typeSideBarContainerType设置侧边栏的显示类型。默认值:SideBarContainerType.Embed
showSideBarboolean设置是否显示侧边栏。true:显示侧边栏false:不显示侧边栏默认值:true。

2. 属性:

如果默认的外观无法满足需求,可以通过 属性 进行定制:

名称参数类型描述
showSideBarboolean设置是否显示侧边栏。true:显示侧边栏false:不显示侧边栏默认值:true从API version 10开始,该属性支持$$双向绑定变量。
showControlButtonboolean设置是否显示控制按钮。true:显示控制按钮false:不显示控制按钮默认值:true
sideBarWidthnumber , Length设置侧边栏的宽度。默认值:240vp单位:vp
sideBarPositionSideBarPosition设置侧边栏显示位置。默认值:SideBarPosition.Start
minSideBarWidthnumber ,Length9+设置侧边栏最小宽度。默认值:240vp单位:vp
maxSideBarWidthnumber , Length9+设置侧边栏最大宽度。默认值:280vp单位:vp
...更多属性参考文档

3. 写法:

写法:SideBarContainer(){侧边栏内容组件(里面内容布局自定义即可),内容组件(里面内容布局自定义即可)}

3.1 基本代码及实现效果:
@Entry
@Component
struct Index {

  build() {
    Column(){
      SideBarContainer(){
        // 侧边栏区域内容
        Column(){

        }
        .height('100%')
        .width(240)
        .backgroundColor(Color.Pink)
        // 内容
        Column(){}
        .backgroundColor(Color.Yellow)
      }
    }
    .width('100%')
    .height('100%')
    .backgroundColor('rgba(0,0,0,0.3)')
  }
}

实现效果:

动画.gif

注意:
  • 子组件类型:系统组件和自定义组件
  • 子组件个数:必须且仅包含2个子组件,第一个位置的组件作为侧边栏的内容,第二个位置的组件是内容
  • 子组件个数异常时:3个或以上子组件,显示第一个和第二个。1个子组件显示侧边栏,内容区为空白。

以下是属性代码测试时整理的数据:


.showSideBar($$this.status) // true,false 默认隐藏

.showControlButton(true) // true:显示控制按钮(默认) false:不显示控制按钮

.sideBarWidth(350) // 设置侧边栏的宽度,默认值:240vp,超出minSideBarWidth和maxSideBarWidth设定的范围后该值无效

.sideBarPosition(SideBarPosition.End) //设置侧边栏显示位置。 默认值:SideBarPosition.Start

.minSideBarWidth(100) // 设置侧边栏最小宽度 默认值:240vp

.maxSideBarWidth(300) // 设置侧边栏最大宽度 默认值:280vp
3.2 实践小案例:

要求:

  • 基于属性,实现如下效果:
  1. 关闭控制按钮
  2. 通过自定义的按钮控制显示隐藏
  3. 侧边栏位置在右侧
  4. 侧边栏宽度 100%
  5. 拖动关闭之后,可以再次开启

效果图:

动画3.gif

实现效果代码:

@Entry
@Component
struct Index {
  //   定义状态变量,默认不展示侧边栏
  @State isShow:boolean=false
  build() {
    Column(){
      // 容器组件
      // SideBarContainerType.Overlay 侧边栏 会盖住
      // SideBarContainerType.Embed 侧边栏 挤压内容
      SideBarContainer(SideBarContainerType.Overlay){
        // 侧边栏区域内容
        Column(){
          Text('侧边栏内容显示')
          Button('关闭')
            .onClick(()=>{
              this.isShow=false
            })
        }
        .height('100%')
        .width('100%')
        .backgroundColor(Color.Pink)
        .borderRadius(20)
        // 内容
        Column(){
          Text('整体内容显示区域')
          Button('打开')
            .onClick(()=>{
              this.isShow=true
            })
        }
        .backgroundColor(Color.Yellow)
      }
      // 侧边栏是否展示
      .showSideBar($$this.isShow)
      // 将侧边栏放在右侧,默认是左侧
      .sideBarPosition(SideBarPosition.End)
      // 关闭侧边栏自带控制按钮
      .showControlButton(false)
      //点击事件,提示框出现isShow的值
      .onChange((stat)=>{
      //页面弹出提示框
        AlertDialog.show({  
          message:stat+''
        })
      })
    }
    .width('100%')
    .height('100%')
    .backgroundColor('rgba(0,0,0,0.3)')
  }
}
3.3 实践案例拓展:

以上代码只能实现侧边栏的打开与关闭,并不能实现第一张动图所展示的侧边栏打开时出现的动画效果,要想实现效果只需在点击事件中加显式动画animateTo即可

核心代码段:

// 侧边栏区域内容
Column(){
  Text('侧边栏内容显示')
  Button('关闭')
    .onClick(()=>{
      animateTo({},()=>{
        this.isShow=false
      })
    })
}
.height('100%')
.width('100%')
.backgroundColor(Color.Pink)
.borderRadius(20)
// 内容
Column(){
  Text('整体内容显示区域')
  Button('打开')
    .onClick(()=>{
      animateTo({},()=>{
        this.isShow=true
      })

    })
}
.backgroundColor(Color.Yellow)

二. 瀑布流 WaterFlow

瀑布流容器,由“行”和“列”分割的单元格所组成,通过容器自身的排列规则,将不同大小的“项目”自上而下,如瀑布般紧密布局,比如:

动画2.gif

1. 参数:

参数名参数类型必填参数描述
footerCustomBuilder设置WaterFlow尾部组件。
scrollerScroller可滚动组件的控制器,与可滚动组件绑定。**说明:**不允许和其他滚动类组件,如:ListGridScroll等绑定同一个滚动控制对象。

2. 属性:

名称参数类型描述
columnsTemplatestring设置当前瀑布流组件布局列的数量,不设置时默认1列。例如, '1fr 1fr 2fr' 是将父组件分3列,将父组件允许的宽分为4等份,第一列占1份,第二列占1份,第三列占2份。默认值:'1fr'
rowsTemplatestring设置当前瀑布流组件布局行的数量,不设置时默认1行。例如, '1fr 1fr 2fr'是将父组件分三行,将父组件允许的高分为4等份,第一行占1份,第二行占一份,第三行占2份。需要配合如下一起使用:.layoutDirection(FlexDirection.Row) // 设置滚动方向为水平.rowsTemplate('1fr 1fr')
columnsGapLength设置列与列的间距。默认值:0
rowsGapLength设置行与行的间距。默认值:0
enableScrollInteractionboolean设置是否支持滚动手势,当设置为false时,无法通过手指或者鼠标滚动,但不影响控制器的滚动接口。默认值:true
scrollBarBarState设置滚动条状态。默认值:BarState.Off**说明:**滚动条位置和长度以已布局过的总高度和当前偏移为准,在瀑布流布局全部子节点之前随着滑动持续变化。
edgeEffectvalue:EdgeEffect,options?:EdgeEffectOptions11+设置边缘滑动效果。- value:设置瀑布流组件的边缘滑动效果,支持弹簧效果和阴影效果。默认值:EdgeEffect.None- options:设置组件内容大小小于组件自身时,是否开启滑动效果。默认值:false

从属性上不难发现瀑布流 WaterFlow与网格布局 Grid/GridItem的属性如出一辙,只是他们的使用场景不同。

瀑布流最核心的用法:实现竖直方向的瀑布流(默认)

3. 写法:

写法:WaterFlow({参数}) { FlowItem() {//子组件} FlowItem() {//子组件} } .属性()

3.1 实践小案例:

要求:

  • 基于属性,实现如下效果:
  1. 等宽两列瀑布流
  2. 每一项高度随机,颜色随机,宽度 100%
  3. 瀑布流底部显示

动画4.gif

代码显示:

@Entry
@Component
struct Index {
  /*
   * WaterFlow(){}组件:
   * 子组件FlowItem(){}
   *
   * 属性:
   * 1.第一组是在WaterFlow({属性名:属性值,....})
   * 2.第二组是在WaterFlow(){}.属性名....
   * */

  // 自定义随机高度
  gao() {
    // Math.floor(Math.random()*200)+100  取100——300的值
    let heighnew: number = Math.floor(Math.random() * 200+100)
    return heighnew
  }
  // 颜色随机
  colo(){
    let r:number=Math.floor(Math.random()*256)
    let g:number=Math.floor(Math.random()*256)
    let b:number=Math.floor(Math.random()*256)
    let rgbas:String=`rgba(${r},${g},${b},0.6)`
    return rgbas
  }

  // footer自定义函数 :瀑布流底部函数定义
  @Builder footerbuilder(){
    Image($r('app.media.ic_jd_tab'))
      .height(this.gao())
      .layoutWeight(1)
  }

  sc=new Scroller()
  // 生成一个数组,没有任何值
  list: string[] = Array.from({ length: 60 })
  build() {
    Column(){
      WaterFlow({
        // 在底部设置组件内容,引用自定义的底部构建函数
        footer:this.footerbuilder(),
        scroller:this.sc
      }){
        ForEach(this.list,(flow:string)=>{
          FlowItem(){}
          .width('100%')
          .height(this.gao())
          .backgroundColor(`${this.colo()}`)
        })

      }
      .columnsTemplate('1fr 1fr')
      .columnsGap(5)
      .rowsGap(5)
      .edgeEffect(EdgeEffect.Fade)
      // 禁用鼠标和滑动
      // .enableScrollInteraction(false)
    }
    .width('100%')
    .height('100%')
    .backgroundColor('rgba(0,0,0,0.3)')
  }
}

写到这里可能会不清楚随机高度和随机颜色怎么来的,下面就来个Math对象的补充:

三. Math对象

Math 是一个内置对象,它拥有一些数学常数属性和数学函数方法, Math 用于 Number 类型数据的处理。

Math对象方法

image.png

  • Math代码测试
// 1. 随机数
console.log('Math对象', Math.random())  // 0-1 之间的随机小数

// 2. 向上取整
console.log('Math对象', Math.ceil(1.1))  // 结果: 2
console.log('Math对象', Math.ceil(1.9))  // 结果:2

// 3. 向下取整
console.log('Math对象', Math.floor(1.1))  //结果: 1
console.log('Math对象', Math.floor(1.9))  // 结果:1
  • 求0--10之间的随机整数
// 0-10 之间的随机数
console.log('Math对象', Math.random() * 11)

// 0-10 之间的随机 整数
console.log('Math对象', Math.floor(Math.random() * 11))

// 4-12 之间的随机 整数
// Math.floor(Math.random() * (插值 + 1) + 最小值)
console.log('Math对象', Math.floor(Math.random() * 9 + 4))