HarmonyOS鸿蒙Next中Navigation的菜单栏图标显示异常

HarmonyOS鸿蒙Next中Navigation的菜单栏图标显示异常 为什么这个图标在image标签显示正常的,在菜单栏就被填充了,其余两个在平板模式也是一样

@Entry
@Component
struct Index {
  @State menuBar: NavigationMenuItem[] = [
    { value: '搜索', icon: $r('app.media.search'), action: ()=> {} },
    { value: '添加', icon: $r('app.media.add'), action: ()=> {} },
    { value: '编辑', icon: $r('app.media.edit'), action: ()=> {} },
    { value: '历史', icon: $r('app.media.history'), action: ()=> {} }
  ]

  build() {
    Navigation(){
      Image($r('app.media.search'))
        .width(100)
    }
    .title('主页')
    .titleMode(NavigationTitleMode.Full)
    .menus(this.menuBar)
  }
}

cke_319.png

cke_942.png

cke_1279.png


更多关于HarmonyOS鸿蒙Next中Navigation的菜单栏图标显示异常的实战教程也可以访问 https://www.itying.com/category-93-b0.html

12 回复

尊敬的开发者,您好!感谢您的反馈,问题正在加速处理中,还请关注后续版本,感谢您的理解与支持。

更多关于HarmonyOS鸿蒙Next中Navigation的菜单栏图标显示异常的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


NavigationMenuItem的icon属性默认启用填充效果(类似Android的tint着色机制),而普通Image组件默认显示原始资源

移除SVG文件中的fill属性

或将SVG转换为绘制路径

这边用你的svg代码在浏览器渲染或者模拟器真机都是正常无填充的

cke_6422.png

估计是Navigation跟Image中的底层对图片处理方式不一致导致在预览器上的效果有差异;

  • 建议使用真机或者模拟器进行调试

相关文档:

模拟器里面也是有填充的,

开发者你好这边使用的是svg图片吗?用下面这个搜索图标看是没有问题的,用的api20的模拟器。

<svg width="50" height="50" viewBox="0 0 24 24">
    <path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.58 13 3 9.5 3S3 5.58 3 9.5 5.58 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>
</svg>

这边麻烦提供下图片。

<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <g id="ckpsearch"> <path id="fill1" d="M15.8033 15.8033C12.8744 18.7322 8.12563 18.7322 5.1967 15.8033C2.26777 12.8744 2.26777 8.12563 5.1967 5.1967C8.12563 2.26777 12.8744 2.26777 15.8033 5.1967C18.7322 8.12563 18.7322 12.8744 15.8033 15.8033Z" fill="transparent"/><path id="stroke2" d="M15.8027 15.8037L21.106 21.107" stroke-linecap="square" stroke-width="2.5" stroke="#000000"/> <path id="stroke1" d="M15.8033 15.8033C12.8744 18.7322 8.12563 18.7322 5.1967 15.8033C2.26777 12.8744 2.26777 8.12563 5.1967 5.1967C8.12563 2.26777 12.8744 2.26777 15.8033 5.1967C18.7322 8.12563 18.7322 12.8744 15.8033 15.8033Z" stroke-linecap="square" stroke-width="2.5" stroke="#000000"/> </g> </svg>,

你的这个图片是正常的,

这边有问题的图片能提供下吗,这边看下是什么问题,

你使用的search图标可能是单路径矢量图(如 SVG)轮廓图标(stroke)。直接用Image标签时,会按原图样式渲染(轮廓显示);但Navigation菜单会默认对图标应用填充色(fill),导致轮廓被填满成实心。

👍

在HarmonyOS Next中,Navigation菜单栏图标显示异常通常涉及资源引用或布局配置问题。请检查图标资源是否已正确放置在resources/base/media/目录下,并在ResourceTable中正确定义。确认Navigation组件中icon属性引用的资源ID无误。同时,验证图标文件的格式与尺寸是否符合规范。

这是一个典型的图标资源适配问题。在HarmonyOS Next的Navigation组件中,菜单栏图标默认会被系统应用主题色填充。

问题分析:

  1. 您的图标在Image组件中显示正常,但在Navigation菜单栏中被填充为系统主题色(蓝色)
  2. 这是因为NavigationMenuItem的icon属性期望的是SVG格式的矢量图标资源
  3. 系统会自动对菜单栏图标应用主题色填充,以确保视觉一致性

解决方案:

方案一:使用正确的图标格式 确保您的图标资源是SVG格式,并且设计为单色轮廓图标。系统会自动为这种图标应用主题色。

方案二:自定义图标渲染 如果必须使用PNG等位图图标,可以通过自定义菜单项来实现:

@Entry
@Component
struct Index {
  @State menuBar: CustomNavigationMenuItem[] = [
    { 
      value: '搜索', 
      icon: $r('app.media.search'),
      action: () => {}
    }
    // ... 其他菜单项
  ]

  build() {
    Navigation() {
      // 页面内容
    }
    .title('主页')
    .titleMode(NavigationTitleMode.Full)
    .menus(this.buildCustomMenus())
  }

  @Builder
  buildCustomMenus() {
    ForEach(this.menuBar, (item: CustomNavigationMenuItem) => {
      NavigationMenuItem({
        value: item.value,
        action: item.action
      })
      .icon({
        icon: this.buildCustomIcon(item.icon),
        fillColor: $r('sys.color.ohos_id_color_foreground') // 使用系统前景色
      })
    })
  }

  @Builder
  buildCustomIcon(iconRes: Resource) {
    Image(iconRes)
      .width(24)
      .height(24)
      .fillColor($r('sys.color.ohos_id_color_foreground')) // 控制填充色
  }
}

方案三:调整图标设计 将您的图标资源重新设计为:

  • 使用SVG格式
  • 单色轮廓设计(无填充色)
  • 透明背景
  • 适当的线条粗细

关键点:

  • Navigation菜单栏图标系统默认应用主题色填充
  • 使用SVG矢量图标能获得最佳效果
  • 可以通过自定义菜单项Builder来精确控制图标渲染

从您提供的截图看,图标被填充为蓝色是系统默认行为。建议检查图标资源格式,或采用自定义渲染方案来控制图标显示效果。

回到顶部