鸿蒙应用开发 应用内字体大小调节

1 数据管理概述

在移动互联网蓬勃发展的今天,移动应用给我们生活带来了极大的便利,这些便利的本质在于数据的互联互通。因此在应用的开发中数据存储占据了非常重要的位置,HarmonyOS 应用开发也不例外。

本文将为您介绍 HarmonyOS 提供的数据管理能力之一首选项。

2 什么是首选项

首选项为应用提供 Key-Value 键值型的数据存储能力,支持应用持久化轻量级数据,并对其进行增删改查等。该存储对象中的数据会被缓存在内存中,因此它可以获得更快的存取速度,下面详细介绍下首选项的开发过程。

3 首选项运作机制

首选项的特点是:

1、以 Key-Value 形式存储数据

Key 是不重复的关键字,Value 是数据值。

2、非关系型数据库

区别于关系型数据库,它不保证遵循 ACID(Atomicity, Consistency, Isolation and Durability)特性,数据之间无关系。

进程中每个文件仅存在一个 Preferences 实例,应用获取到实例后,可以从中读取数据,或者将数据存入实例中。通过调用 flush 方法可以将实例中的数据回写到文件里。

与关系数据库的区别

分类关系型数据库首选项
数据库类型关系型非关系型
使用场景提供复杂场景下的本地数据库管理机制对 Key-Value 结构的数据进行存取和持久化操作
存储方式SQLite 数据库文件
约束与限制1. 连接池最大 4 个 2. 同一时间只支持一个写操作1. 建议数据不超一万条 2.Key 为 string 型

4 常用接口介绍

常用接口有:保存数据(put)、获取数据(get)、是否包含指定的 key(has)、删除数据(delete)、数据持久化(flush)等,后面依次详细介绍接口使用。

常用接口使用前提

1、需要导入@ohos.data.preferences 模块到 PreferencesUtil 开发环境中,实例名字命名为 dataPreferences,同时定义两个常量 PREFERENCES_NAME 和 KEY_APP_FONT_SIZE。(注:把常用接口封装在 PreferencesUtil 工具类里面,为了方便后面代码直接调用)相关代码实现如下:

// PreferencesUtil.ets
import dataPreferences from '@ohos.data.preferences';
   ...
  const PREFERENCES_NAME = 'myPreferences'; // 首选项名字
  const KEY_APP_FONT_SIZE = 'appFontSize';  // 首选项 Key 字段

2、需要在 entryAbility 的 onCreate 方法获取首选项实例,以便后续能进行保存、读取、删除等操作,获取实例需要上下文 context 和文件名字 PREFERENCES_NAME,相关代码实现如下:

// entryAbility.ets  
  onCreate(want, launchParam) {
    Logger.info(TAG, 'onCreate');
    globalThis.abilityWant = want;
    // 创建首选项
    PreferencesUtil.createFontPreferences(this.context);
    ...
  }
// PreferencesUtil.ets  
  createFontPreferences(context) {
    globalThis.getFontPreferences = (() => {
      // 获取首选项实例
      let preferences: Promise = dataPreferences.getPreferences(context, PREFERENCES_NAME);
      return preferences;
    });
  }

保存数据(put)

1、在 entryAbility 的 onCreate 方法,调用 PreferencesUtil.saveDefaultFontSize 保存默认数据,先用 has 方法判断当前 key 是否有存在,如果没有就通过 put 方法把用户数据保存起来,该方法通过 key-value 键值对方式保存,常量 KEY_APP_FONT_SIZE 作为 key,用户数据 fontSize 作为 value,再通过 flush 方法把数据保存到文件,相关代码实现如下:

// entryAbility.ets  
  onCreate(want, launchParam) {
    Logger.info(TAG, 'onCreate');
    globalThis.abilityWant = want;
    ...
    // 设置字体默认大小
    PreferencesUtil.saveDefaultFontSize(Constants.SET_SIZE_STANDARD);
  }
