鸿蒙UI开发——基于onTouch事件实现表情选择胶囊

1、背 景

有朋友留言说,抖音APP中,长按评论按钮触发的快捷表情选择胶囊动画比较好(效果如下图),希望使用鸿蒙ArkTs也实现一个类似的。

图片

本文在鸿蒙ArkTs下也实现一个类似的效果,如下:

图片

首先,核心交互流程与抖音APP保持一致,即:

    1. 长按一个按钮,我们可以在按钮旁边生成一个快捷表情选择胶囊;

    2. 手指可以快捷的在候选表情上滑动,在选中的表情上停留时,该表情会稍微放大;

动画细节上做了一些个人效果,例如:

  • 胶囊展示到界面时,候选表情做了一个类似IOS解锁时的类飞入效果;

  • 我们在表情胶囊上滑动选择时,整个表情胶囊不会随着动画效果的改变发生宽度抖动。

下面开始介绍如何实现,文末有源代码,有需要的同学自取。

2、问题分析

上述的交互效果其实难点并不在于动画效果,在于onTouch事件的管理,因为,我们在长按评论按钮时,此时系统将会分配事件流给评论按钮消费。

如果我们想在用户不松手移动到其他位置,让其他组件也生效,实现过程将稍微复杂一些。

本文的实现思路是:监听评论按钮的onTouch事件,在事件move过程中,实时获取该事件的发生坐标,基于坐标去判断坐落的表情包位置,从而控制焦点放大效果。

📢📢注意

onTouch事件的调试千万要在真机或者模拟器中执行,在预览器中执行可能会出现非预期的问题。

❓我们怎么获取指定组件的坐标呢?

虽然我们通过onTouch事件可以知道用户手指的位置,那我们还有一个问题没解决,就是怎么知道各个表情包的坐标呢?

ArkTs为我们提供了一个API,根据组件ID获取组件实例对象, 通过组件实例对象将获取的坐标位置和大小同步返回给调用方,接口如下:

import { componentUtils } from '@kit.ArkUI';// 调用方式let modePosition:componentUtils.ComponentInfo = componentUtils.getRectangleById("id");

3、布 局

布局比较简单,在本文中,将整个表情胶囊用一个Row包裹,另外,评论图标与表情胶囊整体属于在一个Row中。示意图如下:

图片

为了方便动态插拔,我们将图标资源集合使用一个数组来动态维护,资源类型定义与数组定义如下:​​​​​​​

interface CommentIconInfo {
  
    source: Resource,  id: string;}const commentIcons: Array<CommentIconInfo> =  [    {
  
        id: 'page_main_icon1',      source: $r('app.media.send_you_a_little_red_flower'),    },    {
  
        id: 'page_main_icon2',      source: $r('app.media.powerful'),    },    {
  
        id: 'page_main_icon3',      source: $r('app.media.send_heart'),    }, {
  
      id: 'page_main_icon4',    source: $r('app.media.surprise'),  },  ]

布局代码如下:​​​​​​​

build() {
  
    Column() {
  
      Row() {
  
        Row() {
  
  
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值