HarmonyOS 7 新特性(四)封面

适用范围:HarmonyOS 7、API 26 Developer Beta。沉浸光感在不同系统版本、设备算力等级和窗口形态上的效果可能不同。本文把它当成一套“可分级的语义材质系统”,而不是固定滤镜参数。

很多沉浸光感方案在设计稿里很惊艳,一放进真实应用就出现三个问题:长列表滚动掉帧、深色模式文字对比不足、低算力设备降级后层级消失。原因通常不是某个属性写错,而是一开始就把“材质效果”当成页面装饰,没有定义它服务于什么语义、消耗多少预算、降级后还要保留什么。

本文以音乐播放器的“主播放控制、悬浮工具栏、精选卡片”为例,建立从设计 Token、设备能力判断、运行时降级到性能验收的完整方法。

一、先区分视觉效果和交互语义

模糊、阴影、描边描述的是“怎么画”;主操作、浮层、选中态描述的是“为什么画”。业务组件应该请求语义,不应自己决定一组滤镜参数。

语义角色 适用位置 用户必须感知 不适用位置
Primary Action 播放、拍摄、确认 可点击、按压、释放 一屏多个同等级按钮
Floating Tool 悬浮播放条、工具栏 位于内容上层 普通列表分割线
Featured Surface 少量精选内容 与背景有层次 每一行列表项
Selection 当前选中对象 明确状态变化 只靠光效表示选中

一个页面通常只需要少量高等级材质。若每张卡片都在“发光”,光感就不再表达层级,只会增加噪声和渲染成本。

HarmonyOS 7 新特性核心链路图

二、把材质参数收口到 Token

页面禁止直接散落模糊半径、阴影、透明度和描边值。建议先定义语义 Token,再由平台层根据材质等级解析。

type MaterialRole =
  | 'primary-action'
  | 'floating-tool'
  | 'featured-surface'
  | 'selection'

interface MaterialTokens {
  backgroundColor: ResourceColor
  borderColor: ResourceColor
  borderWidth: number
  shadowLevel: number
  filterStrength: number
  motionScale: number
}

function resolveMaterial(role: MaterialRole,
  level: DeviceMaterialLevel): MaterialTokens {
  return materialRegistry[level][role]
}

上面是设计系统伪代码,不对应某个单一 ArkUI 属性。它的价值是让 API、视觉规范或性能策略变化时集中修改,而不是全仓库搜索魔法数字。

三、原生侧先读取设备材质等级

API 26 Native 参考中提供 OH_ArkUI_NativeModule_GetGlobalMaterialLevel,用于获取全局材质等级。相关能力位于 native_material.h,返回的 ArkUI_MaterialLevel 决定设备可承载的效果上限。

#include <arkui/native_material.h>

ArkUI_MaterialLevel QueryMaterialLevel() {
  ArkUI_MaterialLevel level;
  int32_t result = OH_ArkUI_NativeModule_GetGlobalMaterialLevel(&level);
  if (result != 0) {
    return ARKUI_MATERIAL_LEVEL_LOW;
  }
  return level;
}

代码展示的是能力探测思路,返回值和枚举名请以当前 API 26 头文件为准。探测失败时应保守回退低等级,而不是默认开启最高效果。

官方参考说明,高、中、低算力下受影响的材质参数并不完全相同:高、中等级会影响滤镜和阴影,低等级更多依靠背景、边框、宽度和基础阴影保持层次。因此“低档”不是“把 opacity 设为 0”,而是另一套完整视觉方案。

四、在平台适配层做三档映射

const materialRegistry: MaterialRegistry = {
  high: {
    'primary-action': {
      filterStrength: 1.0, shadowLevel: 3,
      borderWidth: 1, motionScale: 1.0
    }
  },
  middle: {
    'primary-action': {
      filterStrength: 0.55, shadowLevel: 2,
      borderWidth: 1, motionScale: 0.65
    }
  },
  low: {
    'primary-action': {
      filterStrength: 0, shadowLevel: 1,
      borderWidth: 2, motionScale: 0
    }
  }
}

这些数值只是示意,项目应由设计、性能和无障碍共同标定。业务侧只能传 role,不允许传 forceHighMaterial: true 绕过平台判断。

五、实现一个语义材质组件

组件必须把“材质支持”和“业务状态”分开。即使没有高级光效,禁用、加载、选中和错误仍然要看得懂。

@Component
struct SemanticMaterialSurface {
  @Prop role: MaterialRole
  @Prop selected: boolean = false
  @Prop disabled: boolean = false

  build() {
    const token = MaterialRuntime.resolve(this.role)
    Stack() {
      this.contentBuilder()
    }
    .backgroundColor(token.backgroundColor)
    .border({
      width: this.selected ? token.borderWidth + 1 : token.borderWidth,
      color: this.selected ? $r('app.color.focus') : token.borderColor
    })
    .opacity(this.disabled ? 0.45 : 1)
    .accessibilityState({ disabled: this.disabled, selected: this.selected })
  }
}

这是结构示例,沉浸材质的具体 ArkUI 属性应按官方当前指南接入。重点是:选中态还有边框和可访问状态,禁用态不靠“光消失”表达,业务状态不会随材质等级一起丢失。

六、为页面设定材质预算

性能治理不能等到掉帧后再删效果。建议在设计评审时就给页面写预算:同时活跃的高等级材质数量、最大作用面积、允许的持续动画数、列表中是否可复用。

