当前位置:   article > 正文

【HarmonyOS】【ARKUI】鸿蒙 ets方式tabs+tabcontent 实现底部导航栏_鸿蒙tab 和tabcontent 全部加载

鸿蒙tab 和tabcontent 全部加载

 在鸿蒙开发中tab切换功能(如下图所示)是非常常见一个功能,今天描述如下功能怎么实现?开发中需要准备哪些资料?


今天我们从“资料准备”,“Tabs功能实现”,“底部按钮功能实现”,“运行效果”四个方面进行描述

image.png

image.png

image.png

1. 开发准备

1.1资料准备 想要实现如上图功能的话,需要学习“Tabs”,“TabContent”,“ Row”,“Column”,等等相关技术
1.2 图片准备 准备六张图片(图片如下)放在resources/base/media/目录下

image.png

图片存放的位置

image.png

2. Tabs功能实现

2.1详细资料参考“Tabs”,“TabContent”的官方文档
代码如下

  1. @Entry
  2. @Component
  3. struct MyNewsIndex {
  4. private controller: TabsController = new TabsController()
  5. build() {
  6. Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
  7. Tabs({ controller: this.controller }) {
  8. TabContent() {
  9. Text("首页")
  10. .width('100%').height('100%')
  11. .fontSize(50)
  12. .textAlign(TextAlign.Center)
  13. .fontColor(Color.White)
  14. .backgroundColor(Color.Pink)
  15. }.tabBar('首页')
  16. TabContent() {
  17. Text("消息")
  18. .width('100%').height('100%')
  19. .fontSize(50)
  20. .textAlign(TextAlign.Center)
  21. .fontColor(Color.White)
  22. .backgroundColor(Color.Blue)
  23. }.tabBar('消息')
  24. TabContent() {
  25. Text("我的")
  26. .width('100%').height('100%')
  27. .fontSize(50)
  28. .textAlign(TextAlign.Center)
  29. .fontColor(Color.White)
  30. .backgroundColor(Color.Red)
  31. }.tabBar('我的')
  32. }
  33. .scrollable(false)
  34. .barHeight(0)
  35. .animationDuration(0)
  36. }.alignItems(VerticalAlign.Bottom).width('100%').height(120).margin({top:0,right:0,bottom:10,left:0})
  37. }
  38. .width('100%')
  39. .height('100%')
  40. }
  41. }

效果如下

image.png

3底部按钮功能实现

3.1底部功能实现主要使用“Row”,“Column”,“Text”,“Image”等相关技术实现,代码如下

  1. Row() {
  2. Column(){
  3. Image($r('app.media.index_select'))
  4. .width(60).height(60)
  5. Text('首页')
  6. .size({ width: '100%', height: 60 }).textAlign(TextAlign.Center)
  7. .fontSize(20)
  8. .fontColor(Color.Red)
  9. }
  10. .layoutWeight(1)
  11. .backgroundColor(0xFFEFD5)
  12. .height("100%")
  13. Column(){
  14. Image($r('app.media.msg_unselect'))
  15. .width(60).height(60)
  16. Text('消息')
  17. .size({ width: '100%', height: 60 }).textAlign(TextAlign.Center)
  18. .fontSize(20)
  19. .fontColor(Color.Black)
  20. }
  21. .layoutWeight(1)
  22. .backgroundColor(0xFFEFD5)
  23. .height("100%")
  24. Column(){
  25. Image($r('app.media.my_unselect'))
  26. .width(60).height(60)
  27. Text('我的')
  28. .size({ width: '100%', height: 60 }).textAlign(TextAlign.Center)
  29. .fontSize(20)
  30. .fontColor(Color.Black)
  31. }
  32. .layoutWeight(1)
  33. .backgroundColor(0xFFEFD5)
  34. .height("100%")
  35. }.alignItems(VerticalAlign.Bottom).width('100%').height(120).margin({top:0,right:0,bottom:10,left:0})

4运行效果

