首页
学习
活动
专区
圈层
工具
发布

鸿蒙仓颉开发语言实战教程:自定义tabbar

大家周末好呀,今天继续分享仓颉语言开发商城应用的实战教程,今天要做的是tabbar。

大家都知道ArkTs有Tabs和TabContent容器,能够实现上图的样式,满足基本的使用需求。而仓颉就不同了,它虽然也有这两个组件,但是它的tabbar参数只支持传入图片或者文字,不能像ArkTs那样能传入组件,所以在仓颉语言中官方的tabbar局限性非常大。

给大家实操讲解一下,下面是一段Tabs的基本写法:

Tabs(BarPosition.End, this.controller){

TabContent(){

Text('页面1')

}

TabContent(){

Text('页面2’)

}

}

如果你要设置tabbar的样式,需要在TabContent下添加tabbar属性,然后你会发现tabbar只有唯二的两个参数:

TabContent(){

Text('页面1')

}

.tabBar(icon: CJResource, text: CJResource)

设置完之后它长这样:

这样就无法满足我们的需求,所以我们需要自定义。

每一个tabbar元素都有一个图片组件和一个文字组件,我给它写出来:

Column {

Image(item.selectIcon).width(28).height(28)

Text(item.title).fontSize(15).fontColor(0xd84642).margin(top: 3)

}

然后它需要有一个选中状态,难受的是仓颉不支持三元表达式,所以我只能写if语句:

Column {

if(this.currenttabIndex == index){

Image(item.selectIcon).width(28).height(28)

Text(item.title).fontSize(15).fontColor(0xd84642).margin(top: 3)

}else {

Image(item.icon).width(28).height(28)

Text(item.title).fontSize(15).fontColor(Color.GRAY).margin(top: 3)

}

}它还需要一个点击事件:

Column {

if(this.currenttabIndex == index){

Image(item.selectIcon).width(28).height(28)

Text(item.title).fontSize(15).fontColor(0xd84642).margin(top: 3)

}else {

Image(item.icon).width(28).height(28)

Text(item.title).fontSize(15).fontColor(Color.GRAY).margin(top: 3)

}

}

.onClick({evet => this.currenttabIndex = index;this.controller.changeIndex(Int32(this.currenttabIndex))})

这样一个元素就写好了,接下来我只要循环添加几个元素,一个完整的tabbar就写好了,这里大家也要注意一下仓颉中foreach的写法:

Row {

ForEach(this.tabList, itemGeneratorFunc: {item: TabItem, index: Int64 =>

Column {

if(this.currenttabIndex == index){

Image(item.selectIcon).width(28).height(28)

Text(item.title).fontSize(15).fontColor(0xd84642).margin(top: 3)

}else {

Image(item.icon).width(28).height(28)

Text(item.title).fontSize(15).fontColor(Color.GRAY).margin(top: 3)

}

}

.onClick({evet => this.currenttabIndex = index;this.controller.changeIndex(Int32(this.currenttabIndex))})

})

}

.width(100.percent)

.height(60)

.alignItems(VerticalAlign.Center)

.justifyContent(FlexAlign.SpaceAround)

最后我们还是需要官方的Tabs容器来添加页面,你只要不设置tabbar属性底部导航栏区域就是空白的,正好把我们自定义的tabbar放上,下面是完整的示例代码:

let tabList: Array<TabItem> = [

TabItem(@r(app.media.shop_tab_00), @r(app.media.shop_tab_01), '首页'),

TabItem(@r(app.media.shop_tab_10), @r(app.media.shop_tab_11), '购物车'),

TabItem(@r(app.media.shop_tab_20), @r(app.media.shop_tab_21), '我的')

]

@State

var currenttabIndex:Int64 = 0

Stack(Alignment.Bottom) {

Tabs(BarPosition.End, this.controller){

TabContent(){

home()

}

TabContent(){

shopcar()

}

TabContent(){

mine()

}

}

.barHeight(60)

.scrollable(false)

.animationDuration(0)

Row {

ForEach(this.tabList, itemGeneratorFunc: {item: TabItem, index: Int64 =>

Column {

if(this.currenttabIndex == index){

Image(item.selectIcon).width(28).height(28)

Text(item.title).fontSize(15).fontColor(0xd84642).margin(top: 3)

}else {

Image(item.icon).width(28).height(28)

Text(item.title).fontSize(15).fontColor(Color.GRAY).margin(top: 3)

}

}

.onClick({evet => this.currenttabIndex = index;this.controller.changeIndex(Int32(this.currenttabIndex))})

})

}

.width(100.percent)

.height(60)

.alignItems(VerticalAlign.Center)

.justifyContent(FlexAlign.SpaceAround)

}

以上就是仓颉语言自定义tabbar的实现过程,感谢阅读。#HarmonyOS语言##仓颉##购物#

  • 发表于:
  • 原文链接https://page.om.qq.com/page/Oy8rKZoCQAJptlK17BthXASA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。
领券