鸿蒙开发仿咸鱼TabBar

鸿蒙开发自定义TabBar,实现tabBar 上中间按钮凸起效果

第一步、定义数据模型

TypeScript 复制代码
export default class TabItemData{

  defaultIcon: Resource
  selectedIcon: Resource
  title: string
  isMiddle: boolean

  constructor(defaultIcon:Resource, selectedIcon:Resource, title:string, isMiddle: boolean) {
    this.defaultIcon = defaultIcon
    this.selectedIcon = selectedIcon
    this.title = title
    this.isMiddle = isMiddle
  }
}

第二步、定义一个ViewModel, 设置数据源

TypeScript 复制代码
export class MainViewModel {


  getTabBarImage(): Array<TabItemData>{
    let tabItems: TabItemData[] = [
      new TabItemData($r('app.media.home_normal'), $r('app.media.home_selected'), "首页", false),
      new TabItemData($r('app.media.discover_normal'), $r('app.media.discover_selected'), "", true),
      new TabItemData($r('app.media.mine_normal'), $r('app.media.mine_selected'), "我", false),
    ]
    return tabItems
  }

}

export default new MainViewModel();

第三步、自定义组件,定义一个TabItem,用了两个Column 嵌套,代表两个视图容器,由于鸿蒙没有类似Flutter 中Container 这样的组件,所以选择用Column 代替

TypeScript 复制代码
@Component
export struct TabBarItem{

  @Prop isSelected: boolean
  itemData: TabItemData

  build(){
    Column(){
      Column(){
        Image(this.isSelected? this.itemData.selectedIcon: this.itemData.defaultIcon)
          .width(this.itemData.isMiddle? '45vp': '25vp')
          .height(this.itemData.isMiddle? '45vp': '25vp')
          .interpolation(ImageInterpolation.High)
        if (!this.itemData.isMiddle){
          Text(this.itemData.title)
            .margin({ top: $r('app.float.mainPage_baseTab_top') })
            .fontSize($r('app.float.main_tab_fontSize'))
            .fontColor(this.isSelected? '#1698CE' : '#6B6B6B')
        }
      }
      .justifyContent(FlexAlign.Center)
      .backgroundColor(this.itemData.isMiddle?Color.White: Color.Transparent)
      .padding(this.itemData.isMiddle?{top:2,left:2, right:2, bottom: 2}: 0)
      .borderRadius('23.5vp')
    }.justifyContent(FlexAlign.Center)
    .height($r('app.float.mainPage_barHeight'))
    .width(Constants.FULL_PARENT)
  }
}

第三步、自定义TabBar 组件

TypeScript 复制代码
@Component
export struct LMTabBar{

  @Prop tabIdx:number
  tabItemClick:(index)=>void

  build(){
    Flex(){
      ForEach(mainViewModel.getTabBarImage(),(item,index: number)=>{
        TabBarItem({itemData: item, isSelected: this.tabIdx === index })
          .offset({y: item.isMiddle? '-25': '0'})

          .onClick(()=>{
            this.tabIdx = index
            this.tabItemClick(index)
          })
      })
    }
  }
}

第四步、用自定义的TabBar覆盖原来Tabs

TypeScript 复制代码
@Preview
@Entry
@Component
struct MainPage{
  @State currentIndex: number = 0
  private tabsController: TabsController = new TabsController()

  build(){
    Stack(){
      Tabs({barPosition: BarPosition.End, controller: this.tabsController }){
        TabContent(){
          Home()
        }
        .padding({ left: $r('app.float.mainPage_padding'), right: $r('app.float.mainPage_padding') })
        .backgroundColor($r('app.color.mainPage_backgroundColor'))

        TabContent(){
          Text("发现")
        }
        TabContent(){
          Mine()
        }
        .padding({ left: $r('app.float.mainPage_padding'), right: $r('app.float.mainPage_padding') })
        .backgroundColor($r('app.color.mainPage_backgroundColor'))
      }
      .barHeight(0)
      .onChange((index: number)=>{
        this.currentIndex = index
      })
      LMTabBar({tabIdx: this.currentIndex,tabItemClick: (index)=>{
        this.tabsController.changeIndex(index)
      } })
        .backgroundColor(Color.White)

    }.align(Alignment.Bottom)




  }
}
相关推荐
智塑未来14 小时前
鸿蒙游戏体验手册:四种能力从性能到玩法逐一解锁
游戏·华为·harmonyos
math_hongfan15 小时前
鸿蒙离线数据缓存高级架构:弱网预加载/离线数据优先级/同步冲突解决/上线后数据合并策略
学习·缓存·华为·架构·harmonyos·鸿蒙
math_hongfan18 小时前
鸿蒙企业级数据存储高级架构:从读写分离到冷热数据分层/归档策略/数据生命周期管理最佳实践
人工智能·学习·华为·架构·harmonyos·鸿蒙
math_hongfan21 小时前
鸿蒙存储异常高级排查:文件损坏检测/数据恢复/读写失败重试/磁盘空间预警系统性根治方案
学习·华为·harmonyos·鸿蒙
lilian23321 小时前
Harmony os 技术实战|拼豆制图10:把取消、解析失败和保存失败写成可恢复状态机
java·javascript·华为·harmonyos
2501_9197490321 小时前
华为鸿蒙美缝剂实用APP—小羊美缝
华为·harmonyos
2501_9197490321 小时前
华为鸿蒙积攒年度高光APP—小羊高光
华为·harmonyos
智塑未来1 天前
鸿蒙7碰一碰智感交互——碰哪儿传哪儿
华为·harmonyos
math_hongfan1 天前
鸿蒙存储碎片高级清理机制:数据库Vacuum/文件碎片整理/缓存过期清理/主动空间回收策略
jvm·数据库·学习·缓存·华为·harmonyos·鸿蒙
梦想不只是梦与想1 天前
鸿蒙UI测试框架:UITest
harmonyos·uitest·ui测试框架