HarmonyOS 鸿蒙Next中麒麟8000模糊效果问题

HarmonyOS 鸿蒙Next中麒麟8000模糊效果问题 怎么识别其他机型到底支不支持模糊效果,在使用hdsNavigation组件标题栏设置有渐变模糊效果,旗舰机是正常的,但nova就是透明的,如何把不支持的机型屏蔽掉

8 回复

开发者您好,

本地测试暂未复现您反馈的问题,测试设备为nova13pro。为便于进一步排查,请您提供可稳定复现问题的最小化代码示例。

建议通过 deviceInfo 获取设备相关信息,可参考 [@ohos.deviceInfo (设备信息)](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-device-info#导入模块)模块。

在测试中,请将 BlurStrategy 参数设置为 ENABLE,并确认相关配置是否正确生效。

测试代码:

// 从6.0.2(22)版本开始,无需手动导入HdsNavigationAttribute。具体请参考HdsNavigation的导入模块说明。
import { HdsNavigation, HdsNavigationAttribute, ScrollEffectType, HdsNavigationTitleMode,BlurStrategy } from '@kit.UIDesignKit';
import { LengthMetrics } from '@kit.ArkUI';
import { deviceInfo } from '@kit.BasicServicesKit';

const TITLE_BAR_HEIGHT_FREE: number = 138;

@Entry
@Component
struct Index {
  @Provide('pageInfos') pageInfos: NavPathStack = new NavPathStack();
  scroller: Scroller = new Scroller();
  @State blankHeight: number = TITLE_BAR_HEIGHT_FREE;
  @State isHideBackButton: boolean = false;
  @State titleMode: HdsNavigationTitleMode = HdsNavigationTitleMode.MINI;
  @State subTitle: string = 'Sub'

  aboutToAppear(): void {
    let marketNameInfo: string = deviceInfo.marketName;
    // 输出结果:the value of the marketName is :Mate XX
    console.info('the value of the deviceInfo marketName is :' + marketNameInfo);

    let chipType: string = deviceInfo.chipType;
    // 输出结果:the value of the deviceInfo chipType is :xxxxx
    console.info('the value of the deviceInfo chipType is :' + chipType);
  }

  build() {
    HdsNavigation(this.pageInfos) {
      Column() {
        Stack() {
          Scroll(this.scroller) {
            Column() {
              Blank().height(this.blankHeight)
              Image($r('app.media.startIcon')).width('100%') // scenery为自定义资源,开发者需替换本地资源
            }
          }.edgeEffect(EdgeEffect.Spring).scrollBar(BarState.Off)
        }
      }
    }
    .titleBar({
      style: {
        blurStrategy:BlurStrategy.ENABLE,
        scrollEffectOpts: {
          enableScrollEffect: true,
          scrollEffectType: ScrollEffectType.COMMON_BLUR,
          blurEffectiveStartOffset: LengthMetrics.vp(0),
          blurEffectiveEndOffset: LengthMetrics.vp(20)
        },
        originalStyle: {
          backgroundStyle: {
            backgroundColor: $r('sys.color.ohos_id_color_background'),
          },
          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: {
        title: {
          mainTitle: 'Main',
          subTitle: this.subTitle
        },
        menu: {
          value: [{
            content: {
              label: 'menu1',
              icon: $r('sys.symbol.ohos_wifi'),
              isEnabled: true,
              action: () => {
                console.info("HdsNavigation menu1");
              }
            }
          }, {
            content: {
              label: 'menu2',
              icon: $r('sys.symbol.plus'),
              isEnabled: true,
            }
          }, {
            content: {
              label: 'menu3',
              icon: $r('sys.symbol.lock'),
            }
          }, {
            content: {
              label: 'menu4',
              icon: $r('sys.symbol.trunk'),
            }
          }]
        },
        backIcon: {
          label: 'backButton',
          icon: $r('sys.symbol.trunk'),
          isEnabled: true,
        }
      }
    })
    .titleMode(this.titleMode)
  }
}

更多关于HarmonyOS 鸿蒙Next中麒麟8000模糊效果问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


怎么根据不同机型实现不同模糊效果?

背景

在移动端开发中,由于不同机型的性能差异,直接使用CSS backdrop-filter 实现模糊效果可能会导致低端机型卡顿。因此,需要一种方案能够根据机型性能动态选择模糊实现方式。

解决方案

通过JavaScript检测机型性能,动态切换CSS类名,从而应用不同的模糊样式。

核心思路

  1. 使用 backdrop-filter 实现高性能模糊(适用于高端机型)
  2. 使用 background-color 半透明覆盖模拟模糊效果(适用于低端机型)

实现步骤

1. 定义CSS样式

/* 高性能模糊样式 */
.blur-effect {
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
}

/* 低性能替代方案 */
.blur-fallback {
  background-color: rgba(255, 255, 255, 0.7);
}

2. 机型检测逻辑

function canUseBackdropFilter() {
  // 检测是否支持backdrop-filter
  if (typeof CSS !== 'undefined' && CSS.supports) {
    return CSS.supports('backdrop-filter', 'blur(10px)') || 
           CSS.supports('-webkit-backdrop-filter', 'blur(10px)');
  }
  
  // 通过用户代理简单判断低端机型
  const userAgent = navigator.userAgent.toLowerCase();
  const isLowEndDevice = /android.*(4\.[0-3]|4\.4\.[0-4])|iphone.*os_[0-9]/.test(userAgent);
  
  return !isLowEndDevice;
}

3. 动态应用样式

function applyBlurEffect(element) {
  if (canUseBackdropFilter()) {
    element.classList.add('blur-effect');
    element.classList.remove('blur-fallback');
  } else {
    element.classList.add('blur-fallback');
    element.classList.remove('blur-effect');
  }
}

// 使用示例
const modal = document.querySelector('.modal-backdrop');
applyBlurEffect(modal);

优化建议

  1. 性能检测增强:可以添加FPS检测或渲染时间测试,更准确判断机型性能
  2. 渐进增强:默认使用降级方案,检测到高性能后再升级
  3. 缓存结果:将检测结果存储在本地,避免重复检测

注意事项

  • 在Android 4.x及iOS旧版本中谨慎使用backdrop-filter
  • 考虑电池节能模式下的性能限制
  • 测试不同场景下的滚动性能

总结

通过机型性能检测和样式动态切换,可以在保证用户体验的前提下,为不同性能的机型提供合适的模糊效果实现方案。

开发者您好,

可以通过设备信息动态设置不同机型的不同模糊效果

以下示例通过自定义一个方法,根据设备信息返回不同模糊枚举,该方案是否符合您的场景:

// 从6.0.2(22)版本开始,无需手动导入HdsNavigationAttribute。具体请参考HdsNavigation的导入模块说明。
import { HdsNavigation, HdsNavigationAttribute, ScrollEffectType, HdsNavigationTitleMode,BlurStrategy } from '@kit.UIDesignKit';
import { LengthMetrics } from '@kit.ArkUI';
import { deviceInfo } from '@kit.BasicServicesKit';

const TITLE_BAR_HEIGHT_FREE: number = 138;

@Entry
@Component
struct Index {
  @Provide('pageInfos') pageInfos: NavPathStack = new NavPathStack();
  scroller: Scroller = new Scroller();
  @State blankHeight: number = TITLE_BAR_HEIGHT_FREE;
  @State isHideBackButton: boolean = false;
  @State titleMode: HdsNavigationTitleMode = HdsNavigationTitleMode.FREE;
  @State subTitle: string = 'Sub'

  @State marketNameInfo: string = deviceInfo.marketName;

  aboutToAppear(): void {
    let marketNameInfo: string = deviceInfo.marketName;
    // 输出结果:the value of the marketName is :Mate XX
    console.info('the value of the deviceInfo marketName is :' + marketNameInfo);

    let chipType: string = deviceInfo.chipType;
    // 输出结果:the value of the deviceInfo chipType is :xxxxx
    console.info('the value of the deviceInfo chipType is :' + chipType);
  }

  getScrollEffectBlurStyle(marketNameInfo:string){
    if(marketNameInfo.replaceAll(' ','').toLowerCase().includes('nova13')){
      return ScrollEffectType.COMMON_BLUR
    }
    if(marketNameInfo.replaceAll(' ','').toLowerCase().includes('mate60')){
      return ScrollEffectType.GRADIENT_BLUR
    }

    return ScrollEffectType.COMMON_BLUR
  }

  build() {
    HdsNavigation(this.pageInfos) {
      Column() {
        Stack() {
          Scroll(this.scroller) {
            Column() {
              Blank().height(this.blankHeight)
              Text(this.marketNameInfo)
              Image($r('app.media.startIcon')).width('100%') // scenery为自定义资源,开发者需替换本地资源
            }
          }.edgeEffect(EdgeEffect.Spring).scrollBar(BarState.Off)
        }
      }
    }
    .titleBar({
      style: {
        blurStrategy:BlurStrategy.ENABLE,
        scrollEffectOpts: {
          enableScrollEffect: true,
          scrollEffectType: this.getScrollEffectBlurStyle(this.marketNameInfo),
          blurEffectiveStartOffset: LengthMetrics.vp(0),
          blurEffectiveEndOffset: LengthMetrics.vp(20)
        },
        originalStyle: {
          backgroundStyle: {
            backgroundColor: $r('sys.color.ohos_id_color_background'),
          },
          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: {
        title: {
          mainTitle: 'Main',
          subTitle: this.subTitle
        },
        menu: {
          value: [{
            content: {
              label: 'menu1',
              icon: $r('sys.symbol.ohos_wifi'),
              isEnabled: true,
              action: () => {
                console.info("HdsNavigation menu1");
              }
            }
          }, {
            content: {
              label: 'menu2',
              icon: $r('sys.symbol.plus'),
              isEnabled: true,
            }
          }, {
            content: {
              label: 'menu3',
              icon: $r('sys.symbol.lock'),
            }
          }, {
            content: {
              label: 'menu4',
              icon: $r('sys.symbol.trunk'),
            }
          }]
        },
        backIcon: {
          label: 'backButton',
          icon: $r('sys.symbol.trunk'),
          isEnabled: true,
        }
      }
    })
    .titleMode(this.titleMode)
  }
}

自定义沉浸光感效果可以通过getSystemMaterialTypes()接口查询当前设备所支持的材质能力。

HdsNavigation 组件的标题栏动态模糊效果(如渐变模糊)是一种对设备图形处理能力有一定要求的高级特性,并非所有机型都能完美支持。旗舰机型通常具备更强的GPU性能,因此能流畅渲染,而部分中端机型(如您提到的nova系列)可能会因为性能策略或硬件限制,无法呈现该效果,直接显示为透明背景。

那怎么实现旗舰机支持,麒麟8000系列的机型不使用模糊效果,需要判断 型号代码 来实现设备不同UI效果吗,

在HarmonyOS Next中,麒麟8000芯片的模糊效果问题通常与系统图形渲染引擎或GPU驱动适配有关。鸿蒙Next的图形子系统基于ArkUI框架,模糊效果由系统级渲染服务管理。若出现异常,可能是特定版本的系统UI组件与麒麟8000的GPU指令集兼容性导致,需检查HarmonyOS SDK中与图形处理相关的API调用是否符合规范。建议关注华为官方发布的系统更新或补丁。

在HarmonyOS Next中,模糊效果(如BlurStyle)的硬件支持确实存在机型差异,这通常与GPU性能或系统底层优化有关。要识别当前设备是否支持模糊效果并进行条件渲染,建议采用以下方法:

  1. 使用系统能力查询:这是最直接和推荐的方式。可以通过@ohos.abilityAccessCtrl模块的SystemCapability相关API来查询设备图形处理能力。虽然目前没有直接的“模糊效果支持”标识,但可以查询图形相关的系统能力(如Graphics.Support.BlurEffect或类似标识,具体名称需查阅最新API文档),或通过设备型号、GPU型号进行间接判断。

  2. 设备型号/系列判断:如果系统能力查询无法满足,可以结合设备型号进行判断。通过@ohos.deviceInfo获取设备型号(如getModel()),建立已知支持模糊效果的机型列表(如麒麟9000系列、麒麟8000系列的部分机型)。对于不在列表中的设备(如部分Nova机型),视为不支持。

    import deviceInfo from '@ohos.deviceInfo';
    
    const supportBlurModels = ['ELZ-AN00', 'TET-AN00']; // 示例:支持模糊的机型列表
    const currentModel = deviceInfo.model;
    
    const isBlurSupported = supportBlurModels.includes(currentModel);
    
  3. 组件条件渲染:在hdsNavigation组件中,根据判断结果动态设置样式。如果不支持模糊效果,可以降级为半透明背景或纯色背景。

    // 示例:在组件样式中条件应用模糊效果
    .titleBar {
      background-color: rgba(255, 255, 255, 0.9); /* 降级方案:半透明背景 */
      @if isBlurSupported {
        backdrop-filter: blur(20px); /* 支持模糊时应用 */
      }
    }
    
  4. 降级处理:对于不支持模糊效果的机型,建议提供视觉相近的替代方案,如使用rgba设置半透明背景色,确保UI整体协调性。

注意:设备型号判断方法需维护机型列表,后续新机型可能需要更新。建议优先采用系统能力查询(若未来提供相关标识),并关注HarmonyOS SDK的更新,以获取更标准的支持检测方式。

回到顶部