HarmonyOS 鸿蒙Next 电话数字按键 有没有好的实现方案

发布于 1周前 作者 itying888 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 电话数字按键 有没有好的实现方案

想实现这个打电话 数字按键 有啥好方法吗或者有现成的组件吗

2 回复

可以参考demo

[@Builder](/user/Builder)
export function PrivacyPageBuilder(){
PrivacyPage()
}

[@Entry](/user/Entry)
[@Component](/user/Component)
export struct PrivacyPage {
[@State](/user/State) UserPwd:string = ""
[@State](/user/State) inputVal:string = ""
[@State](/user/State) inputValConfirm:string = ""
[@State](/user/State) inputCnt:number = 0
[@State](/user/State) InfoText:string = "密码由6位数字组成"
[@State](/user/State) optText:string = "请牢记你的密码,忘记后可通过密保找回"
[@State](/user/State) pwdLen:number = 0;
private isConfirmPage:boolean = false;

aboutToAppear(): void {
console.info("taaaset in prive")
this.isConfirmPage = false;
this.inputCnt = 0;
}

[@Builder](/user/Builder) KeyboardBuilder() {
Grid() {
ForEach([1,2,3,4,5,6,7,8,9,"清空",0, "删除"], (item:number | string, index) => {
GridItem() {
Button(item + "")
.borderRadius(8)
.type(ButtonType.Normal)
.stateEffect(true)
.fontColor(Color.Black)
.width('31%')
.backgroundColor('#FCFCFE')
.onClick(() => {
if (index === 9) {
if (this.isConfirmPage) {
this.inputValConfirm = ""
} else {
this.inputVal = ""
}
} else if (index === 11) {
if (this.isConfirmPage) {
let endNum = this.inputValConfirm.length;
if (endNum > 0) {
this.inputValConfirm = this.inputValConfirm.substring(0, endNum - 1)
}
} else {
let endNum = this.inputVal.length;
if (endNum > 0) {
this.inputVal = this.inputVal.substring(0, endNum - 1)
}
}
} else {
if (this.isConfirmPage) {
if (this.inputValConfirm.length < 6) {
this.inputValConfirm += item
}
} else {
if (this.inputVal.length < 6) {
this.inputVal += item
}
console.info("KeyboardBuilder val:" + this.inputVal)
}
}

if (this.isConfirmPage) {
this.inputCnt = this.inputValConfirm.length
} else {
this.inputCnt = this.inputVal.length
}
if (this.inputCnt === 6) {
if (this.isConfirmPage) {
if (this.inputVal === this.inputValConfirm) {
// PreferenceManager.getInstance().setValue<string>(APP_PWD, this.inputValConfirm)
// PreferenceManager.getInstance().setValue<boolean>(IS_SET_KEY, true)
this.UserPwd = this.inputValConfirm
this.inputVal = ""
this.inputValConfirm = ""
this.inputCnt = 0
console.info("KeyboardBuilder val out right:" + this.UserPwd)
// this.pathStack.pushPathByName("MainPage", null) // 密码设置完成,退出到主界面
} else {
this.optText = "密码不一致,请重新输入"
console.info("KeyboardBuilder val out not true:" + this.inputVal + " & " + this.inputValConfirm)
let timeID = setTimeout(() => {
this.optText = "请牢记你的密码,忘记后可通过密保找回"
this.inputValConfirm = ""
this.inputCnt = 0
console.info("KeyboardBuilder val out not true return back")
}, 1000)

}
} else {
this.InfoText = "确认密码"
this.isConfirmPage = true;
this.inputCnt = 0;
}
}
})
}.alignSelf(ItemAlign.Center)
})
}
.maxCount(3).columnsGap(10).rowsGap(10).width('100%')
.padding({top:10, bottom:10, left:10, right: 10})
}

build(){

Column() {
Row() {
Image($r('app.media.ic_trash'))
.objectFit(ImageFit.Contain).width(36).aspectRatio(1).padding({top: 12})
.onClick(() => {
this.inputVal = ""
this.inputValConfirm = ""
this.inputCnt = 0
// this.pathStack.pop()
})
Blank().width(86)
Text("设置数字密码").fontSize(18).fontColor(Color.White)
}
.alignItems(VerticalAlign.Center)
.width('100%').height(60).padding({top: 44, bottom: 10})
Blank().height(112)
Column(){
Image($r('app.media.progress_target_label_navy'))
.objectFit(ImageFit.Contain)
.width(98)
.height(132.5)
Text(this.InfoText)
.fontSize(14)
.fontColor(Color.White)
.fontWeight(FontWeight.Bold)
.padding({top:10})
}
Blank().height(32)
Grid() {
ForEach([1,2,3,4,5,6], (item:number | string, index) => {
GridItem() {
if (item.valueOf() <= this.inputCnt) {
Image($r('app.media.startIcon'))
.objectFit(ImageFit.Contain)
.width(20)
} else {
Image($r('app.media.startIcon'))
.objectFit(ImageFit.Contain)
.width(20)
}
}
})
}.layoutDirection(GridDirection.Row).align(Alignment.Center).maxCount(6).columnsGap(21).height(20)

Blank().height(24)
Text(this.optText)
.fontSize(14).fontColor('#F37676')
Blank().height(88)
Column() {
this.KeyboardBuilder()
}
.height(291)
.backgroundColor('#BDBFC5')
}
.width('100%')
.height('100%')
.backgroundColor('#020214')
.alignItems(HorizontalAlign.Center)
}

}

更多关于HarmonyOS 鸿蒙Next 电话数字按键 有没有好的实现方案的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


HarmonyOS 鸿蒙Next 电话数字按键的实现方案,可以基于其提供的ArkUI框架进行开发。ArkUI框架支持使用JS(JavaScript)、eTS(Enhanced TypeScript)或Dart语言进行UI开发,以下是一个简要的实现思路:

  1. 布局设计: 使用ArkUI的布局组件(如RowColumnFlex等)来设计数字按键的排列,每个按键可以用Button组件实现。

  2. 按键功能: 为每个Button组件设置点击事件监听器,在事件处理函数中实现相应的拨号逻辑。

  3. 样式定制: 利用ArkUI的样式系统,自定义按键的外观,如大小、颜色、字体等。

  4. 状态管理: 如果需要实现长按、短按等复杂交互,可以利用ArkUI的状态管理功能,记录按键的按下状态。

  5. 集成测试: 在开发完成后,进行集成测试,确保数字按键的响应速度和准确性满足要求。

以下是一个简化的示例代码(假设使用eTS语言):

@Entry
@Component
struct PhoneNumberPad {
  // 按键布局和逻辑实现
}

由于篇幅限制,此处只给出了一个框架性的实现思路。具体实现时,需要根据实际需求进行详细的布局设计和逻辑编写。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部