HarmonyOS实战:自定义表情键盘

前言

在日常开发中,不同的应用程序都有自己专属的键盘,特别是在评论和发帖中需要自定义表情键盘,鸿蒙中对自定义键盘提供了很好的支持,本篇文章将带你一步步实现一个自定义表情键盘,建议点赞收藏!

实现效果

需求分析

  • 对数据源进行拆分组合。
  • 处理表情之间的间隔与删除表情的位置。
  • 实现表情键盘的布局。

技术实现

  1. 定义一个数组用来临时存放表情字符

    let array: string[] = [
      "😁", "😂", "😃", "😄", "😅", "😆", "😉", "😊",
      "😋", "😌", "😍", "😏", "😒", "😓", "😔", "😖",
      "😘", "😚", "😜", "😝", "😞", "😠", "😡", "😢",
      "😣", "😤", "😥", "😨", "😭", "😰", "😩",
      "😪", "😫", "😱", "😲", "😳", "😵", "😷", "😀",
      "😇", "😎", "😐", "😑", "😕", "😗", "😙", "😛",
      "😟", "😦", "😧", "😬", "😮", "😯", "😴", "😶",
      "😸", "😹", "😺", "😻", "😼", "😽", "😾",
      "😿", "🙀"
    ]
  1. 对数据源进行处理,这里键盘每页设置 31 个表情和一个删除表情。其中对 31 取整用来实现表情分页,最后当前页面表情等于 31 时,添加一个删除类型的表情。
 array.forEach((item, index) => {
      if (index % 31 == 0) {
        emojiPackages.push(new SCEmojiPackageBean())
      }
      let laseSectionBean = emojiPackages[emojiPackages.length-1]
      laseSectionBean.emojis.push(item)
    
      if (laseSectionBean.emojis.length == 31) {
        laseSectionBean.emojis.push(SCEmojiModelType.delete)
      }
    })

3.当表情分页后,最后一页的表情不足 31 个时,填充空格以保证删除表情显示在键盘的右下角,SCEmojiModelType 是个枚举类型,定义了表情,删除,空格三个类型。

if (emojiPackages.length > 0) {
      let laseSectionBean = emojiPackages[emojiPackages.length-1]
      let appentCount = 32 - laseSectionBean.emojis.length
      for (let index = 0; index < appentCount; index++) {
        if (index == appentCount - 1) {
          laseSectionBean.emojis.push(SCEmojiModelType.delete)
        } else {
          laseSectionBean.emojis.push(SCEmojiModelType.space)
        }
      }
    }
  1. 当数据源与表情位置确定好后,需要实现页面布局,这里使用 Swiper 实现页面分页效果。
Swiper(this.swiperController) {
      ForEach(this.emojiPackages, (model: SCEmojiPackageBean, index) => {
        this.itemSectionView(model)
      }, (model: SCEmojiPackageBean, index) => {
        return "" + index
      })
    }
    .width(FULL_WIDTH)
    .height(FULL_HEIGHT)
    .backgroundColor("#f8f8f8")
  1. Swiper 的每个子页面需要使用 Grid 给表情布局,实现四行八列。
 Grid() {
        ForEach(sectionModel.emojis, (item: SCEmojiModelType | string, index) => {
          GridItem() {
            Column() {
              this.itemView(item)
            }
            .width(FULL_WIDTH)
            .height(FULL_HEIGHT)
          }
        }, (item: SCEmojiModelType | string, index) => {
          return "" + index
        })
      }
      .columnsTemplate('1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr')
      .rowsTemplate('1fr 1fr 1fr 1fr')
      .width(FULL_WIDTH)
      .height(FULL_HEIGHT)
  1. 根据不同的数据类型显示不同的表情或填充空格。
 if (text == SCEmojiModelType.space) {
      Text("")
        .fontSize($r("app.float.vp_20"))
        .textAlign(TextAlign.Center)
    } else if (text == SCEmojiModelType.delete) {
      Text("🔙")
        .fontSize($r("app.float.vp_20"))
        .textAlign(TextAlign.Center)
        .onClick(()=>{
          this.inputEvent("")
        })
    } else if (text as string) {
      Text(text as string)
        .fontSize($r("app.float.vp_20"))
        .textAlign(TextAlign.Center)
        .onClick(()=>{
          this.inputEvent(text as string)
        })
    }