场景 高档策略 中档策略 低档策略
主播放按钮 完整光随指动 缩短半径与持续时间 实色、描边、按压缩放
悬浮播放条 材质 + 阴影 弱滤镜 + 阴影 不透明背景 + 分割线
精选卡片 仅首屏少量启用 静态材质 普通 Surface
长列表行 默认禁用 禁用 禁用
后台/离屏 停止更新 停止更新 无动态效果

这种表格应进入组件规范,而不是只存在于性能同学的测试报告里。

七、光随指动必须受状态机约束

指针移动、按下、移出、释放和取消可能乱序到达。如果每个事件直接修改多个动画属性,组件很容易停在错误状态。

IDLE ──pointerDown──> PRESSED
  ↑                     │
  └──pointerUp──────────┘
  ↑                     │
  └──pointerCancel──────┘

PRESSED ──pointerMove──> PRESSED(position updated)
function reduceLightState(state: LightState, event: PointerEvent): LightState {
  switch (event.type) {
    case 'down': return { kind: 'pressed', point: event.point }
    case 'move': return state.kind === 'pressed'
      ? { kind: 'pressed', point: event.point } : state
    case 'up':
    case 'cancel': return { kind: 'idle' }
  }
}

位置更新应合并到渲染节奏,不要为每个原始移动事件触发整棵页面重建。组件离屏、窗口失焦或应用进入后台时,统一发送 cancel

八、无障碍与减少动态效果是硬约束

光感不能成为唯一信息通道。选中态要有文字、图标、边框或可访问属性;错误态要有明确提示;点击目标要满足触控尺寸;深浅色模式分别验证对比度。

当用户开启“减少动态效果”或设备处于省电策略时,运行时应把 motionScale 降到 0 或使用短暂透明度变化,同时保留按压反馈。

function resolveMotion(base: MaterialTokens,
  settings: AccessibilitySettings): MaterialTokens {
  if (settings.reduceMotion || settings.powerSaving) {
    return { ...base, motionScale: 0, filterStrength: 0 }
  }
  return base
}

九、用基线—增量法测性能

先关闭沉浸材质记录基线,再按“主操作—悬浮工具—精选卡片”的顺序逐项开启。每一步都在同一设备、同一数据、同一窗口和同一路径下测量。

至少记录:页面首帧、滚动帧时间、GPU 负载、内存、温升、连续交互 5 分钟后的稳定性。重点场景包括快速滑动、连续按压、弹窗叠加、分屏/自由窗口、深浅色切换和前后台恢复。

performanceTrace.begin('material-press')
controller.onPointerDown(fixturePoint)
controller.onPointerUp()
performanceTrace.end('material-press', {
  role: 'primary-action',
  materialLevel: runtime.level,
  reducedMotion: settings.reduceMotion
})

埋点应记录语义角色和材质等级,不记录用户内容。若只记录整页平均帧率,无法判断是哪一种材质在什么设备上超出预算。

十、常见问题与正确修法

  1. 低档设备效果消失:补齐低档背景、描边和按压反馈,而不是强制高档。
  2. 列表滑动抖动:移除列表行实时材质,停止离屏更新,检查状态是否导致父级重建。
  3. 深色模式文字发灰:重新标定前景色和材质背景,不要简单反色。
  4. 多个组件同时抢焦点:限制页面高等级材质数量,明确主次语义。
  5. 动效结束后状态错误:使用可穷尽状态机,取消时统一复位。

十一、自动化与真机验收

describe('material fallback', () => {
  it('keeps selection visible at low level', () => {
    runtime.setLevel('low')
    const style = renderSurface({ role: 'selection', selected: true })
    expect(style.borderWidth).toBeGreaterThan(0)
    expect(style.accessibilityState.selected).toBe(true)
  })

  it('disables motion when reduce-motion is enabled', () => {
    settings.reduceMotion = true
    expect(runtime.resolve('primary-action').motionScale).toBe(0)
  })
})

自动化检查语义不丢失,真机检查实际帧时间、温升和手感。至少保留高、中、低三档证据;不能只用旗舰机截图代表全部设备。

十二、上线检查清单

  • 业务组件只引用语义角色,不写死滤镜和阴影;
  • 原生能力探测失败时保守回退;
  • 高、中、低档都有完整可读的视觉方案;
  • 页面有明确的材质数量、面积和动画预算;
  • 列表离屏、窗口失焦和后台时停止动态更新;
  • 选中、禁用、错误不依赖光效单独表达;
  • 减少动态效果和省电策略可以覆盖默认配置;
  • 真机覆盖深浅色、分屏、自由窗口和连续交互;
  • 性能回归可以定位到语义角色和设备等级。

HarmonyOS 7 新特性落地验收清单

结语

沉浸光感的价值不是让界面“更亮”,而是让主次、材质和动作反馈更自然。真正高质量的实现,需要把它收口为语义组件,用设备等级决定效果上限,用 Token 管理降级,用状态机约束交互,再用真机数据证明没有牺牲可读性和稳定性。这样它才是产品能力,而不是只在设计稿里成立的特效。

官方参考

  • ArkUI_ImmersiveMaterial:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/capi-arkui-nativemodule-arkui-immersivematerial
  • HarmonyOS 7 新能力一览:https://developer.huawei.com/consumer/cn/features/
  • 2026 年 6 月开发者月刊:https://developer.huawei.com/consumer/cn/monthly/202606
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。