HarmonyOS鸿蒙Next中Hdsnavigation组件(API18上测试)深浅色模式切换,顶部模糊状态会丢失。

HarmonyOS鸿蒙Next中Hdsnavigation组件(API18上测试)深浅色模式切换,顶部模糊状态会丢失。 Hdsnavigation组件(API18上测试)深浅色模式切换,顶部模糊状态会丢。是我打的有问题吗?就是CV略改官方代码啊。(¤﹏¤)

图片

图片


更多关于HarmonyOS鸿蒙Next中Hdsnavigation组件(API18上测试)深浅色模式切换,顶部模糊状态会丢失。的实战教程也可以访问 https://www.itying.com/category-93-b0.html

7 回复

在API 18的HdsNavigation 的 scrollEffectType 动态模糊样式默认可能未适配系统深浅色模式,需手动指定 colorMode 参数。你这大概率是丢失模糊。

更多关于HarmonyOS鸿蒙Next中Hdsnavigation组件(API18上测试)深浅色模式切换,顶部模糊状态会丢失。的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


一会我去试试。等19看看,希望能全推19,因为我用API19的模拟器没有问题(之后试试API18的模拟器看看)。

跟暗黑模式没有关系,我测试了一下,标题栏的初始颜色跟originalStyle有关,如果设置了该属性会变成预先设置的颜色,如果没有设置originalStyle,初始颜色跟背景颜色一致,其次下拉过程中标题栏的背景颜色跟背景颜色相关,背景是什么颜色就是什么颜色,参考demo:

// 模块导入
import { HdsNavigation, HdsNavigationAttribute, ScrollEffectType, HdsNavigationTitleMode } from '@kit.UIDesignKit';
import { LengthMetrics } from '@kit.ArkUI';

const TITLE_BAR_HEIGHT_MINI: number = 50;

@Entry
@Component
struct Index {
  private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
  @Provide('pageInfos') pageInfos: NavPathStack = new NavPathStack();
  scroller: Scroller = new Scroller();
  @State blankHeight: number = TITLE_BAR_HEIGHT_MINI;
  @State isHideBackButton: boolean = false;
  @State titleMode: HdsNavigationTitleMode = HdsNavigationTitleMode.MINI;
  @State subTitle: string = 'Sub';