// PreferencesUtil.ets    
  saveDefaultFontSize(fontSize: number) {
    globalThis.getFontPreferences().then((preferences) => {
      // 判断保存的 key 是否存在
      preferences.has(KEY_APP_FONT_SIZE).then(async (isExist) => {
        Logger.info(TAG, 'preferences has changeFontSize is ' + isExist);
        if (!isExist) {
          // 保存数据
          await preferences.put(KEY_APP_FONT_SIZE, fontSize);
          preferences.flush();
        }
      }).catch((err) => {
        Logger.error(TAG, 'Has the value failed with err: ' + err);
      });
    }).catch((err) => {
      Logger.error(TAG, 'Get the preferences failed, err: ' + err);
    });
  }

2、在 SetFontSizePage 页面,当手指移动 Slider 滑动条时,在 onChange 方法回调当前进度值,把当前进度值通过 PreferencesUtil.saveChangeFontSize 方法保存起来,再通过 flush 方法把数据保存到文件,相关代码实现如下:

// SetFontSizePage.ets
  build() {
    Row() {
      Slider({
       ...
      }).onChange((value: number) => {
          // 保存当前进度值
          PreferencesUtil.saveChangeFontSize(this.changeFontSize);
      })
    }
  }
// PreferencesUtil.ets 
  saveChangeFontSize(fontSize: number) {
    globalThis.getFontPreferences().then(async (preferences) => {
      // 保存数据
      await preferences.put(KEY_APP_FONT_SIZE, fontSize);
      preferences.flush();
    }).catch((err) => {
      Logger.error(TAG, 'put the preferences failed, err: ' + err);
    });
  }

获取数据(get)

在 HomePage 的 onPageShow 方法,调用 PreferencesUtil.getChangeFontSize 方法获取用户数据,调用 get 方法获取,该方法通过 key-value 键值对方式读取,常量 KEY_APP_FONT_SIZE 作为 key,默认数据 fontSize 作为 value,把的到的结果赋值给变量 fontSize,通过 return 方式把值返回去,相关代码实现如下:

// HomePage.ets
  onPageShow() {
    PreferencesUtil.getChangeFontSize().then((value) => {
      this.changeFontSize = value;
      Logger.info(TAG, 'Get the value of changeFontSize: ' + this.changeFontSize);
    });
  }
// PreferencesUtil.ets 
  async getChangeFontSize() {
    let fontSize: number = 0;
    const preferences = await globalThis.getFontPreferences();
    fontSize = await preferences.get(KEY_APP_FONT_SIZE, fontSize);
    return fontSize;
  }

是否包含指定的 key(has)

通过 has 方法判断首选项中是否包含指定的 key,保证指定的 key 不会被重复保存,相关代码实现如下:

// PreferencesUtil.ets    
  saveDefaultFontSize(fontSize: number) {
    globalThis.getFontPreferences().then((preferences) => {
      // 判断保存的 key 是否存在
      preferences.has(KEY_APP_FONT_SIZE).then(async (isExist) => {
        Logger.info(TAG, 'preferences has changeFontSize is ' + isExist);
      }).catch((err) => {
        Logger.error(TAG, 'Has the value failed with err: ' + err);
      });
    }).catch((err) => {
      Logger.error(TAG, 'Get the preferences failed, err: ' + err);
    });
  }

数据持久化(flush)

通过 flush 方法把应用数据保存到文件中,使得应用数据保存期限变长,相关代码实现如下:

// PreferencesUtil.ets 
  saveChangeFontSize(fontSize: number) {
    globalThis.getFontPreferences().then(async (preferences) => {
      // 保存数据
      await preferences.put(KEY_APP_FONT_SIZE, fontSize);
     // 数据持久化
      preferences.flush();
    }).catch((err) => {
      Logger.error(TAG, 'put the preferences failed, err: ' + err);
    });
  }

删除数据(delete)

删除首选项数据需要获取 preferences 实例,用 delete 方法删除指定的 key 所对应的值,常量 KEY_APP_FONT_SIZE 作为 key,通过 Promise 异步回调是否删除成功,相关代码实现如下:

// PreferencesUtil.ets 
  async deleteChangeFontSize() {
    const preferences: dataPreferences.Preferences = await globalThis.getFontPreferences();
    // 删除数据
    let deleteValue = preferences.delete(KEY_APP_FONT_SIZE);
    deleteValue.then(() => {
      Logger.info(TAG, 'Succeeded in deleting the key appFontSize.');
    }).catch((err) => {
      Logger.error(TAG, 'Failed to delete the key appFontSize. Cause: ' + err);
    });
  }

