介紹
如何使用基礎組件[Slider],通過拖動滑塊調節應用內字體大小。要求完成以下功能:
- 實現兩個頁面的UX:主頁面和字體大小調節頁面。
- 拖動滑塊改變字體大小系數,列表頁和調節頁面字體大小同步變化。往右拖動滑塊字體變大,反之變小。
- 字體大小支持持久化存儲,再次啟動時,應用內字體仍是調節后的字體大小。效果圖如下所示:
相關概念
- 字體大小調節原理:通過組件Slider滑動,獲取滑動數值,將這個值通過首選項進行持久化,頁面的字體通過這個值去改變大小。
- [首選項]:首選項為應用提供Key-Value鍵值型的數據處理能力,支持應用持久化輕量級數據,并對其修改和查詢。
環境搭建
軟件要求
- [DevEco Studio]版本:DevEco Studio 3.1 Release。
- OpenHarmony SDK版本:API version 9。
硬件要求
- 開發板類型:[潤和RK3568開發板]。
- OpenHarmony系統:3.2 Release。
環境搭建
完成本篇Codelab我們首先要完成開發環境的搭建,本示例以RK3568開發板為例,參照以下步驟進行:
- [獲取OpenHarmony系統版本]:標準系統解決方案(二進制)。以3.2 Release版本為例:
- 搭建燒錄環境。
代碼結構解讀
本篇Codelab只對核心代碼進行講解,完整代碼可以直接從gitee獲取。
├──entry/src/main/ets // ArkTS代碼區
│ ├──common
│ │ ├──constants
│ │ │ ├──CommonConstants.ets // 公共常量類
│ │ │ └──StyleConstants.ets // 屬性常量類
│ │ ├──database
│ │ │ └──PreferencesUtil.ets // 首選項數據操作工具類
│ │ └──utils
│ │ ├──GlobalContext.ets // 全局上下文工具類
│ │ └──Logger.ets // 日志工具類
│ ├──entryability
│ │ └──EntryAbility.ets // 程序入口類
│ ├──pages
│ │ ├──HomePage.ets // 主頁面
│ │ └──SetFontSizePage.ets // 字體大小調節頁面
│ ├──view
│ │ ├──ChatItemComponent.ets // 字體大小調節頁面聊天Item組件
│ │ ├──SettingItemComponent.ets // 主頁面列表Item組件
│ │ └──TitleBarComponent.ets // 頁面標題欄組件
│ └──viewmodel
│ ├──ChatData.ets // 聊天列表數據類
│ ├──HomeViewModel.ets // 主頁面數據模型
│ ├──ItemDirection.ets // 聊天數據位置
│ └──SettingData.ets // 設置列表數據類
│ └──SetViewModel.ets // 字體大小調節頁面數據模型
└──entry/src/main/resources // 資源文件目錄
保存默認大小
應用初始化時,為了保證頁面中文本的正常顯示。在entryAbility生命周期onCreate方法處,添加一個命名為“myPreferences”的首選項表。在表中添加一個名為“appFontSize”的字段,保存默認字體大小。代碼如下所示:
// PreferencesUtil.ets
// 導入首選項數據庫
import dataPreferences from '@ohos.data.preferences';
export class PreferencesUtil {
// 先將Promise< Preferences >保存到全局
createFontPreferences(context: Context) {
let fontPreferences: Function = (() = > {
let preferences: Promise< dataPreferences.Preferences > = dataPreferences.getPreferences(context,
PREFERENCES_NAME);
return preferences;
});
GlobalContext.getContext().setObject('getFontPreferences', fontPreferences);
}
// 保存默認字體大小
saveDefaultFontSize(fontSize: number) {
let getFontPreferences: Function = GlobalContext.getContext().getObject('getFontPreferences') as Function;
getFontPreferences().then((preferences: dataPreferences.Preferences) = > {
preferences.has(KEY_APP_FONT_SIZE).then(async (isExist: boolean) = > {
Logger.info(TAG, 'preferences has changeFontSize is ' + isExist);
if (!isExist) {
await preferences.put(KEY_APP_FONT_SIZE, fontSize);
preferences.flush();
}
}).catch((err: Error) = > {
Logger.error(TAG, 'Has the value failed with err: ' + err);
});
}).catch((err: Error) = > {
Logger.error(TAG, 'Get the preferences failed, err: ' + err);
});
}
}
獲取字體大小
在HomePage頁面加載顯示的時候,即生命周期onPageShow方法處,通過PreferencesUtil工具類中的getChangeFontSize方法讀取首選項中的數據。
將讀取到的數據保存到頁面帶有@State的變量中,通過這個變量對文本字體大小進行設置。代碼如下所示:
// 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;
let getFontPreferences: Function = GlobalContext.getContext().getObject('getFontPreferences') as Function;
fontSize = await (await getFontPreferences()).get(KEY_APP_FONT_SIZE, fontSize);
return fontSize;
}
修改字體大小
在應用主頁面,點擊設置字體大小,可以跳轉到字體大小調節頁面。拖動滑塊修改數據后,SetFontSizePage頁面的Slider組件監聽到onChange事件,改變字體大小后,調用PreferencesUtil工具類中saveChangeFontSize方法寫入本條數據即可。代碼如下所示:
// SetFontSizePage.ets
Slider({
value: this.changeFontSize === CommonConstants.SET_SIZE_HUGE ?
CommonConstants.SET_SLIDER_MAX : this.changeFontSize,
min: CommonConstants.SET_SLIDER_MIN,
max: CommonConstants.SET_SLIDER_MAX,
step: CommonConstants.SET_SLIDER_STEP,
style: SliderStyle.InSet
})
...
.onChange(async (value: number) = > {
if (this.changeFontSize === 0) {
this.changeFontSize = await PreferencesUtil.getChangeFontSize();
this.fontSizeText = SetViewModel.getTextByFontSize(value);
return;
}
// 獲取改變后的字體大小
this.changeFontSize = (value === CommonConstants.SET_SLIDER_MAX ?
CommonConstants.SET_SIZE_HUGE : value);
// 獲取字體大小的文本
this.fontSizeText = SetViewModel.getTextByFontSize(this.changeFontSize);
// 保存數據
PreferencesUtil.saveChangeFontSize(this.changeFontSize);
})
// PreferencesUtil.ets工具類
saveChangeFontSize(fontSize: number) {
let getFontPreferences: Function = GlobalContext.getContext().getObject('getFontPreferences') as Function;
getFontPreferences().then(async (preferences: dataPreferences.Preferences) = > {
await preferences.put(KEY_APP_FONT_SIZE, fontSize);
preferences.flush();
}).catch((err: Error) = > {
Logger.error(TAG, 'put the preferences failed, err: ' + err);
});
}
審核編輯 黃宇
-
HarmonyOS
+關注
關注
79文章
1975瀏覽量
30194 -
OpenHarmony
+關注
關注
25文章
3722瀏覽量
16317
發布評論請先 登錄
相關推薦
評論