当前位置: 首页 > news >正文

Harmonyos之字体设置功能

Harmonyos之字体设置功能

  • 概述
  • PreferenceUtils(工具类)
  • 字体适配步骤
    • 监听系统环境变量改变
    • 设置页功能
      • 初始化
      • 字体大小跟随系统
      • 修改字体大小

概述

字体大小适配是我们app在适配过程中比较常用的一个适配项, 这里我们学习下在鸿蒙项目适配中是如何实现 ,自定义字体显示文本、自定义字体恢复为系统字体、字体大小跟随系统设置、字体大小不跟随系统设置等功能。

PreferenceUtils(工具类)

const TAG = 'PreferenceUtils';
const TEXT_FONT_SIZE = 'textFontSize';
const TEXT_FONT_WEIGHT = 'textFontWeight';
const TEXT_FONT = 'textFont';export class PreferenceUtils {preference?: preferences.Preferences;// 创建PreferenceUtils实例getTextFontPreference(context: Context) {try {this.preference = preferences.getPreferencesSync(context, { name: 'TextFontPreference' });hilog.info(0x0000, TAG, 'create preference success');} catch (err) {let error = err as BusinessError;hilog.error(0x0000, TAG, `create preference faile. code: ${error.code}, message:${err.message}`);}}// 保存修改的字体大小saveModifyFontSize(fontValue: number) {try {this.preference?.putSync(TEXT_FONT_SIZE, fontValue);this.preference?.flush((err: BusinessError) => {if (err) {hilog.error(0x0000, TAG, `Failed to flush. code:${err.code}, message:${err.message}`);return;}})} catch (err) {let error = err as BusinessError;hilog.error(0x0000, TAG,`putSync or flush fontSize preference data faile. code: ${error.code}, message:${err.message}`);}}// 获取当前缓存的字体大小getFontSize(): number {let textFontSize: number = 0;try {textFontSize = this.preference?.getSync(TEXT_FONT_SIZE, 0) as number;} catch (err) {let error = err as BusinessError;hilog.error(0x0000, TAG, `getSync fontSize preference data faile. code: ${error.code}, message:${err.message}`);}return textFontSize;}// 保存修改的字体粗细saveModifyFontWeight(fontValue: number) {try {this.preference?.putSync(TEXT_FONT_WEIGHT, fontValue);this.preference?.flush((err: BusinessError) => {if (err) {hilog.error(0x0000, TAG, `Failed to flush. code:${err.code}, message:${err.message}`);return;}hilog.info(0x0000, TAG, 'Succeeded in flushing.');})} catch (err) {let error = err as BusinessError;hilog.error(0x0000, TAG,`putSync or flush fontWeight preference data faile. code: ${error.code}, message:${err.message}`);}}// 获取当前缓存的字体粗细getFontWeight(): number {let textFontWeight: number = 0;try {textFontWeight = this.preference?.getSync(TEXT_FONT_WEIGHT, 400) as number;} catch (err) {let error = err as BusinessError;hilog.error(0x0000, TAG, `getSync fontWeight preference data faile. code: ${error.code}, message:${err.message}`);}return textFontWeight;}// [EndExclude GetFont]// 保存 修改的字体saveModifyFont(textFont: string) {try {this.preference?.putSync(TEXT_FONT, textFont);this.preference?.flush((err: BusinessError) => {if (err) {hilog.error(0x0000, TAG, `Failed to flush. code:${err.code}, message:${err.message}`);return;}hilog.info(0x0000, TAG, 'Succeeded in flushing.');})} catch (err) {let error = err as BusinessError;hilog.error(0x0000, TAG,`putSync or flush font preference data faile. code: ${error.code}, message:${err.message}`);}}// 获取当前使用的字体getFont(): string {let textFont: string = '';try {textFont = this.preference?.getSync(TEXT_FONT, '') as string;} catch (err) {let error = err as BusinessError;hilog.error(0x0000, TAG, `getSync font preference data faile. code: ${error.code}, message:${err.message}`);}return textFont;}
}export default new PreferenceUtils();

字体适配步骤

监听系统环境变量改变

API: ApplicationContext.on('environment') 监听系统环境变量

首先我们在EntryAbility中的onCreate方法中,需要如下操作

// 字体对象类型
export interface FontType {fontSizeScale: number | undefined,fontWeightScale: number | undefined
}
// 字体对象
let envFont: FontType = {fontSizeScale: 0,fontWeightScale: 0,
};onCreate(_want: Want, _launchParam: AbilityConstant.LaunchParam): void {// 获取字体缓存对象PreferenceUtils.getTextFontPreference(this.context);// 创建一个监听系统环境变量变化的回调,获取系统字体大小和字体粗细的初始化大小let envCallback: EnvironmentCallback = {onConfigurationUpdated(config) {// 字体大小envFont.fontSizeScale = config.fontSizeScale; // Font size scaling ratio// 字体粗细envFont.fontWeightScale = config.fontWeightScale; // Font thickness scaling ratio},onMemoryLevel(level) {hilog.info(DOMAIN, TAG, `onMemoryLevel level: ${level}`);}}// 获取应用级别的上下文对象let appContext = this.context.getApplicationContext();.// 注册对系统环境变化的监听。使用callback异步回调。仅支持主线程调用callbackId = appContext.on('environment', envCallback);// 创建一个全局缓存对象, 字体对象AppStorage.setOrCreate('envFont', envFont);//  设置应用的深浅模式
this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET);}

