[HarmonyOS] [ARKUI] Harmony ets méthode tabs+tabcontent pour réaliser la barre de navigation du bas

Dans le développement de Hongmeng, la fonction de changement d'onglet (comme illustré dans la figure ci-dessous) est une fonction très courante. Comment implémenter la fonction suivante est décrite aujourd'hui ? De quelles données ai-je besoin pour me préparer au développement ?
Aujourd'hui, nous allons décrire sous quatre aspects : « préparation des données », « réalisation de la fonction des onglets », « réalisation de la fonction du bouton du bas » et « effet de l'opération »

image.png

image.png

image.png

1. Préparation du développement

1.1 Préparation des données Si vous souhaitez obtenir la fonction indiquée ci-dessus, vous devez apprendre " Tabs ", " TabContent ", "  Row ", " Column " et d'autres technologies connexes
1.2 Préparation de l'image Préparez six images (images ci-dessous) et mettez dans resources/base/ sous le répertoire media/

image.png

Où les images sont stockées

image.png

2. Implémentation de la fonction d'onglets

2.1 Pour plus de détails, veuillez vous référer à la documentation officielle de " Tabs " et " TabContent
". Les codes sont les suivants

@Entry
@Component
struct MyNewsIndex {
  private controller: TabsController = new TabsController()
 
  build() {
    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
      Tabs({ controller: this.controller }) {
        TabContent() {
          Text("首页")
            .width('100%').height('100%')
            .fontSize(50)
            .textAlign(TextAlign.Center)
            .fontColor(Color.White)
            .backgroundColor(Color.Pink)
        }.tabBar('首页')
        TabContent() {
          Text("消息")
            .width('100%').height('100%')
            .fontSize(50)
            .textAlign(TextAlign.Center)
            .fontColor(Color.White)
            .backgroundColor(Color.Blue)
        }.tabBar('消息')
        TabContent() {
          Text("我的")
            .width('100%').height('100%')
            .fontSize(50)
            .textAlign(TextAlign.Center)
            .fontColor(Color.White)
            .backgroundColor(Color.Red)
        }.tabBar('我的')
      }
      .scrollable(false)
      .barHeight(0)
      .animationDuration(0)

     
      }.alignItems(VerticalAlign.Bottom).width('100%').height(120).margin({top:0,right:0,bottom:10,left:0})
    }
    .width('100%')
    .height('100%')
  }
}

L'effet est le suivant

image.png

3 Réalisation de la fonction du bouton inférieur

3.1 La fonction du bas est principalement réalisée en utilisant " Row ", " Column ", " Text ", " Image " et d'autres technologies connexes, le code est le suivant

Row() {
        Column(){
          Image($r('app.media.index_select'))
            .width(60).height(60)
          Text('首页')
            .size({ width: '100%', height: 60 }).textAlign(TextAlign.Center)
            .fontSize(20)
            .fontColor(Color.Red)
        }
        .layoutWeight(1)
        .backgroundColor(0xFFEFD5)
        .height("100%")

        Column(){
          Image($r('app.media.msg_unselect'))
            .width(60).height(60)
          Text('消息')
            .size({ width: '100%', height: 60 }).textAlign(TextAlign.Center)
            .fontSize(20)
            .fontColor(Color.Black)
        }
        .layoutWeight(1)
        .backgroundColor(0xFFEFD5)
        .height("100%")

        Column(){
          Image($r('app.media.my_unselect'))
            .width(60).height(60)
          Text('我的')
            .size({ width: '100%', height: 60 }).textAlign(TextAlign.Center)
            .fontSize(20)
            .fontColor(Color.Black)
        }
        .layoutWeight(1)
        .backgroundColor(0xFFEFD5)
        .height("100%")
      }.alignItems(VerticalAlign.Bottom).width('100%').height(120).margin({top:0,right:0,bottom:10,left:0})

4 effets de course

4.1 Implémentation du problème de liaison des onglets et des boutons
Nous définissons une variable globale SelectPos comme l'index actuellement sélectionné. Lorsque le bouton est cliqué, l'index actuel est attribué et l'image et la couleur de la police sont modifiées. L'ensemble du code est le suivant

@Entry
@Component
struct MyNewsIndex {
  private controller: TabsController = new TabsController()
  @State SelectPos:number=0;
  public IndexClick(){
    this.SelectPos=0;
    this.controller.changeIndex(0)
  }
  public messageClick(){
    this.SelectPos=1;
    this.controller.changeIndex(1)
  }
  public myClick(){
    this.SelectPos=2;
    this.controller.changeIndex(2)
  }

  build() {
    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
      Tabs({ controller: this.controller }) {
        TabContent() {
          Text("首页")
            .width('100%').height('100%')
            .fontSize(50)
            .textAlign(TextAlign.Center)
            .fontColor(Color.White)
            .backgroundColor(Color.Pink)
        }.tabBar('首页')
        TabContent() {
          Text("消息")
            .width('100%').height('100%')
            .fontSize(50)
            .textAlign(TextAlign.Center)
            .fontColor(Color.White)
            .backgroundColor(Color.Blue)
        }.tabBar('消息')
        TabContent() {
          Text("我的")
            .width('100%').height('100%')
            .fontSize(50)
            .textAlign(TextAlign.Center)
            .fontColor(Color.White)
            .backgroundColor(Color.Red)
        }.tabBar('我的')
      }
      .scrollable(false)
      .barHeight(0)
      .animationDuration(0)

      Row() {
        Column(){
          Image((this.SelectPos==0?$r('app.media.index_select'):$r('app.media.index_unselect')))
            .width(60).height(60)
          Text('首页')
            .size({ width: '100%', height: 60 }).textAlign(TextAlign.Center)
            .fontSize(20)
            .fontColor((this.SelectPos==0?Color.Red:Color.Black))
        }
        .layoutWeight(1)
        .backgroundColor(0xFFEFD5)
        .height("100%")
        .onClick(this.IndexClick.bind(this))

        Column(){
          Image((this.SelectPos==1?$r('app.media.msg_select'):$r('app.media.msg_unselect')))
            .width(60).height(60)
          Text('消息')
            .size({ width: '100%', height: 60 }).textAlign(TextAlign.Center)
            .fontSize(20)
            .fontColor((this.SelectPos==1?Color.Red:Color.Black))
        }
        .layoutWeight(1)
        .backgroundColor(0xFFEFD5)
        .height("100%")
        .onClick(this.messageClick.bind(this))

        Column(){
          Image((this.SelectPos==2?$r('app.media.my_select'):$r('app.media.my_unselect')))
            .width(60).height(60)
          Text('我的')
            .size({ width: '100%', height: 60 }).textAlign(TextAlign.Center)
            .fontSize(20)
            .fontColor((this.SelectPos==2?Color.Red:Color.Black))
        }
        .layoutWeight(1)
        .backgroundColor(0xFFEFD5)
        .height("100%")
        .onClick(this.myClick.bind(this))
      }.alignItems(VerticalAlign.Bottom).width('100%').height(120).margin({top:0,right:0,bottom:10,left:0})


    }
    .width('100%')
    .height('100%')
  }
}

L'effet de l'opération est le suivant

image.png

image.png

{{o.name}}
{{m.name}}

Je suppose que tu aimes

Origine my.oschina.net/u/4478396/blog/5511288
conseillé
Classement