鸿蒙开发:自定义一个英文键盘

简介: 实现方式呢,有很多种,目前采用了比较简单的一种,如果大家采用网格Grid组件实现方式,也是可以的,但是需要考虑每行的边距以及数据,还有最后两行的格子占位问题。

前言


代码运行环境:全部基于HarmonyOs NEXT

DevEco Studio:Build Version: 5.0.3.900

API:12

modelVersion5.0.0


自定义键盘系列,陆陆续续已经完成了,车牌省份简称键盘,车牌字母选择键盘以及股票代码键盘,都是一些特殊行业比较常见的键盘,这篇文章,我们再去自定义个普通大众的英文键盘,和其它键盘定义一样,由于每行的间距不一样,所实现的方式也不一样。

代码实现

为了能更好的实现UI效果,这里也是采用了多组件的实现方式,毕竟每一行的边距是不一样的,总共分为了四行进行实现,大家可以采用网格布局,或者List组件都可以进行实现,这里我采用的Row组件,在Row组件里再使用ForEach进行遍历子组件,当然了,毕竟数据量小,具体用哪一种方式,还是看大家自己选择。

咱们只说一行代码实现即可啊,因为都是重复的,无非就是展示的数据源及边距不一样,每一个子元素重要的就是其权重。

Row() {
        ForEach(["Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P"], (item: string) => {
          Text(item)
            .layoutWeight(1)
            .height(this.rectHeight)
            .fontSize(this.rectTextSize)
            .fontColor(this.rectTextColor)
            .backgroundColor(this.englishBgColor)
            .textAlign(TextAlign.Center)
            .margin({ left: 5, right: 5 })
            .borderRadius(this.rectBorderRadius)
            .onClick(() => {
              if (this.onItemClick != undefined) {
                this.onItemClick(item)
              }
            })
        })
      }

全部代码

代码实现起来非常的简单,大家自己看就行。

@Component
export struct EnglishKeyboardView {
  bgColor: ResourceColor = "#f5f5f5" //背景颜色
  englishBgColor: ResourceColor = "#ffffff" //英文背景颜色
  otherBgColor: ResourceColor = "#e8e8e8" //非英文背景颜色
  rectBorderWidth: Length = 1 //格子边框宽度
  rectBorderRadius: Length = 2 //格子边框圆角
  rectTextSize: Length = 16 //格子的文字大小
  rectTextColor: ResourceColor = "#333333" //格子文字的默认颜色
  deleteIconWidth: Length = 30 //删除图片宽度
  deleteIconSrc: PixelMap | ResourceStr | DrawableDescriptor = $r("app.media.view_ic_key_delete")
  rectHeight: Length = 60 //每个格子高度
  marginTop: Length = 10 //距离上
  marginBottom: Length = 10 //距离下
  onItemClick?: (item: string) => void //点击条目
  onDelete?: () => void //点击删除
  onComplete?: () => void //点击完成
  onChinese?: () => void //中文
  onSpace?: () => void //空格
  onNumber?: () => void //数字
  build() {
    Column() {
      Row() {
        ForEach(["Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P"], (item: string) => {
          Text(item)
            .layoutWeight(1)
            .height(this.rectHeight)
            .fontSize(this.rectTextSize)
            .fontColor(this.rectTextColor)
            .backgroundColor(this.englishBgColor)
            .textAlign(TextAlign.Center)
            .margin({ left: 5, right: 5 })
            .borderRadius(this.rectBorderRadius)
            .onClick(() => {
              if (this.onItemClick != undefined) {
                this.onItemClick(item)
              }
            })
        })
      }
      Row() {
        ForEach(["A", "S", "D", "F", "G", "H", "J", "K", "L"], (item: string) => {
          Text(item)
            .layoutWeight(1)
            .height(this.rectHeight)
            .fontSize(this.rectTextSize)
            .fontColor(this.rectTextColor)
            .backgroundColor(this.englishBgColor)
            .textAlign(TextAlign.Center)
            .margin({ left: 5, right: 5 })
            .borderRadius(this.rectBorderRadius)
            .onClick(() => {
              if (this.onItemClick != undefined) {
                this.onItemClick(item)
              }
            })
        })
      }.margin({ top: 10, left: 20, right: 20 })
      Row() {
        ForEach(["中", "Z", "X", "C", "V", "B", "N", "M", "删除"], (item: string, index: number) => {
          if (index == 8) {
            Column() {
              Image(this.deleteIconSrc)
                .width(this.deleteIconWidth)
            }
            .layoutWeight(1.5)
            .justifyContent(FlexAlign.Center)
            .backgroundColor(this.otherBgColor)
            .height(this.rectHeight)
            .onClick(() => {
              //删除
              if (this.onDelete != undefined) {
                this.onDelete()
              }
            })
          } else {
            Text(item)
              .layoutWeight(index == 0 ? 1.5 : 1)
              .height(this.rectHeight)
              .fontSize(this.rectTextSize)
              .fontColor(this.rectTextColor)
              .backgroundColor((index == 0) ? this.otherBgColor : this.englishBgColor)
              .textAlign(TextAlign.Center)
              .margin({ left: 5, right: 5 })
              .borderRadius(this.rectBorderRadius)
              .onClick(() => {
                if (index == 0) {
                  //中文
                  if (this.onChinese != undefined) {
                    this.onChinese()
                  }
                } else {
                  if (this.onItemClick != undefined) {
                    this.onItemClick(item)
                  }
                }
              })
          }
        })
      }.margin({ top: 10 })
      Row() {
        ForEach(["123", "space", "确定"], (item: string, index: number) => {
          Text(item)
            .layoutWeight((index == 1) ? 2 : 1)
            .height(60)
            .backgroundColor(this.otherBgColor)
            .textAlign(TextAlign.Center)
            .margin({ left: 5, right: 5 })
            .borderRadius(this.rectBorderRadius)
            .onClick(() => {
              if (index == 0) {
                //数字
                if (this.onNumber != undefined) {
                  this.onNumber()
                }
              } else if (index == 1) {
                //空格
                if (this.onSpace != undefined) {
                  this.onSpace()
                }
              } else if (index == 2) {
                //确定
                if (this.onComplete != undefined) {
                  this.onComplete()
                }
              }
            })
        })
      }.margin({ top: 10 })
    }.backgroundColor(this.bgColor)
    .padding({ top: this.marginTop, bottom: this.marginBottom })
  }
}