总结

在实现自定义表情键盘的过程中,需要对表情键盘对数据源进行处理,以实现显示页面的整齐效果,同时通过不同的表情类型,实现删除效果和填充空格对齐,已经学会了的小伙伴,赶快动手试试吧。

全部评论

相关推荐

二月份来北京实习,虽然提前做了攻略,但是是人生第一次经历租房,全程自己搞定,所以难免还是踩坑了😅奉劝大家,租房不要只看自己的房间如何,还要看别人的房门口环境如何因为我就是那个倒霉蛋,我旁边房间额门口堆了一大堆杂物,都是另一个房间的人放在外面的,而且他门口放了几十双鞋子,冬天还好,现在是夏天,可太味了,怎么有这么多鞋啊啊啊啊,请看图片O(≧口≦)O一开始这屋里是一个人住,后来变成两个人住(他说他妈妈来北京看病暂时住,ok能体谅的)但是大概一个多月以后他妈妈回家了,无缝衔接了一位女朋友接着住,而且他的女朋友巨能买东西,我真的不得不吐槽,🥲我不管别人怎么花钱的,但是你买东西你起不来,你能不能换个时间约送上门,总是在周内或者周末的某一天早上七点多,没到起来的时间,快递员框框敲门了!!!!而且经常点外卖但是我们楼下有门禁,外卖员按响铃他俩不去解锁,一直等一直等,等到我们其他人受不了去帮解锁,吵得要死,他们像聋了一样!!!服啦!!!我的房租一个月不到1600,但是是阳隔,很不隔音,隔壁的大哥有时候会半夜吃薯片或者嗑瓜子(凌晨两三点的时候)好几次我都从梦里被嗑出来了🥲还好还剩两个月就实习结束可以回家了,呜呜想家,想我自己的窝😭
码农索隆:这也是我不喜欢合租的原因
我的租房踩坑经历
点赞 评论 收藏
分享
高考出分的那天,我没有哭,也没有笑。手机屏幕上跳出的那个数字,没有惊天动地,也没有波澜壮阔,却像一道闷雷,在我的世界里缓缓滚过。十二年的求学生涯,从农村的土路一路走到城市的水泥地,我不止一次幻想过那天的场景:我会不会激动得落泪,会不会兴奋到跳起来?可真正那天来临时,我却只是平静地点开网页,读完分数,默默放下手机。我是12年上的初中,一个县城的县中,每天清晨五点半起床,五点五十准时跑操,六点零五开始早读。晚上九点半放学,回家后再复习、写作业,常常要到十一点半才能躺下,睡眠时间只有六个小时。高中上的是省重点,一群来自四面八方的尖子生聚集在一起,竞争更加激烈。学校晚自习延迟到了十点半,回家后依然要学习,接近十二点才睡,每天的睡眠变成了五个半小时。在那里,每年都有听说某个学生因压力过大选择了极端的方式,那些沉重的消息像乌云一样笼罩着校园,而我们都低着头,只敢在深夜崩溃。在那样的环境中,分数成了衡量一切的标准。父母却对我没有过高的期望给我压力,他们只希望我能“考个一本”,这句话我听了很多年,几乎成了我脑海里唯一的目标。等到分数出来,我高出一本线近50分,不算耀眼,但足够圆满。对我来说,这是努力与命运达成的一种和解。那一刻,仿佛十多年压在身上的压力,在一瞬间找到了出口,不是泪水,而是彻底的沉静。那天之后,我没有像别人那样疯狂庆祝,只是难得地睡了一个午觉,没有人来打扰,没有梦,醒来时天已经黑了。我终于可以不再设闹钟、不再数睡眠时间、不再靠咖啡续命,终于可以把“高考”从背上卸下,像卸下一块沉重的石头。后来我录取上一所省内不错的大学,城市很大,人生也开始走上新的轨道。回望那年夏天,高考出分的那一天,就像一次告别,告别了过度压抑的青春,也告别了那个不敢停下来的自己。
blitz@0725:22届,那很幸福了
高考出分的那一天,我__
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务