HarmonyOS鸿蒙Next中如何解决标题栏颜色渐变导致标题栏控件不显示的问题

HarmonyOS鸿蒙Next中如何解决标题栏颜色渐变导致标题栏控件不显示的问题

【问题现象】

实现标题栏颜色渐变,导致标题栏内部的控件不展示。

下面这段代码,页面上划过程中,标题栏会逐渐透明,导致标题栏组件中头像图片和扫一扫图片也不显示。

点击放大 点击放大

问题代码:

@Entry
@Component
struct tabTopScroll {
  private tabController: TabsController = new TabsController()
  @State topHeight:number = 0
  @State opacityNum:number = 0
  scrollSum = 0

  build() {
    Column() {
      Flex({justifyContent:FlexAlign.SpaceBetween,alignItems:ItemAlign.Center}){
        Image($r('app.media.home_unlogin'))
          .width(40)
          .height(40)
          .borderRadius(8)
        Image($r('app.media.home_top_scan'))
          .width(40)
          .height(40)
      }
      .opacity(this.opacityNum>=1?1:this.opacityNum)
      .position({x:0,y:0})
      .zIndex(99)
      // tab内容
      Tabs({ barPosition: BarPosition.End, controller: this.tabController }) {
         TabContent() {
          this.listControllerBuilder()
        }.tabBar(this.tabBuilder(0, '手机'))
        …
      }
      ……
    }
    .width('100%')
    .height(`100%`)
  }
  
  @Builder
  listControllerBuilder() {
    List({ space: 20, initialIndex: 0 }) {
      ForEach(this.arr, (item: number) => {
        ListItem() {
          Text('' + item)
        }
      }, (item: string) => item)
    }
    .onReachStart(() => {
      this.opacityNum = 0
    })
    .onWillScroll((scrollOffset: number, scrollState: ScrollState, scrollSource: ScrollSource) => {
      this.scrollSum += scrollOffset
      this.opacityNum = this.scrollSum / 300
    })
    ……
  }
}

【背景知识】

  • 标题栏渐变是通过页面滚动条偏移量调整标题栏透明度实现渐变的。
  • 页面滚动条偏移量可以通过滚动回调事件onWillScroll获取。
  • 标题栏组件的透明度通过通用属性opacity实现,opacity为0表示完全透明, 达到隐藏组件效果,但是在布局中占位。

【定位思路】

排查流程为:

  1. 检查组件布局

先定位是否是标题栏组件被其他元素覆盖或者位置偏移导致无法显示。检查组件的父容器、布局属性以及其他相关元素,确保组件能够正常显示。

**当前情况:**布局正常,未覆盖标题栏组件。

  1. 检查组件样式

确保标题栏组件中的样式属性设置不会影响内部组件的可见性。

**当前情况:**标题栏组件中的opacity属性会影响到内部组件可见性。

  1. 检查代码逻辑

检查代码中是否会有属性变化导致标题栏不可见。

**当前情况:**页面滚动条的偏移量会影响标题栏组件的透明度,透明度为0时会导致组件不可见。

【解决方案】

最终确定是透明度opacity设置为0时导致组件不可见。如果需要修改标题栏透明度且不影响标题栏内容的展示,可以用rgba格式设置背景色,通过调整背景色的透明度来实现标题栏渐变,而不影响标题栏内容的展示。

修改后代码如下:

Flex({justifyContent:FlexAlign.SpaceBetween,alignItems:ItemAlign.Center}){
  Image($r('app.media.home_unlogin'))
    .width(40)
    .height(40)
    .borderRadius(8)
  Image($r('app.media.home_top_scan'))
    .width(40)
    .height(40)
}
.padding(10)
.width('100%')
.height(56)
.backgroundColor(`rgba(70,130,180,${this.opacityNum>=1?1:this.opacityNum})`)
.opacity(this.opacityNum>=1?1:this.opacityNum)
.position({x:0,y:0})
.zIndex(99)

解决后效果如图:

点击放大 点击放大

【总结】

类似的UI内容不显示的问题可以从以下几个方面排查:

**1. 布局和位置:**查看是否被其它组件布局影响,位置发生变化导致不可见。

**2. 可见性:**是否有设置类似visibility属性或者组件在ifelse的判断中导致不可见。

**3. 样式和外观:**是否是颜色透明度或者大小尺寸变化导致不可见。


更多关于HarmonyOS鸿蒙Next中如何解决标题栏颜色渐变导致标题栏控件不显示的问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS鸿蒙Next中如何解决标题栏颜色渐变导致标题栏控件不显示的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,标题栏颜色渐变导致标题栏控件不显示的问题

在HarmonyOS鸿蒙Next中,标题栏颜色渐变导致标题栏控件不显示的问题可以通过调整背景色的透明度来解决,而不是直接设置组件的透明度。具体修改如下:

Flex({justifyContent:FlexAlign.SpaceBetween,alignItems:ItemAlign.Center}){
  Image($r('app.media.home_unlogin'))
    .width(40)
    .height(40)
    .borderRadius(8)
  Image($r('app.media.home_top_scan'))
    .width(40)
    .height(40)
}
.padding(10)
.width('100%')
.height(56)
.backgroundColor(`rgba(70,130,180,${this.opacityNum>=1?1:this.opacityNum})`)
.opacity(this.opacityNum>=1?1:this.opacityNum)
.position({x:0,y:0})
.zIndex(99)

通过使用rgba设置背景色的透明度,可以在实现标题栏渐变的同时,确保标题栏内部的控件正常显示。

回到顶部