封装使用

和车牌省份简称一样,车牌字母也进行封装,方便大家进行使用。

方式一:在Terminal窗口中,执行如下命令安装三方包,DevEco Studio会自动在工程的oh-package.json5中自动添加三方包依赖。


建议:在使用的模块路径下进行执行命令。


ohpm install @abner/keyboard


方式二:在工程的oh-package.json5中设置三方包依赖,配置示例如下:


"dependencies": { "@abner/keyboard": "^1.0.0"}

代码调用

EnglishKeyboardView({
        onItemClick: (item: string) => {
          //点击事件
          console.log("=====点击内容:" + item)
        },
        onDelete: () => {
          //点击删除
          console.log("=====点击删除")
        },
        onComplete: () => {
          //点击确定
          console.log("=====点击确定")
        },
        onChinese: () => {
          //点击中文切换
          console.log("=====点击中文切换")
        },
        onSpace: () => {
          //点击空格
          console.log("=====点击空格")
        },
        onNumber: () => {
          //点击数字
          console.log("=====点击数字")
        }
      })

属性介绍


属性

类型

概述

onItemClick

(item: string) => void

点击条目回调

onDelete

() => void

点击删除回调

onComplete

() => void

点击完成回调

onChinese

() => void

点击中文回调

onSpace

() => void

点击空格回调

onNumber

() => void

点击数字回调

bgColor

ResourceColor

背景颜色

englishBgColor

ResourceColor

英文背景颜色

otherBgColor

ResourceColor

非英文背景颜色

rectBorderWidth

Length

格子边框宽度

rectBorderRadius

Length

格子边框圆角

rectTextSize

Length

格子的文字大小

rectTextColor

ResourceColor

格子文字的默认颜色

deleteIconWidth

Length

删除icon宽度

deleteIconSrc

PixelMap /ResourceStr /DrawableDescriptor

删除icon资源

rectHeight

Length

每个格子高度

marginTop

Length

距离上边的距离

marginBottom

Length

距离下边的距离

相关总结

实现方式呢,有很多种,目前采用了比较简单的一种,如果大家采用网格Grid组件实现方式,也是可以的,但是需要考虑每行的边距以及数据,还有最后两行的格子占位问题。

