HarmonyOS实战:自定义表情键盘

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,1000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: 本文介绍如何在鸿蒙系统中实现一个自定义表情键盘,涵盖数据处理、布局设计与交互逻辑,助你打造个性化输入体验。

前言

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

实现效果  

需求分析

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

技术实现

  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)
        })
    }

总结

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

目录
相关文章
|
1月前
|
监控 JavaScript 编译器
从“天书”到源码:HarmonyOS NEXT 崩溃堆栈解析实战指南
本文详解如何利用 hiAppEvent 监控并获取 sourcemap、debug so 等核心产物,剖析了 hstack 工具如何将混淆的 Native 与 ArkTS 堆栈还原为源码,助力开发者掌握异常分析方法,提升应用稳定性。
379 37
|
1月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
204 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
1月前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
122 0
|
1月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
238 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
1月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
522 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
2月前
鸿蒙应用开发从入门到实战(十六):线性布局案例
ArkUI提供了丰富的系统组件,用于制作鸿蒙原生应用APP的UI,本文通过简单案例演示如何使用Column和Row组件实现线性布局。
148 1
|
2月前
|
开发者 容器
鸿蒙应用开发从入门到实战(十四):ArkUI组件Column&Row&线性布局
ArkUI提供了丰富的系统组件,用于制作鸿蒙原生应用APP的UI,本文主要讲解Column和Row组件的使用以及线性布局的方法。
274 12
|
2月前
|
API 数据处理
鸿蒙应用开发从入门到实战(十三):ArkUI组件Slider&Progress
ArkUI提供滑块Slider与进度条Progress组件,用于鸿蒙原生APP开发。Slider支持拖动调节音量、亮度等,可设步长、方向及提示气泡;Progress支持线性、环形等多种样式,可自定义颜色、宽度与刻度,实时显示任务进度。
232 2
|
2月前
|
API 数据处理
鸿蒙应用开发从入门到实战(十三):ArkUI组件Slider&Progress
ArkUI提供了丰富的系统组件,用于制作鸿蒙原生应用APP的UI,本文主要讲解滑块Slider和进度条Progress组件的使用。
165 1
|
2月前
|
开发者
鸿蒙应用开发从入门到实战(十二):ArkUI组件Button&Toggle
ArkUI提供了丰富的系统组件,用于制作鸿蒙原生应用APP的UI,本文主要讲解按钮组件Button和Toggle的使用。
290 2
下一篇
oss云网关配置