4.1 Tabs和按钮联动问题实现
我们在定义一个全局变量SelectPos为当前选择的索引,当点击按钮的时候对当前索引进行赋值,并对Image和字体颜色进行改变,全部代码如下

  1. @Entry
  2. @Component
  3. struct MyNewsIndex {
  4. private controller: TabsController = new TabsController()
  5. @State SelectPos:number=0;
  6. public IndexClick(){
  7. this.SelectPos=0;
  8. this.controller.changeIndex(0)
  9. }
  10. public messageClick(){
  11. this.SelectPos=1;
  12. this.controller.changeIndex(1)
  13. }
  14. public myClick(){
  15. this.SelectPos=2;
  16. this.controller.changeIndex(2)
  17. }
  18. build() {
  19. Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
  20. Tabs({ controller: this.controller }) {
  21. TabContent() {
  22. Text("首页")
  23. .width('100%').height('100%')
  24. .fontSize(50)
  25. .textAlign(TextAlign.Center)
  26. .fontColor(Color.White)
  27. .backgroundColor(Color.Pink)
  28. }.tabBar('首页')
  29. TabContent() {
  30. Text("消息")
  31. .width('100%').height('100%')
  32. .fontSize(50)
  33. .textAlign(TextAlign.Center)
  34. .fontColor(Color.White)
  35. .backgroundColor(Color.Blue)
  36. }.tabBar('消息')
  37. TabContent() {
  38. Text("我的")
  39. .width('100%').height('100%')
  40. .fontSize(50)
  41. .textAlign(TextAlign.Center)
  42. .fontColor(Color.White)
  43. .backgroundColor(Color.Red)
  44. }.tabBar('我的')
  45. }
  46. .scrollable(false)
  47. .barHeight(0)
  48. .animationDuration(0)
  49. Row() {
  50. Column(){
  51. Image((this.SelectPos==0?$r('app.media.index_select'):$r('app.media.index_unselect')))
  52. .width(60).height(60)
  53. Text('首页')
  54. .size({ width: '100%', height: 60 }).textAlign(TextAlign.Center)
  55. .fontSize(20)
  56. .fontColor((this.SelectPos==0?Color.Red:Color.Black))
  57. }
  58. .layoutWeight(1)
  59. .backgroundColor(0xFFEFD5)
  60. .height("100%")
  61. .onClick(this.IndexClick.bind(this))
  62. Column(){
  63. Image((this.SelectPos==1?$r('app.media.msg_select'):$r('app.media.msg_unselect')))
  64. .width(60).height(60)
  65. Text('消息')
  66. .size({ width: '100%', height: 60 }).textAlign(TextAlign.Center)
  67. .fontSize(20)
  68. .fontColor((this.SelectPos==1?Color.Red:Color.Black))
  69. }
  70. .layoutWeight(1)
  71. .backgroundColor(0xFFEFD5)
  72. .height("100%")
  73. .onClick(this.messageClick.bind(this))
  74. Column(){
  75. Image((this.SelectPos==2?$r('app.media.my_select'):$r('app.media.my_unselect')))
  76. .width(60).height(60)
  77. Text('我的')
  78. .size({ width: '100%', height: 60 }).textAlign(TextAlign.Center)
  79. .fontSize(20)
  80. .fontColor((this.SelectPos==2?Color.Red:Color.Black))
  81. }
  82. .layoutWeight(1)
  83. .backgroundColor(0xFFEFD5)
  84. .height("100%")
  85. .onClick(this.myClick.bind(this))
  86. }.alignItems(VerticalAlign.Bottom).width('100%').height(120).margin({top:0,right:0,bottom:10,left:0})
  87. }
  88. .width('100%')
  89. .height('100%')
  90. }
  91. }

运行效果如下

image.png

image.png

更多相关学习资料:
https://developer.huawei.com/consumer/cn/forum/topic/0201787474595650145?fid=0102683795438680754?ha_source=zzh 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/117641
推荐阅读
相关标签
  

闽ICP备14008679号