目录
打赏
0
3
4
0
187
分享
相关文章
HarmonyOS Next 简单上手元服务开发
本文介绍了 HarmonyOS Next 中元服务的开发流程与关键特性。元服务是一种轻量级应用程序形态,支持免安装、秒开直达,适用于听音乐、打车等场景,大幅提升服务获取效率。文章详细讲解了元服务的开发旅程,包括在 AGC 平台上新建项目、修改名称与图标、新增卡片等内容,并提供了代码示例,如 AtomicServiceTabs 的 tab 切换和标题设置、AtomicServiceNavigation 的路由管理等。此外,还探讨了 AtomicServiceWeb 的使用方法,涵盖鸿蒙页面与 h5 页面的数据传递及方法调用。
52 19
HarmonyOS Next 简单上手元服务开发
鸿蒙开发:Canvas绘制之画笔对象Pen
Pen对象主要适用于修改图形形状的轮廓信息,可以修改的有,颜色,线宽,是否抗锯齿,透明度,线帽样式等等属性,当然了如果你想实现一个填充效果,需要切换Brush对象。
鸿蒙开发:Canvas绘制之画笔对象Pen
鸿蒙开发:了解Canvas绘制
本文主要简单的概述了Canvas绘制的基础知识,大家作为一个简单的了解即可,下面的几篇文章,我们会对相关的绘制再做进一步的分析,首先可以先做一个简单的总结:DrawingRenderingContext在使用上远远没有CanvasRenderingContext2D使用起来方便,比如在修改画笔的粗细,颜色等属性上,就可以体现出来。
鸿蒙开发:了解Canvas绘制
鸿蒙开发:Canvas绘制之画笔对象Brush
Brush对象主要适用于绘制图形的填充信息,可以修改的有,颜色,是否抗锯齿,透明度等属性,相对比Pen对象,少了几个属性,不过基本上也满足了日常的需求。
53 10
鸿蒙开发:Canvas绘制之画笔对象Brush
|
1天前
鸿蒙开发:事件订阅EventHub
EventHub主要提供了轻量级的线程内通信机制,适用于组件间数据同步、状态通知等场景,在实际的开发中,一定要注意两个事项,其一就是,注意off取消订阅的使用,可以避免内存泄漏,其二就是,关于事件命名的规范,建议使用常量定义事件名,避免硬编码错误。
鸿蒙开发:事件订阅EventHub
鸿蒙开发:动态添加节点
流程就是,通过typeNode来创建自己的组件,然后使用追加到FrameNode节点中,然后将自定义节点挂载到NodeContainer上即可,主要使用场景,需要动态创建组件的场景。
鸿蒙开发:动态添加节点
|
2天前
鸿蒙开发:如何实现文本跑马灯效果
如果只是一个普通的跑马灯效果,而且Text文本组件中的TextOverflow.MARQUEE可以满足需求,以Text为主,如果你想控制文本的速度,暂停等功能,可以使用Marquee,如果你想实现复杂的场景滚动,比如图片,各种组件嵌套滚动,这种只能自己定义了。
鸿蒙开发:如何实现文本跑马灯效果
|
23小时前
|
HarmonyOS NEXT函数和自定义构建函数
本内容分为两部分:第一部分介绍了TypeScript中的函数用法,包括有名函数、匿名函数(lambda表达式)、类型检查、可选参数和剩余参数等特性,并通过代码示例展示了其功能与限制。第二部分讲解了ArkUI框架中的自定义构建函数(@Builder),说明了其作为轻量级UI复用机制的作用,支持私有和全局两种定义方式,并详细描述了参数传递规则,包括按值传递和按引用传递的条件及约束。
21 12
鸿蒙开发:了解分割线
在实际的开发中,如果自带的分割线能够满足我们的需求,以自身的分割线属性为主,如果不满足,我们可以使用组件进行绘制。
63 16
鸿蒙开发:了解分割线
一文彻底拿下HarmonyOS NEXT开发实战调试技巧
这是一篇关于HarmonyOS NEXT开发调试技巧的文章,作者是一名经验丰富的程序员Feri。内容涵盖三种调试方法:预览+日志方式(适合简单调试,需注意数据类型转换)、断点调试(详细介绍了设置步骤与功能键使用)以及hilog实战使用(日志打印限制为4096字节,推荐封装维护)。通过这些技巧,帮助开发者更高效地解决问题,提升编程能力。
72 14
一文彻底拿下HarmonyOS NEXT开发实战调试技巧
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等