  build() {
    HdsNavigation(this.pageInfos) { // 创建HdsNavigation组件
      Column() {
        Stack() {
          Scroll(this.scroller) { // 内容区设置可滚动容器组件,用于实现内容区滚动联动标题栏动态模糊效果
            Column() {
              // HdsNavigation标题栏与内容区默认设置堆叠布局,可以在内容区叠加标题栏高度的Blank,防止内容区被标题栏遮挡
              Blank().height(this.blankHeight)
              Image($r('app.media.background'))
                .width('100%')
              Button('pushPath', { stateEffect: true, type: ButtonType.Capsule })
                .width('80%')
                .height(40)
                .margin({ top: '5%', right: '50vp', left: '50vp' })
                .onClick(() => {
                  console.info('HDS_BASE_COMPONENT', `onClick firstPage`);
                  this.pageInfos.pushPath({ name: 'pageOne' })
                })
              Button('hide backButton ' + this.isHideBackButton)
                .onClick(() => {
                  this.isHideBackButton = !this.isHideBackButton
                })
                .width('80%')
                .height(40)
                .margin({ top: '5%', right: '50vp', left: '50vp' , bottom: '5%'})
              List({ space: 12, initialIndex: 0 }) {
                ForEach(this.arr, (item: number) => {
                  ListItem() {
                    Text('' + item)
                      .width('100%')
                      .height(72)
                      .fontSize(16)
                      .fontWeight(500)
                      .textAlign(TextAlign.Center)
                  }
                  .height(120)
                  .backgroundColor(Color.Orange)
                  .borderRadius(24)
                }, (item: number) => item.toString())
              }
              .edgeEffect(EdgeEffect.None)
              .width('100%')
              .height('100%')
              .nestedScroll({scrollForward: NestedScrollMode.PARENT_FIRST, scrollBackward: NestedScrollMode.PARENT_FIRST})
            }
          }
          .edgeEffect(EdgeEffect.Spring).scrollBar(BarState.Off)
        }
      }
      // .backgroundColor(Color.Red)
    }
    .titleBar({
      style: { // HdsNavigation标题栏样式设置
        // 标题栏动态模糊样式,包括是否使能滚动动态模糊,动态模糊类型,动态模糊生效的滚动距离等
        scrollEffectOpts: {
          enableScrollEffect: true,
          scrollEffectType: ScrollEffectType.COMMON_BLUR,
          blurEffectiveStartOffset: LengthMetrics.vp(0),
          blurEffectiveEndOffset: LengthMetrics.vp(20)
        },
        originalStyle: {
          backgroundStyle: {
            backgroundColor:'#87CEEB ',
          },
          contentStyle: {
            titleStyle: { mainTitleColor: $r('sys.color.font_primary'), subTitleColor: $r('sys.color.font_secondary') },
            menuStyle: { backgroundColor: $r('sys.color.comp_background_tertiary'), iconColor: $r('sys.color.icon_primary') },
            backIconStyle: { backgroundColor: $r('sys.color.comp_background_tertiary'), iconColor: $r('sys.color.icon_primary') }
          }
        }, scrollEffectStyle: {
          backgroundStyle: {
            backgroundColor: $r('sys.color.ohos_id_color_background_transparent'),
          },
          contentStyle: {
            titleStyle: { mainTitleColor: $r('sys.color.font_primary'), subTitleColor: $r('sys.color.font_secondary') },
            menuStyle: { backgroundColor: $r('sys.color.comp_background_tertiary'), iconColor: $r('sys.color.icon_primary') },
            backIconStyle: { backgroundColor: $r('sys.color.comp_background_tertiary'), iconColor: $r('sys.color.icon_primary') }
          }
        }
      },
      content: { // HdsNavigation标题栏内容区设置
        title: { // HdsNavigation标题栏标题设置
          mainTitle: 'Main',
          subTitle: this.subTitle
        },
        menu: { // HdsNavigation标题栏菜单项设置
          value: [{
            content: {
              label: 'menu1',
              icon: $r('sys.symbol.ohos_wifi'),
              isEnabled: true,
            },
            badge: {
              count: 1,
            }
          }, {
            content: {
              label: 'menu2',
              icon: $r('sys.symbol.ohos_lock'),
              isEnabled: true,
              action: () => {
                console.info("HDS_NAV HELLO 2");
              }
            }
          }, {
            content: {
              label: 'menu3',
              icon: $r('sys.symbol.speaker_plus'),
            }
          }, {
            content: { // 第三个菜单项内容设置
              label: 'menu4',
              icon: $r('sys.symbol.ohos_star'),
            }
          }]
        },
        backIcon: { // HdsNavigation返回按钮设置
          label: 'backButton',
          icon: $r('sys.symbol.ohos_mic'),
          isEnabled: true,
        }
      }
    })
    .titleMode(this.titleMode)
    .hideBackButton(this.isHideBackButton)
  }
}

我晚上看看,但是API18不会这样。。就是深浅色模式切换,(如果原来是模糊状态的话)标题栏模糊状态会没。。。

呸,API19的模拟器没有这个问题,切换深浅色,模糊会一直在。大概是丢失模糊,

鸿蒙Next中Hdsnavigation组件在API18上测试时,深浅色模式切换会导致顶部模糊状态丢失。此问题可能由系统主题变更时模糊效果未正确重建引起。建议检查WindowManager.LayoutParams的FLAG_BLUR_BEHIND属性设置,并确认在onConfigurationChanged回调中重新应用模糊效果。该组件对系统主题变化的响应处理可能存在缺陷,需要针对鸿蒙的UI刷新机制进行适配。

在HarmonyOS Next中,Hdsnavigation组件在深浅色模式切换时丢失顶部模糊状态的问题确实存在。这是API18版本的一个已知问题,主要原因是主题切换时模糊效果的重新渲染机制存在缺陷。

建议检查以下几点:

  1. 确保在onConfigurationChanged回调中正确处理了主题变更事件
  2. 尝试手动调用setBlurEffect()方法重新设置模糊效果
  3. 临时解决方案可以在主题切换后强制刷新导航栏

该问题预计会在后续API版本中修复,目前可以通过上述临时方案规避。

回到顶部