HarmonyOS鸿蒙Next中Ability如何监听系统字体大小变更?比如用户在设置中调大了文字。

HarmonyOS鸿蒙Next中Ability如何监听系统字体大小变更?比如用户在设置中调大了文字。 我们的阅读 App 需要响应系统字体缩放,但不确定是否有回调。

5 回复

【解决方案】

  • 字体大小跟随系统变化的功能。

在不改变应用默认字体像素单位,即fp,通过配置configuration标签fontSizeScale参数为followSystem,可实现应用字体大小跟随系统变化的能力。

  1. 新建配置文件“AppScope/resources/base/profile/configuration.json”。
    {
      "configuration": {
        "fontSizeScale": "followSystem",
        "fontSizeMaxScale": "3.2"
      }
    }
    
  2. 在“AppScope/app.json5”文件中引用该配置。
    {
      "app": {
        "bundleName": "com.example.q202410164817582",
        "vendor": "example",
        "versionCode": 1000000,
        "versionName": "1.0.0",
        "icon": "$media:layered_image",
        "label": "$string:app_name",
        // 在此处引用
        "configuration": "$profile:configuration"
      }
    }
    
    注意:如需要监听系统缩放比例系数来修改应用内字体大小,参考:如何获取系统缩放比例系数来修改应用内字体大小
  • 显示大小缩放是否跟随系统实施方案。
    • 设置应用显示大小缩放不跟随系统变化的功能。 通过使用窗口方法,设置setDefaultDensityEnabled为true,使得窗口不跟随系统显示大小变化重新布局。
    • 设置应用显示大小缩放跟随系统变化的功能。 应用显示大小缩放默认会跟随系统显示大小变化重新布局,如果使用了setDefaultDensityEnabled接口,设置setDefaultDensityEnabled为false即可。
  • 字体粗细是否跟随系统实施方案。 应用内字体粗细默认跟随系统字体粗细变化,目前暂无应用级接口设置字体粗细不跟随系统变化。 Text组件提供了设置文本字重的属性fontweight,可以通过配置enableVariableFontWeight为true,来达到调节组件级字体粗细的目的。

【背景知识】

  • configuration标签:该标签是一个profile文件资源,用于指定描述应用字体大小跟随系统变更的配置文件。在开发视图的“AppScope/resources/base/profile”下面定义配置文件configuration.json。同时需要在AppScope/app.json5中配置configuration标签后,该标签才能生效。
  • 影响字体大小的另一个重要因素就是像素单位,ArkUI支持如下四种像素单位
    • 应用字体默认像素单位为fp,配置过configuration标签之后,应用字体大小就会跟随系统变化。
    • 当应用字体像素为其它非fp单位时,应用字体大小不随configuration标签配置而变化。此时,可以在UIAbility组件中订阅回调,使应用字体跟随系统变化。
  • [@ohos.window(窗口)](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-window)中提供的setDefaultDensityEnabled方法可以设置应用显示大小缩放是否跟随系统变化。不调用此接口进行设置,则表示不使用系统默认Density,即应用显示大小缩放默认会跟随系统显示大小变化重新布局。

更多关于HarmonyOS鸿蒙Next中Ability如何监听系统字体大小变更?比如用户在设置中调大了文字。的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,Ability可通过Configuration对象监听系统字体大小变更。使用onConfigurationUpdate回调方法,当系统配置(包括字体大小)变化时,系统会调用此方法。在回调中可获取新的Configuration对象,并通过fontScale属性获取当前字体缩放比例,从而进行界面适配。

在HarmonyOS Next中,Ability可以通过订阅系统配置变化来监听字体大小变更。具体步骤如下:

  1. 导入@kit.AbilityKit@kit.ConfigurationKit模块。
  2. 在Ability的onCreate或适当生命周期中,使用configuration.on('fontScaleChange')注册监听器。
  3. 在回调函数中处理字体缩放逻辑,例如重新计算UI布局或刷新文本显示。
  4. 在Ability销毁时,调用configuration.off('fontScaleChange')取消订阅。

关键代码示例:

import { Ability, UIAbility } from '@kit.AbilityKit';
import { configuration } from '@kit.ConfigurationKit';

export default class EntryAbility extends UIAbility {
  onWindowStageCreate(windowStage: window.WindowStage) {
    // 订阅字体缩放变化
    configuration.on('fontScaleChange', (fontScale: number) => {
      // 处理字体缩放逻辑,例如:
      // 1. 更新应用内字体缩放系数
      // 2. 触发UI重新渲染
      console.log(`Font scale changed to: ${fontScale}`);
    });
  }

  onDestroy() {
    // 取消订阅
    configuration.off('fontScaleChange');
  }
}

注意事项:

  • 字体缩放系数fontScale为数值类型,表示相对于系统基准字体的缩放比例。
  • 该监听为系统级事件,应用切换到后台时仍可能触发,建议在回调中做好状态判断。
  • 对于声明式开发范式(ArkTS),通常推荐使用@StorageProp@StorageLink关联系统配置,配合响应式UI自动更新。

通过以上方式,当用户在系统设置中调整字体大小时,Ability会收到回调并执行相应处理,确保阅读类应用的文本显示能正确适配。

回到顶部