介紹
金融類應(yīng)用在密碼輸入時(shí),一般會(huì)使用自定義安全鍵盤。本示例介紹如何使用TextInput組件實(shí)現(xiàn)自定義安全鍵盤場(chǎng)景,主要包括TextInput.customKeyboard綁定自定義鍵盤、自定義鍵盤布局和狀態(tài)更新等知識(shí)點(diǎn)。
效果圖預(yù)覽
實(shí)現(xiàn)思路
1. 使用TextInput的customKeyboard的屬性方法來(lái)設(shè)置自定義鍵盤
當(dāng)設(shè)置自定義鍵盤時(shí),輸入框激活后不會(huì)打開(kāi)系統(tǒng)輸入法,而是加載應(yīng)用指定的自定義組件,針對(duì)系統(tǒng)鍵盤的enterKeyType屬性設(shè)置將無(wú)效。自定義鍵盤采用覆蓋原始界面的方式呈現(xiàn),不會(huì)對(duì)應(yīng)用原始界面產(chǎn)生壓縮或者上提。默認(rèn)在輸入控件失去焦點(diǎn)時(shí),關(guān)閉自定義鍵盤,開(kāi)發(fā)者也可以通過(guò)TextInputController.stopEditing方法控制鍵盤關(guān)閉。
2. 自定義鍵盤布局
鍵盤枚舉類型:
- 鍵盤類型分為數(shù)字鍵盤,大寫、小寫鍵盤,特殊字符鍵盤
- 鍵盤按鍵類型分為輸入操作INPUT、刪除操作DELETE、切換數(shù)字鍵盤操作NUMERIC、切換大小寫鍵盤CAPSLOCK、切換數(shù)字鍵盤SPECIAL共五種類型
/**
* 鍵盤類型枚舉
*/
export enum EKeyboardType {
NUMERIC, //數(shù)字鍵盤
UPPERCASE, // 大寫字母鍵盤
LOWERCASE, // 小寫字母鍵盤
SPECIAL, // 特殊字符鍵盤
}
/**
* 鍵盤按鍵類型枚舉
*/
export enum EKeyType {
INPUT, // 輸入類型,輸入具體的值
DELETE, // 刪除一個(gè)輸入字符
NUMERIC, // 切換數(shù)字鍵盤
CAPSLOCK, // 切換大小寫鍵盤
SPECIAL, // 切換特殊字符鍵盤
}
在真實(shí)業(yè)務(wù)場(chǎng)景下,自定義安全鍵盤數(shù)據(jù)包括值、UI屬性、位置等都通過(guò)數(shù)據(jù)請(qǐng)求來(lái)下發(fā),鍵盤按鍵數(shù)據(jù)接口定義如下:
/**
* 鍵盤按鍵數(shù)據(jù)接口
*/
export interface IKeyAttribute {
label: string | Resource;
value?: string;
type?: EKeyType;
fontSize?: number;
fontColor?: string | Color;
backgroundColor?: string | Color;
position?: [number, number, number, number];
}
自定義鍵盤布局:分為標(biāo)題欄和鍵盤兩部分,鍵盤使用Grid布局,每個(gè)按鍵GridItem的值、UI屬性和位置都通過(guò)數(shù)據(jù)請(qǐng)求下發(fā),不需要額外計(jì)算。
數(shù)字鍵盤為4*3的網(wǎng)格布局,但是大小寫鍵盤和特殊字符鍵盤的布局為不規(guī)則布局,如果設(shè)置為4 * 10的網(wǎng)格,有的按鍵占用1 * 1.5,但是GridItem屬性不支持占用非整數(shù)列。本文將該場(chǎng)景下將網(wǎng)格拆分為更小的單元,為4 * 20網(wǎng)格布局,每個(gè)字母按鍵占1 * 2,刪除按鍵則占1 * 3,空格則占1 * 10,這樣就保證每個(gè)按鍵都要占用整數(shù)單元。
Column() {
this.titleBar();
Grid() {
ForEach(this.items, (item: IKeyAttribute) => {
GridItem() {
this.myGridItem(item)
}
.width('100%')
.height(this.itemHeight)
.rowStart(item?.position?.[0])
.columnEnd(item?.position?.[1])
.columnStart(item?.position?.[2])
.columnEnd(item?.position?.[3])
.backgroundColor(item.backgroundColor)
.borderRadius($r("app.integer.key_border_radius"))
.onClick(() => {
....
})
}, (item: IKeyAttribute, index: number) => JSON.stringify(item) + index)
}
.margin({ bottom: $r("app.integer.key_board_marin_bottom") })
.columnsTemplate(this.curKeyboardType === EKeyboardType.NUMERIC ? "1fr 1fr 1fr" :
"1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr")
.rowsTemplate("1fr 1fr 1fr 1fr") // Grid高度均分成4份
.rowsGap(this.rowSpace) // 設(shè)置行間距
.columnsGap(this.columnSpace) // 設(shè)置列間距
.width('100%')
.height(this.itemHeight * this.rowCount + this.rowSpace * (this.rowCount - 1))
}
.width('100%')
.padding({ left: this.columnSpace, right: this.columnSpace })
.backgroundColor(Color.Black)
}
3. 狀態(tài)更新
主要是子組件自定義鍵盤的按鍵事件如何傳遞到父組件,可以在父組件定義好鍵盤按鍵事件響應(yīng)函數(shù)onKeyboardEvent,傳遞給子組件,然后子組件按鍵時(shí)調(diào)用父組件傳遞過(guò)來(lái)的onKeyboardEvent即可。需要注意的是,在子組件中,必須定義inputValue且使用@Link裝飾器,這樣能保證子組件調(diào)用時(shí)onKeyboardEvent時(shí)inputValue不為空,父子組件數(shù)據(jù)雙向更新。
@Component
export struct CustomSafeKeyboardView {
@State inputValue: string = '';
@State items: IKeyAttribute[] = numericKeyData;
@State curKeyboardType: EKeyboardType = EKeyboardType.NUMERIC;
controller: TextInputController = new TextInputController();
/**
* 鍵盤按鍵事件響應(yīng)函數(shù)
* @param item
*/
onKeyboardEvent(item: IKeyAttribute) {
switch (item.type) {
// 輸入類型,更新輸入內(nèi)容
case EKeyType.INPUT:
this.inputValue += item.value;
break;
// 刪除一個(gè)已輸入的末尾字符
case EKeyType.DELETE:
this.inputValue = this.inputValue.slice(0, -1);
break;
// 切換數(shù)字字符鍵盤
case EKeyType.NUMERIC:
if (this.curKeyboardType !== EKeyboardType.NUMERIC) {
this.curKeyboardType = EKeyboardType.NUMERIC;
this.items = numericKeyData;
}
break;
// 切換大小寫
case EKeyType.CAPSLOCK:
if (this.curKeyboardType === EKeyboardType.LOWERCASE) {
// 切換大寫字母鍵盤
this.curKeyboardType = EKeyboardType.UPPERCASE;
this.items = upperCaseKeyData;
} else {
// 切換小寫字母鍵盤
this.curKeyboardType = EKeyboardType.LOWERCASE;
this.items = lowerCaseKeyData;
}
break;
// 切換特殊字符鍵盤
case EKeyType.SPECIAL:
if (this.curKeyboardType !== EKeyboardType.SPECIAL) {
this.curKeyboardType = EKeyboardType.SPECIAL;
this.items = specialKeyData;
}
break;
default:
console.log(`Sorry, we are out of input type.`);
}
}
/**
* 自定義鍵盤組件Builder
*/
@Builder
customKeyboardBuilder() {
CustomKeyboard({
items: this.items,
inputValue: this.inputValue,
curKeyboardType: this.curKeyboardType,
onKeyboardEvent: this.onKeyboardEvent,
controller: this.controller
})
}
build() {
Column() {
Row()
.height($r("app.integer.row_height"))
Image($r("app.media.avatar"))
.width($r("app.integer.avatar_weight"))
.height($r("app.integer.avatar_height"))
.objectFit(ImageFit.Fill)
Text($r("app.string.account_name"))
.fontSize($r("app.integer.text_font_size"))
.margin({ top: $r("app.integer.common_margin_padding") })
TextInput({
text: this.inputValue,
placeholder: $r("app.string.placeholder"),
controller: this.controller
})// 綁定自定義鍵盤
.type(InputType.Password)
.customKeyboard(this.customKeyboardBuilder())// 綁定自定義安全鍵盤
.height($r("app.integer.text_input_height"))
.border(null)
.margin({ top: $r("app.integer.common_margin_padding") })
Button($r("app.string.login_button_label"))
.type(ButtonType.Capsule)
.fontSize($r("app.integer.login_button_font_size"))
.width($r("app.integer.login_button_width"))
.height($r("app.integer.login_button_height"))
.margin({ top: $r("app.integer.login_button_margin") })
.backgroundColor(Color.Pink)
.onClick(() => {
this.controller.stopEditing();
})
}
.width($r("app.string.one_hundred_percent"))
.height($r("app.string.one_hundred_percent"))
.padding($r("app.integer.common_margin_padding"))
}
}
高性能知識(shí)點(diǎn)
不涉及
工程結(jié)構(gòu)&模塊類型
customsafekeyboard // har類型
|---components // 自定義組件
| ---CustomKeyboard.ets
|---model // 模型層
| ---Constants // 定義常量數(shù)據(jù)
|---CustomSafeKeyboardView.ets // 主頁(yè)面
模塊依賴
- 依賴common模塊來(lái)實(shí)現(xiàn)日志的打印
- 依賴路由模塊,供entry模塊實(shí)現(xiàn)路由導(dǎo)航
最后:
有很多小伙伴不知道學(xué)習(xí)哪些鴻蒙開(kāi)發(fā)技術(shù)?不知道需要重點(diǎn)掌握哪些鴻蒙應(yīng)用開(kāi)發(fā)知識(shí)點(diǎn)?而且學(xué)習(xí)時(shí)頻繁踩坑,最終浪費(fèi)大量時(shí)間。所以有一份實(shí)用的鴻蒙(HarmonyOS NEXT)資料用來(lái)跟著學(xué)習(xí)是非常有必要的。?
這份鴻蒙(HarmonyOS NEXT)資料包含了鴻蒙開(kāi)發(fā)必掌握的核心知識(shí)要點(diǎn),內(nèi)容包含了(ArkTS、ArkUI開(kāi)發(fā)組件、Stage模型、多端部署、分布式應(yīng)用開(kāi)發(fā)、音頻、視頻、WebGL、OpenHarmony多媒體技術(shù)、Napi組件、OpenHarmony內(nèi)核、Harmony南向開(kāi)發(fā)、鴻蒙項(xiàng)目實(shí)戰(zhàn)等等)鴻蒙(HarmonyOS NEXT)技術(shù)知識(shí)點(diǎn)。
希望這一份鴻蒙學(xué)習(xí)資料能夠給大家?guī)?lái)幫助,有需要的小伙伴自行領(lǐng)取,限時(shí)開(kāi)源,先到先得~無(wú)套路領(lǐng)?。?!
如果你是一名有經(jīng)驗(yàn)的資深A(yù)ndroid移動(dòng)開(kāi)發(fā)、Java開(kāi)發(fā)、前端開(kāi)發(fā)、對(duì)鴻蒙感興趣以及轉(zhuǎn)行人員,可以直接領(lǐng)取這份資料
?獲取這份完整版高清學(xué)習(xí)路線,請(qǐng)點(diǎn)擊→純血版全套鴻蒙HarmonyOS學(xué)習(xí)資料
鴻蒙(HarmonyOS NEXT)最新學(xué)習(xí)路線
-
?HarmonOS基礎(chǔ)技能
-
HarmonOS就業(yè)必備技能?
- ?HarmonOS多媒體技術(shù)
- 鴻蒙NaPi組件進(jìn)階
- HarmonOS高級(jí)技能
-
初識(shí)HarmonOS內(nèi)核?
- 實(shí)戰(zhàn)就業(yè)級(jí)設(shè)備開(kāi)發(fā)
?有了路線圖,怎么能沒(méi)有學(xué)習(xí)資料呢,小編也準(zhǔn)備了一份聯(lián)合鴻蒙官方發(fā)布筆記整理收納的一套系統(tǒng)性的鴻蒙(OpenHarmony )學(xué)習(xí)手冊(cè)(共計(jì)1236頁(yè))與鴻蒙(OpenHarmony )開(kāi)發(fā)入門教學(xué)視頻,內(nèi)容包含:ArkTS、ArkUI、Web開(kāi)發(fā)、應(yīng)用模型、資源分類…等知識(shí)點(diǎn)。
獲取以上完整版高清學(xué)習(xí)路線,請(qǐng)點(diǎn)擊→純血版全套鴻蒙HarmonyOS學(xué)習(xí)資料
《鴻蒙 (OpenHarmony)開(kāi)發(fā)入門教學(xué)視頻》
《鴻蒙生態(tài)應(yīng)用開(kāi)發(fā)V2.0白皮書》
《鴻蒙 (OpenHarmony)開(kāi)發(fā)基礎(chǔ)到實(shí)戰(zhàn)手冊(cè)》
OpenHarmony北向、南向開(kāi)發(fā)環(huán)境搭建
?《鴻蒙開(kāi)發(fā)基礎(chǔ)》
- ArkTS語(yǔ)言
- 安裝DevEco Studio
- 運(yùn)用你的第一個(gè)ArkTS應(yīng)用
- ArkUI聲明式UI開(kāi)發(fā)
- .……
?《鴻蒙開(kāi)發(fā)進(jìn)階》
- Stage模型入門
- 網(wǎng)絡(luò)管理
- 數(shù)據(jù)管理
- 電話服務(wù)
- 分布式應(yīng)用開(kāi)發(fā)
- 通知與窗口管理
- 多媒體技術(shù)
- 安全技能
- 任務(wù)管理
- WebGL
- 國(guó)際化開(kāi)發(fā)
- 應(yīng)用測(cè)試
- DFX面向未來(lái)設(shè)計(jì)
- 鴻蒙系統(tǒng)移植和裁剪定制
- ……
《鴻蒙進(jìn)階實(shí)戰(zhàn)》
- ArkTS實(shí)踐
- UIAbility應(yīng)用
- 網(wǎng)絡(luò)案例
- ……
?獲取以上完整鴻蒙HarmonyOS學(xué)習(xí)資料,請(qǐng)點(diǎn)擊→純血版全套鴻蒙HarmonyOS學(xué)習(xí)資料
總結(jié)
總的來(lái)說(shuō),華為鴻蒙不再兼容安卓,對(duì)中年程序員來(lái)說(shuō)是一個(gè)挑戰(zhàn),也是一個(gè)機(jī)會(huì)。只有積極應(yīng)對(duì)變化,不斷學(xué)習(xí)和提升自己,他們才能在這個(gè)變革的時(shí)代中立于不敗之地。?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-849630.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-849630.html
到了這里,關(guān)于HarmonyOS Next 自定義安全鍵盤案例的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!