在EntryAbility销毁时, 需要注销监听:
onDestroy(): void {
let appContext = this.context.getApplicationContext();
appContext.off(‘environment’, callbackId, (error, data) => {
if (error) {
hilog.error(DOMAIN, TAG, unregisterEnvironmentCallback fail, err: ${JSON.stringify(error)});
}
hilog.info(DOMAIN, TAG, unregisterEnvironmentCallback success, data: ${JSON.stringify(data)});
});

hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onDestroy');

}

设置页功能

初始化

('fontOffset') fontOffset: string = '';
aboutToAppear() {// 获取全局缓存的字体对象this.envFont = AppStorage.get('envFont');// 获取当前使用的字体this.fontOffset = PreferenceUtils.getFont();// 注册自定义的字体registerMyFont(this.getUIContext());}// 创建一个全局函数来注册自定义的字体
export function registerMyFont(uiContext: UIContext) {try {// 注册自定义的字体uiContext.getFont().registerFont({familyName: $r('app.string.HarmonyOS_Italic'),familySrc: $rawfile('HarmonyOS_SansItalic.ttf')});// 注册自定义的字体uiContext.getFont().registerFont({familyName: $r('app.string.HarmonyOS_Condensed'),familySrc: $rawfile('HarmonyOS_Condensed.ttf')});} catch (err) {let error = err as BusinessError;hilog.error(0x0000, TAG, `registerFont faile. code: ${error.code}, message:${err.message}`);}
}

字体大小跟随系统

export function fp2pxUtil(fp: number): string {const pxStr: string = 'px';let pxVal: number = 0;let displayClass: display.Display | null = null;try {displayClass = display.getDefaultDisplaySync();pxVal = fp * (displayClass.densityDPI / 160);} catch (err) { let error = err as BusinessError;hilog.error(0x0000, TAG, `get densityDPI faile. code: ${error.code}, message:${err.message}`);}return pxVal + pxStr;
}//使用地方:.font({ size: this.toggleState ? 14 : fp2pxUtil(14), weight: 500 })

修改字体大小

调用工具类方法缓存设置的字体大小、字体粗细、字体等信息, 然后通过StorageLink 来设置其他页面变化

 ('fontOffset') fontOffset: string = '';('toggleState') toggleState: boolean = false;('fontSizeOffset') fontSizeOffset: number = 0;('fontWeightOffset') fontWeightOffset: number = 400;// 字体大小Slider({min: -4,max: 4,value: this.fontSizeOffset,style: SliderStyle.InSet}).width('90%').margin({ top: 12 }).enabled(!this.toggleState)// [Start Write_FontSize_Data].onChange((data: number) => {this.fontSizeOffset = data;PreferenceUtils.saveModifyFontSize(data);})// 字体粗细Slider({min: 100,max: 900,step: 100,value: this.fontWeightOffset,style: SliderStyle.InSet}).width('100%').stepSize(5).showSteps(true).margin({ top: 12 }).enabled(!this.toggleState).onChange((data: number) => {this.fontWeightOffset = data;PreferenceUtils.saveModifyFontWeight(data);})

像字体适配、颜色适配,其实我们可以封装一个主题对应, 统一通过这个主题对象来修改变化

http://www.dtcms.com/a/337805.html

相关文章:

  • 什么是Hystrix?实现原理是什么?
  • Hadoop - 1:Hadoop 技术解析;Hadoop是什么;Hadoop优势;Hadoop组成;HDFS、YARN、MapReduce 三者关系
  • docker——docker执行roslaunch显示错误
  • listagg 多了空格 Oracle数据库
  • 【嵌入式人工智能产品开发实战】(二十四)—— 政安晨:解释一下小智AI项目中析构函数的应用
  • McCabe 环形复杂度
  • Owen大规模文本嵌入生成
  • PMP-项目管理-十大知识领域:风险管理-识别、评估、应对项目风险
  • nsfp-
  • 《Image Classification with Classic and Deep Learning Techniques》复现
  • 地图导航怎么测?
  • 深入浅出决策树
  • 决策树总结
  • 视觉语言导航(9)——位置编码 VLNBERT与HAMT 记忆模块 3.3后半段
  • 如何简单实现排行榜功能
  • 【数模国奖冲刺】备赛过程中的常见问题
  • Tomcat Engine 原理深度解析
  • python的电影院座位管理可视化数据分析系统
  • 宋红康 JVM 笔记 Day05|运行时数据区内部结构、JVM中的线程说明、程序计数器
  • linux系统查看ip命令
  • 【自动化测试】Selenium详解-WebUI自动化测试
  • 【智慧工地源码】智慧工地云平台系统,涵盖安全、质量、环境、人员和设备五大管理模块,实现实时监控、智能预警和数据分析。
  • 《清华级防护,了解一下?》
  • 局域网视频软件BeeWorks,内网顺畅沟通
  • FPGA学习笔记——IIC协议简介
  • ​​​​​​​专精特新企业数据(附参考文献, 2013-2023)
  • [openvela] Hello World :从零开始的完整实践与问题复盘
  • linux-高级IO(中)
  • Python数据容器(列表,元组,字典) 从入门到精通
  • 基于Python的就业信息推荐系统 Python+Django+Vue.js