HarmonyOS开发5.0【导航条动态跟随效果】

在大多数软件中都会有这种场
写出一个还挺好理解的方法,遂发出来

1

这里首先说一下这个通用方法, onAreaChange

2

为我们的标签加上这个方法

.onAreaChange((oldValue: Area, newValue: Area) => {
  console.log('wssb',JSON.stringify(newValue,null,2))
})

查看输出

3
有点乱,但一眼看到几个参数

4

很显然,这是三个标签组件的坐标

5

所以我们运用这个方法获得的坐标,来让一个公用的导航条动来动去🐣🐣

标签组件

@Builder
TopTab(title: string, index: number) {
  Row() {
    Text(title)
      .fontWeight(600)
      .lineHeight(22)
      .fontColor(this.SelectedIndex == index ? '#2A2929' : '#818181')
      .onClick(() => {
        this.SelectedIndex = index
      })
      .animation({curve:Curve.Ease,duration:300})
  }
  .justifyContent(FlexAlign.Center)
  .width(50)
  .onAreaChange((a,b) => {
    console.log('wssb',JSON.stringify(b))
    this.tabx[index] = Number(b.globalPosition.x)
  })
}

自制导航栏


tabx:number[] = [0,0,0]  //提前定义

Row({ space: 36 }) {
  this.TopTab('待提货', 0)
  this.TopTab('在途', 1)
  this.TopTab('已完成', 2)

  Text()
    .width(24)
    .height(3.5)
    .borderRadius(3)
    .linearGradient({
      direction: GradientDirection.Right,
      colors: [['#e62f23', 0.1], ['#f25c4d', 0.9]]
    })
    .position({x: this.tabx[this.SelectedIndex]-30, y: 28 }) 
    .animation({curve:Curve.Ease,duration:300})
}
.padding({ left: 30, top: 8, bottom: 20 })
.width('100%')
.backgroundColor('#fff')

实现思路是,在每个标签渲染时,将各自的坐标传入一个数组中,点击标签后,将导航条的x轴偏移值设置为数组中的指定值,配合动画属性,实现效果

6

基本有效果了,这里运用简单的数学知识算一下,将导航条的坐标设置为标签左侧边界值 + 标签宽度的一半 - 导航条本身宽度的一半 就可以将导航条移动至标签正下方 也就是在存储坐标值时 加25(标签宽度50) 减去12(导航条宽度24)

  .onAreaChange((a,b) => {
    console.log('wssb',JSON.stringify(b))
    this.tabx[index] = Number(b.globalPosition.x) + 25 - 12
  })

获得我们需要的效果

7

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值