尧图精选

【共创稿事节】HarmonyOS 7氛围设计:光影与声音协同的情绪传递

🕒 发布时间:2026/10/2 17:07:42 📁 来源:尧图网络
单独调光画面会亮但缺口气单独调声耳朵有反应但眼睛没跟上。氛围是光影和声音一起作用的结果——用户说不出哪里变了但整个人就是更专注、更放松或者更警觉了。空间计算里氛围是可以被设计、被配置、被复用的前提是把情绪拆成两组可调的参数并且让它们同步变化。先把情绪拆成三个档位情绪是连续的但落到实现上必须离散化成可配置的档位否则调不动。常用的划分是专注、放松、紧张三档覆盖绝大多数内容型场景。专注。需要用户长时间投入目标是减少干扰、维持清醒。视觉上避免高饱和和强动效声音上避免有旋律、有歌词的内容。放松。目标是降低唤醒水平让用户从紧绷状态松弛下来。视觉偏暖、偏柔声音节奏慢、音色暖、带一点混响。紧张。目标是提升警觉、制造推进感。视觉对比强、动效快声音节奏快、高频突出、混响少干声更贴身。这三个档位不是情绪的全部但它们是坐标轴上的锚点中间态可以通过参数插值得到。光与声音各自管什么把两类媒介的可调维度列清楚才知道协同要从哪里对齐。光影这边色温暖偏黄橙→ 放松冷偏蓝→ 专注、理性。亮度整体明度决定画面的重量。对比度明暗差异决定画面紧不紧张。渐变方向与柔和度硬边渐变锋利、紧张大范围柔和渐变安静。动效时长200ms 以内显得利落、紧张600ms 以上显得舒缓。模糊与景深虚化范围大、景深深留白多更容易放松。声音这边音量整体响度。音色低频厚实 稳、暖高频明亮 清醒、紧张。节奏BPM60~80 偏放松90~120 偏专注120 以上偏紧张。混响 / 距离混响多 远、空、放松混响少 近、贴身、紧张。空间感声场宽、有方位 沉浸单点居中 聚焦。协同的关键是同向。要放松光和声都往慢、暖、远走要紧张两者都往快、冷、近走。一个往东一个往西用户只会觉得别扭。建立映射场景 → 情绪 → 参数映射方法分三步。明确场景要用户处在什么状态。读书页要专注冥想页要放松限时任务页要适度紧张。从情绪推导两组参数的目标值。落到具体 API。光影用animateTo做参数过渡声音用AudioRenderer.setVolume及相关播放参数。下面这张氛围配置表可以作为起点实际产品按品牌调性微调。场景目标情绪主色调亮度对比度动效时长音量音色节奏空间感阅读专注冷灰 / 米白中中高200ms低中频干净无 / 白噪居中冥想放松暖橙 / 深青低低800ms很低低频厚慢宽、环绕音乐播放沉浸跟随封面中低中400ms中全频跟随曲目宽、有方位限时挑战紧张高饱和红橙高高120ms中高高频亮快贴身夜间模式放松深褐 / 暗红很低低600ms低柔慢居中代码可切换的氛围状态把三档氛围抽象成一组参数切换时用属性动画平滑过渡。核心是光影用animateTo缓存一次状态变更声音用setVolume同步调整。import{audio}fromkit.AudioKit;// 氛围档位光影与声音参数打包在一起保证同向变化interfaceAtmosphere{bgTop:ResourceColor;// 背景渐变起始色bgBottom:ResourceColor;// 背景渐变结束色textColor:ResourceColor;duration:number;// 动效时长映射快/慢volume:number;// 音频音量ambientBlur:number;// 背景模糊半径映射远/近}EntryComponentstruct AtmospherePage{// 三档氛围配置一一对应专注 / 放松 / 紧张privatepresets:Recordstring,Atmosphere{专注:{bgTop:#F2F4F8,bgBottom:#E2E6EE,textColor:#1A1A1A,duration:200,volume:0.3,ambientBlur:0},放松:{bgTop:#3A2E28,bgBottom:#6B4F3A,textColor:#F5EDE4,duration:800,volume:0.15,ambientBlur:20},紧张:{bgTop:#2A0A0A,bgBottom:#8A1F1F,textColor:#FFF0F0,duration:120,volume:0.6,ambientBlur:0}};StatepresetKey:string专注;privatecurrent:Atmospherethis.presets[专注];privaterenderer:audio.AudioRenderer|undefinedundefined;// 切换氛围光影与声音在同一时刻朝同一方向变化privateswitchAtmosphere(key:string):void{constnextthis.presets[key];// 光影参数用 animateTo 过渡时长取自当前氛围的 durationthis.getUIContext().animateTo({duration:next.duration,curve:Curve.EaseInOut},(){this.presetKeykey;this.currentnext;});// 声音同步调整音量避免光影已经切换、声音还停在上一档this.applyVolume(next.volume);}privateapplyVolume(v:number):void{if(this.rendererundefined){return;}// setVolume 用于调整播放响度和光影亮度保持同向this.renderer.setVolume(v);}build(){Column(){Text(当前氛围${this.presetKey}).fontSize(20).fontColor(this.current.textColor)Row({space:12}){Button(专注).onClick(()this.switchAtmosphere(专注))Button(放松).onClick(()this.switchAtmosphere(放松))Button(紧张).onClick(()this.switchAtmosphere(紧张))}.margin({top:24})}.width(100%).height(100%).justifyContent(FlexAlign.Center)// 背景用渐变承载色温与明度模糊承载景深.linearGradient({angle:180,colors:[[this.current.bgTopasstring,0.0],[this.current.bgBottomasstring,1.0]]}).animation({duration:this.current.duration,curve:Curve.EaseInOut})}}这段代码里有个取舍linearGradient的 colors 变化无法被animation直接插值实际过渡要么走animateTo包裹的状态更新要么用两层渐变叠透明度做交叉淡化。上面同时用了两种方式真实项目里选一种即可避免效果重复。案例冥想页的氛围组合冥想页目标是把用户从刚放下手机的紧绷状态带到放松。光影和声音要一起往下走。光影侧背景从暖橙过渡到深青的垂直渐变亮度压到很低避免强光刺激进入时用 800ms 的缓动页面像沉下来而不是弹出来背景图片叠一层模糊制造景深把注意力从背景收进内容。声音侧环境音用低频厚实的音色音量很低0.1~0.2 区间存在感弱领读语音或引导音从正前方、近处来和环境音拉开距离让引导贴身、环境包住如果设备支持空间音频环境音铺满声场引导音有明确方位。import{audio}fromkit.AudioKit;import{BusinessError}fromkit.BasicServicesKit;import{common}fromkit.AbilityKit;// 冥想页低音量 空间化环境音 近距离引导音asyncfunctionstartMeditationAmbient(context:common.UIAbilityContext):Promiseaudio.AudioRenderer|undefined{constaudioManageraudio.getAudioManager();constspatialaudioManager.getSpatializationManager();// 环境音走低音量配合光影的低亮度constoptions:audio.AudioRendererOptions{streamInfo:{samplingRate:audio.AudioSamplingRate.SAMPLE_RATE_48000,channels:audio.AudioChannel.CHANNEL_2,sampleFormat:audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,encodingType:audio.AudioEncodingType.ENCODING_TYPE_RAW},rendererInfo:{usage:audio.StreamUsage.STREAM_USAGE_MUSIC,// 环境音可与其他音乐并发rendererFlags:0}};// 只有设备支持时才主打空间化否则退化为普通立体声constroutingaudioManager.getRoutingManager();constoutputrouting.getDevicesSync(audio.DeviceFlag.OUTPUT_DEVICES_FLAG);constspatialReadyoutput.some((d)d.spatializationSupported)spatial.isSpatializationEnabledForCurrentDevice();returnnewPromise((resolve){audio.createAudioRenderer(options,(err:BusinessError,renderer:audio.AudioRenderer){if(err){console.error(createAudioRenderer failed:${err.code},${err.message});resolve(undefined);return;}renderer.setVolume(0.15);// 与环境光的低亮度同向console.info(meditation ambient ready, spatial${spatialReady});resolve(renderer);});});}氛围切换的时序光影和声音必须一起变否则会有画面已经换了、声音还没跟上的割裂感。用一个统一的切换入口让两组参数在同一帧开始变化。音频层光影层氛围页面用户音频层光影层氛围页面用户两组参数的过渡时长需一致或成比例选择氛围档位查预置参数表animateTo 更新渐变与模糊setVolume 同步音量背景色温与景深过渡响度与声场过渡几条经验哦先定情绪再定参数。不要从我想加个橙色出发要从这里要让人放松出发。光影和声音的参数要打包成一份配置。分成两个地方维护迟早会出现方向不一致。过渡时长是情绪表达的一部分。200ms 的切换利落800ms 的切换舒缓同一组颜色换时长感觉就不同。氛围配置要能整体替换。品牌换色、节日主题、夜间模式本质都是换一份氛围表。留一个静音 / 关动效的开关。用户对光和声的敏感度差异很大把控制权交出去。只在视觉上做氛围忽略音频。用户戴耳机时声场对情绪的影响不比画面小。用高音量表达沉浸。沉浸来自声场和层次不来自响度音量大只会让人疲劳。动效时长和音频淡入淡出不对齐切换时出现明显的抢拍。把氛围参数写死在多处组件里改一次要翻十几个文件。集中成配置表页面只引用。夜间场景忘了压亮度深色背景配高亮强调色反差过大依然刺眼。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →