网络安全最全HarmonyOS Next 自定义安全键盘案例_鸿蒙next 自定义键盘(1),2024年最新头条网络安全面试题

写在最后

在结束之际,我想重申的是,学习并非如攀登险峻高峰,而是如滴水穿石般的持久累积。尤其当我们步入工作岗位之后,持之以恒的学习变得愈发不易,如同在茫茫大海中独自划舟,稍有松懈便可能被巨浪吞噬。然而,对于我们程序员而言,学习是生存之本,是我们在激烈市场竞争中立于不败之地的关键。一旦停止学习,我们便如同逆水行舟,不进则退,终将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一份珍贵投资。让我们不断磨砺自己,与时代共同进步,书写属于我们的辉煌篇章。

需要完整版PDF学习资源私我

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

UPPERCASE, // 大写字母键盘
LOWERCASE, // 小写字母键盘
SPECIAL, // 特殊字符键盘
}

/**

  • 键盘按键类型枚举
    */
    export enum EKeyType {
    INPUT, // 输入类型,输入具体的值
    DELETE, // 删除一个输入字符
    NUMERIC, // 切换数字键盘
    CAPSLOCK, // 切换大小写键盘
    SPECIAL, // 切换特殊字符键盘
    }

在真实业务场景下,自定义安全键盘数据包括值、UI属性、位置等都通过数据请求来下发,键盘按键数据接口定义如下:



/**

  • 键盘按键数据接口
    */
    export interface IKeyAttribute {
    label: string | Resource;
    value?: string;
    type?: EKeyType;
    fontSize?: number;
    fontColor?: string | Color;
    backgroundColor?: string | Color;
    position?: [number, number, number, number];
    }

自定义键盘布局:分为标题栏和键盘两部分,键盘使用Grid布局,每个按键GridItem的值、UI属性和位置都通过数据请求下发,不需要额外计算。


数字键盘为4\*3的网格布局,但是大小写键盘和特殊字符键盘的布局为不规则布局,如果设置为4 \* 10的网格,有的按键占用1 \* 1.5,但是GridItem属性不支持占用非整数列。本文将该场景下将网格拆分为更小的单元,为4 \* 20网格布局,每个字母按键占1 \* 2,删除按键则占1 \* 3,空格则占1 \* 10,这样就保证每个按键都要占用整数单元。



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) // 设置行间距
.columnsGap(this.columnSpace) // 设置列间距
.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. 状态更新


主要是子组件自定义键盘的按键事件如何传递到父组件,可以在父组件定义好键盘按键事件响应函数onKeyboardEvent,传递给子组件,然后子组件按键时调用父组件传递过来的onKeyboardEvent即可。需要注意的是,在子组件中,必须定义inputValue且使用@Link装饰器,这样能保证子组件调用时onKeyboardEvent时inputValue不为空,父子组件数据双向更新。



@Component
export struct CustomSafeKeyboardView {
@State inputValue: string = ‘’;
@State items: IKeyAttribute[] = numericKeyData;
@State curKeyboardType: EKeyboardType = EKeyboardType.NUMERIC;
controller: TextInputController = new TextInputController();

/**

  • 键盘按键事件响应函数
  • @param item
    */
    onKeyboardEvent(item: IKeyAttribute) {
    switch (item.type) {
    // 输入类型,更新输入内容
    case EKeyType.INPUT:
    this.inputValue += item.value;
    break;
    // 删除一个已输入的末尾字符
    case EKeyType.DELETE:
    this.inputValue = this.inputValue.slice(0, -1);
    break;
    // 切换数字字符键盘
    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"))

}
}


#### 高性能知识点


**不涉及**


#### 工程结构&模块类型



customsafekeyboard // har类型
|—components // 自定义组件
| —CustomKeyboard.ets
|—model // 模型层
| —Constants // 定义常量数据
|—CustomSafeKeyboardView.ets // 主页面


#### 模块依赖


1. 依赖common模块来实现[日志]( )的打印
2. 依赖[路由模块]( ),供entry模块实现路由导航


### 最后:


有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的**鸿蒙(HarmonyOS NEXT)资料**用来跟着学习是非常有必要的。 


**这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了**(**ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony****多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)**技术知识点。


希望这一份鸿蒙学习资料能够给大家带来帮助,有需要的小伙伴自行领取,**限时开源,先到先得~无套路领取!!**


**如果你是一名有经验的资深Android移动开发、Java开发、前端开发、对鸿蒙感兴趣以及转行人员,可以直接领取这份资料**


**获取这份完整版高清学习路线,请点击→**[纯血版全套鸿蒙HarmonyOS学习资料]( )****


### **鸿蒙(HarmonyOS NEXT)最新学习路线**


**![](https://img-blog.csdnimg.cn/direct/2636417e951b4ec9b5a1334224fcd239.png)**




还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!


王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。


对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!


【完整版领取方式在文末!!】


***93道网络安全面试题***


![](https://img-blog.csdnimg.cn/img_convert/6679c89ccd849f9504c48bb02882ef8d.png)








![](https://img-blog.csdnimg.cn/img_convert/07ce1a919614bde78921fb2f8ddf0c2f.png)





![](https://img-blog.csdnimg.cn/img_convert/44238619c3ba2d672b5b8dc4a529b01d.png)





内容实在太多,不一一截图了


### 黑客学习资源推荐


最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!


对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

#### 1️⃣零基础入门


##### ① 学习路线


对于从来没有接触过网络安全的同学,我们帮你准备了详细的**学习成长路线图**。可以说是**最科学最系统的学习路线**,大家跟着这个大的方向学习准没问题。


![image](https://img-blog.csdnimg.cn/img_convert/acb3c4714e29498573a58a3c79c775da.gif#pic_center)


##### ② 路线对应学习视频


同时每个成长路线对应的板块都有配套的视频提供:


![image-20231025112050764](https://img-blog.csdnimg.cn/874ad4fd3dbe4f6bb3bff17885655014.png#pic_center)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值