5 案例:应用内字体大小调节

简介

本篇 Codelab 将介绍如何使用基础组件 Slider,通过拖动滑块调节应用内字体大小。要求完成以下功能:

  1. 实现两个页面的 UX:主页面和字体大小调节页面。
  2. 拖动滑块改变字体大小系数,列表页和调节页面字体大小同步变化。往右拖动滑块字体变大,反之变小。
  3. 字体大小支持持久化存储,再次启动时,应用内字体仍是调节后的字体大小。

最终效果图如图所示:

相关概念

  • 字体大小调节原理 :通过组件 Slider 滑动,获取滑动数值,将这个值通过首选项进行持久化,页面的字体通过这个值去改变大小。
  • 首选项: 首选项为应用提供 Key-Value 键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。

相关权限

不涉及

使用说明

  1. 应用包含“设置”、“字体大小设置”两个页面。
  2. 通过点击设置页的“设置字体大小”项,可以进入到字体大小设置页。
  3. 在字体大小设置页拖动滑块,设置页的设置项文字以及字体大小设置页的聊天文字大小会同步变化。

约束与限制

  1. 本示例仅支持标准系统上运行,支持设备:华为手机或运行在 DevEco Studio 上的华为手机设备模拟器。
  2. 本示例为 Stage 模型,支持 API version 9。
  3. 本示例需要使用 DevEco Studio 3.1 Release 版本进行编译运行。

源码地址

在公众号「Android指南」后台发消息「字体大小」即可获取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/281665.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

黑马程序员SSM框架-SpringBoot

视频连接:SpringBoot-01-SpringBoot工程入门案例开发步骤_哔哩哔哩_bilibili SpringBoot简介 入门程序 也可以基于官网创建项目。 SpringBoot项目快速启动 下面的插件将项目运行所需的依赖jar包全部加入到了最终运行的jar包中,并将入口程序指定。 Spri…

信号与线性系统翻转课堂笔记17——z变换及其性质

信号与线性系统翻转课堂笔记17——z变换及其性质 The Flipped Classroom17 of Signals and Linear Systems 对应教材:《信号与线性系统分析(第五版)》高等教育出版社,吴大正著 一、要点 (1)序列的z变换…

Unity 爱心血量效果

这里写自定义目录标题 1.准备爱心血条2.HeartUI 代码3.在Inspector窗口中绑定好对象4.在血量减少的地方,调用更新方法5.效果展示 1.准备爱心血条 准备好红色爱心和灰色爱心的图片 2.HeartUI 代码 using System.Collections; using System.Collections.Generic; u…

计算机缺失api-ms-win-crt-runtime-l1-1-0.dll要怎么解决

在Windows 7操作系统中,api-ms-win-crt-runtime-l1-1-0.dll是一个关键的运行时库文件,负责提供多种实用功能。许多用户在操作系统或软件使用过程中,可能会遇到api-ms-win-crt-runtime-l1-1-0.dll缺失的问题。那么,api-ms-win-crt-…

学习体系结构 - AArch64 异常模型

学习体系结构 - AArch64 异常模型 Learn the architecture - AArch64 Exception Model version 1.3 根据DeepL翻译 校准 1、Overview AArch64异常模型指南,介绍了Armv8-A和Armv9-A中的异常和特权模型。它涵盖了Arm架构中不同类型的异常以及处理器在处理异常时的行…

Halcon 膨胀dilation_circle

Halcon 膨胀 文章目录 Halcon 膨胀 膨胀是对选区进行“扩大”的一种操作。其原理是使用一个自定义的结构元素,在待处理的二值图像上进行类似于“滤波”的滑动操作,然后将二值图像对应的像素点与结构元素的像素进行对比,得到的并集为膨胀后的图像像素。图…

【数据结构——二叉树】二叉树及其应用2023(头歌习题)【合集】

目录 第1关:括号表示法创建二叉树任务描述相关知识编程要求测试说明完整代码 第2关:先序序列创建二叉树任务描述相关知识二叉树的前序遍历如何创建一颗二叉树伪代码如下: 二叉树的中序遍历 编程要求测试说明完整代码 第3关:计算二…

python编程从入门到实践(1)

