HarmonyOS Next如何实现文字加图片的导航样式?

阅读 544
avatarAI BotBETA
在HarmonyOS Next中实现文字加图片的导航样式,可以通过使用XML布局文件来定义导航栏的UI组件,并在其中结合`Text`和`Image`组件来实现。以下是一个基本的示例代码,展示了如何实现这种布局:

<DirectionalLayout

ohos:width="match_parent"
ohos:height="wrap_content"
ohos:orientation="horizontal"
ohos:padding="16vp">

<Image
    ohos:id="$+id:nav_icon"
    ohos:width="48vp"
    ohos:height="48vp"
    ohos:src="$media:icon_home"
    ohos:margin_end="8vp"/>

<Text
    ohos:id="$+id:nav_text"
    ohos:width="match_content"
    ohos:height="match_content"
    ohos:text="Home"
    ohos:text_size="18fp"
    ohos:text_color="#000000"/>

</DirectionalLayout>


在这个示例中,我们使用了一个`DirectionalLayout`作为容器,它支持水平(`horizontal`)或垂直(`vertical`)方向的布局。`Image`组件用于显示导航图标,而`Text`组件用于显示导航文字。通过调整`ohos:margin_end`等属性,可以控制组件之间的间距。

确保在项目的资源文件夹中包含相应的图标文件,并在`ohos:src`属性中正确引用。

这个示例仅展示了基本的实现方式,你可以根据实际需求进一步自定义和扩展导航样式,例如添加点击事件处理、动态更改图标和文字等。
1 个回答
//使用Tabs组件,设置barPosition为BarPosition.End控制导航条底部展示。Tabs组件嵌套tabContentBuilder自定义组件。
// entry/src/main/ets/pages/BottomTab.ets
build() {
  Tabs({
    barPosition: BarPosition.End,
    controller: this.tabsController
  }) {
    this.tabContentBuilder($r('app.string.message'),
      Constants.TAB_INDEX_ZERO, $r('app.media.activeMessage'), $r('app.media.message'))
    this.tabContentBuilder($r('app.string.people'),
      Constants.TAB_INDEX_ONE, $r('app.media.activePeople'), $r('app.media.people'))
    this.tabContentBuilder($r('app.string.activity'),
      Constants.TAB_INDEX_TWO, $r('app.media.activeStar'), $r('app.media.star'))
  }
  .width('100%')
  .backgroundColor('#F3F4F5')
  .barHeight(52)
  .barMode(BarMode.Fixed)
  .onAnimationStart((index: number, targetIndex: number) => {
    hilog.info(0x0000, 'index', index.toString());
    this.currentIndex = targetIndex;
  })
}
//tabContentBuilder自定义组件嵌套TabContent组件实现内容区,并设置tabBar属性实现导航条。
// entry/src/main/ets/pages/BottomTab.ets
@Builder
tabContentBuilder(text: Resource, index: number, selectedImg: Resource, normalImg: Resource) {
  TabContent() {
    Row() {
      Text(text)
        .height(300)
        .fontSize(30)
    }
    .width('100%')
    .justifyContent(FlexAlign.Center)
  }
  .padding({ left: 12, right: 12 })
  .backgroundColor(Color.White)
  .tabBar(this.tabBuilder(text, index, selectedImg, normalImg))
}
//导航布局代码
// entry/src/main/ets/pages/BottomTab.ets
@Builder
tabBuilder(title: Resource, index: number, selectedImg: Resource, normalImg: Resource) {
  Column() {
    Image(this.currentIndex === index ? selectedImg : normalImg)
      .width(24)
      .height(24)
      .objectFit(ImageFit.Contain)
    Text(title)
      .margin({ top: 4 })
      .fontSize(10)
      .fontColor(this.currentIndex === index ? '#3388ff' : '#E6000000')
  }
  .justifyContent(FlexAlign.Center)
  .height(52)
  .width('100%')
  .onClick(() => {
    this.currentIndex = index;
    this.tabsController.changeIndex(this.currentIndex);
  })
}

本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进