文章目录 2.2.1命名的说明2.3字符串2.3.1使用方法修改字符串的大小写2.3.2 在字符串中使用变量2.3.3 制表符 和 换行符2.5.4删除空白2.5.5 删除前缀+后缀 2.2.1命名的说明 只能包含:字母,下划线,数字 必须:字母&#…

SpringIOC之ClassPathXmlApplicationContext

博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…

.NET进阶篇06-async异步、thread多线程2

知识须要不断积累、总结和沉淀,思考和写做是成长的催化剂web 内容目录 1、线程Thread 一、生命周期 二、后台线程 三、静态方法 1.线程本地存储 2.内存栅栏 四、返回值 2、线程池ThreadPool 一、工做队列 二、工做线程和IO线程 三、和Thread区别 四、定时器 1、线…

2023年终总结丨很苦,很酷!

文章目录 个人简介丨了解博主写在前面丨博主介绍年终总结丨博主成就年终总结丨博主想说年终总结丨学习芝士年终总结丨未来展望写在后面丨新年快乐 个人简介丨了解博主 主页地址:https://blog.csdn.net/m0_68111267 荣誉身份 ⭐2022年度CSDN 社区之星 Top6 ⭐2023年…

app自动化测试(Android)–触屏操作自动化

导入TouchAction Python 版本 from appium.webdriver.common.touch_action import TouchActionJava 版本 import io.appium.java_client.TouchAction;常用的手势操作 press 按下 TouchAction 提供的常用的手势操作有如下操作: press 按下 release 释放 move…

web网站的工作流程和开发模式

web网站的工作流程和开发模式 基于Java Script封装的高级技术:Vue、Element、Nginx(前端程序部署的服务器) 初识Web前端 Web标准

学习动态规划解决不同路径、最小路径和、打家劫舍、打家劫舍iii

学习动态规划|不同路径、最小路径和、打家劫舍、打家劫舍iii 62 不同路径 动态规划,dp[i][j]表示从左上角到(i,j)的路径数量dp[i][j] dp[i-1][j] dp[i][j-1] import java.util.Arrays;/*** 路径数量* 动态规划,dp[i][j]表示从左上角到(i,j)的路径数量…

MySQL基础入门(一)

图片来自b站黑马程序员 数据库操作 DDL 查询: 1.查询所有的数据库 show databases; 2.查询当前的鹅数据库 select database; 创建 create database [if not exists] 数据库名 [default charset 字符集][collate 排序规则]; 删除 drop database [if exists] 数…

Transformer基本结构

Transformer基本结构 输入部分、编码部分、解码部分、输出部分 1、输入部分 原文本嵌入层及其位置编码器目标文本嵌入层及其位置编码器 位置编码器(PositionalEncoding):将词汇位置不同可能会产生不同语义的信息加入到词张量中,以弥补位置信息的缺失 …

nodejs文心一言API接入

需求 在nodejs里面接入文心一言API,官方调用步骤API介绍 - 千帆大模型平台 | 百度智能云文档 大致流程 创建应用——>API授权——>获取访问凭证——>调用接口 创建应用 注册账号创建应用 首先注册百度云智能账号,登录进入百度智能云千帆控…

12.30_黑马数据结构与算法笔记Java

目录 320 全排列无重复 Leetcode47 321 组合 Leetcode77 分析 322 组合 Leetcode77 实现 323 组合 Leetcode77 剪枝 324 组合之和 Leetcode 39 325 组合之和 Leetcode 40 326 组合之和 Leetcode 216 327 N皇后 Leetcode51-1 328 N皇后 Leetcode51-2 329 解数独 Leetco…

STM32入门教程-2023版【3-2】使用库函数点亮GPIO灯

关注 点赞 不错过精彩内容 大家好,我是硬核王同学,最近在做免费的嵌入式知识分享,帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作! 二、正式点亮一个LED灯 (3)使用库函数点亮GPIO灯 RCC初始化 首先用的是&…

python2.x编码Unicode字符串

1 python2.x编码Unicode字符串 python2.x默认编码方法为ASCII码。字符串赋值时按系统默认编码自动编码,通过decode()方法解码为Unicode,再通过encode()方法编码为指定码。 1.1 编码解码基础知识 1.1.1 位 位(bit)是计算机存储数据的最小单位&#xf…