开篇点题,今天玩点花的。

不知道大家有没有发现,抖音上的评论键长按会弹出一排表情框用于快速评论,不过现在鸿蒙原生版的抖音还没有这个功能,今天幽蓝君就小试牛刀,在鸿蒙上做一下这个功能,也是应一位友友的私信要求。

不过幽蓝君学艺不精,水平有限,只能模仿个三分像,仅供大家参考。

话不多说,直接看成品效果图:

 

实话实说,真的是有点难,昨晚搞到零点一刻,一度崩溃。关于这个功能的实现过程,还听幽蓝君细细道来。

首先你看这个弹出框,它并不存在于页面之中,因为在弹出之后整个页面是有蒙版的,除了它之外所有按键不能点击,所以它其实是一个弹框,我选择使用CustomDialogController来实现。

那么问题来了,CustomDialogController覆盖在页面上方,怎么做才能让这一排表情看起来像是从评论按钮里弹出呢?

幽蓝君的实现思路是这样的,将弹框的起始位置设置在评论按钮上,弹框的尺寸尤其是宽度设置为0,在动画的过程中,让弹框的x坐标不断左移,同时宽度增加,这样看起来就像是从评论按钮中滑出来。

相关代码如下:

Flex({ direction: FlexDirection.Row,justifyContent:FlexAlign.SpaceEvenly,alignItems:ItemAlign.Center }) {
})
.width(this.menuWidth)
.height(60)
.opacity(this.alpha)
.position({ x: this.menuX })
.backgroundColor('rgb(22,22,22)')
.animation({ duration: 300, curve: Curve.Linear, iterations: 1 })
.onAppear(()=>{
this.menuX = 0 this.menuWidth = 200
})

弹出动画做完了,内容部分很简单,就几个表情,下面要做的事情是长按表情放大,不仅长按会放大,长按之后滑动到表情上也会放大,所以我判断这是一个组合手势,长按手势和滑动手势的组合。

这个组合手势也有前后顺序,只有长按开始之后的滑动才会有放大效果。

所以我的实现逻辑是这样的,给单个表情添加长按放大手势,给整个弹框添加触摸手势onTouch,根据它返回的坐标确定当前的表情,为了提高精度,我对坐标进行了判断,只有滑动到表情中间才会触发放大效果。相关代码如下:

//表情长按
.gesture(
LongPressGesture({ repeat: false })
.onAction((event: GestureEvent) => {
this.bigIndex = index
this.longPress = true
})
)
//长按之后滑动
.onTouch((event?: TouchEvent) => {
if(event && this.longPress){
if(event.touches[0].x > 0 && event.touches[0].x < 200){
if(event.touches[0].y > 25 && event.touches[0].y < 35){
let ys = event.touches[0].x%50
if(ys > 20 && ys < 40){
this.bigIndex = Math.floor(event.touches[0].x/50)
}
}
}
}
})

接下来,最难的部分来了,点击表情进行评论的时候,除了弹框消失以外,它还有一个发射的效果,发射一串表情到评论按钮里,这玩意怎么实现呢。

首先想到的是路径动画motionPath,最终也确实是用它实现,不过过程没那么容易,因为我们这个效果是出场的时候不触发,退出的时候触发动画。但是motionPath这个东西并不支持像按钮点击主动触发,只能通过尺寸或者位置的变化来触发,官方管这叫设计哲学。。。

我的实现思路是这样的,在点击某个表情之后,在对应的位置创建三个相同的表情,然后依次发射出去,但是又怎么实现依次发射的效果呢。使用计时器吗,效果并不好,最后发现在animation上设置不同的动画时间可以实现想要的效果:

Text(this.emoList[this.toggleIndex])
.fontSize(this.toggleSize)
.motionPath({ path: this.animatePath, from: 0.0, to: 1.0, rotatable: false })
.position({x:this.toggleX,y:0})
.animation({ duration: this.duration, curve: Curve.EaseIn, iterations: 1 })

以上就是今天内容的整个实现过程,其实它从技术角度上并不难,难的是实现思路和方法,这就好比华为推出三折叠手机之后很多友商也要推出三折叠了,在这之前你怎么不造呢,因为华为的专利没有公布。

鸿蒙Next开发实战教程:实现抖音长按快速评论特效的更多相关文章

  1. Swift游戏开发实战教程(霸内部信息大学)

    Swift游戏开发实战教程(大学霸内部资料) 试读下载地址:http://pan.baidu.com/s/1sj7DvQH 介绍:本教程是国内第一本Swift游戏开发专向资料. 本教程具体解说记忆配对 ...

  2. asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发4- 后台模板html页面创建

    上一篇教程<asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发3-登录模块开发>完成了本项目的登录模块,登录后就需要进入后台管理首页了,需要准备一个后台模 ...

  3. asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发2-Model层建立

    上篇(asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发1-准备工作)文章讲解了开发过程中的准备工作,主要创建了项目数据库及项目,本文主要讲解项目M层的实现,M层这里 ...

  4. 微信小程序-云开发实战教程

    微信小程序-云开发实战教程 云函数,云存储,云数据库,云调用 https://developers.weixin.qq.com/miniprogram/dev/wxcloud/basis/gettin ...

  5. Python开发实战教程(8)-向网页提交获取数据

    来这里找志同道合的小伙伴!↑↑↑ Python应用现在如火如荼,应用范围很广.因其效率高开发迅速的优势,快速进入编程语言排行榜前几名.本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知 ...

  6. React Native Android原生模块开发实战|教程|心得|怎样创建React Native Android原生模块

    尊重版权,未经授权不得转载 本文出自:贾鹏辉的技术博客(http://blog.csdn.net/fengyuzhengfan/article/details/54691503) 告诉大家一个好消息. ...

  7. asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发3-登录模块开发

    进行本文之前需要在数据库用户表里面增加一条用户数据,直接手动添加即可,未安全考虑密码一定要使用Md5加密后的,这里提供666666的Md5密文为(c831b04de153469d),本文完成登录模块的 ...

  8. asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发1-准备工作

    /****** Object: 新闻表 Script Date: 2017/9/2 星期六 15:11:12 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENT ...

  9. php扩展开发实战教程(1)

    我的开发环境: Ubuntu16.04 apt方式安装的php5.6, apache,mysql等 由于我的本机用的是apt方式安装的php,所以我这里从头开始用最精简的方式,编译安装一个php5.4 ...

  10. HTML5 App商业开发实战教程 基于WeX5可视化开发平台

随机推荐

  1. ABB机器人IRB 6700维修保养技巧

    通过与子锐机器人维修保养服务定制合理的机器人保养工作,可以确保ABB机器人IRB 6700的持续稳定运行,延长其使用寿命,为企业的生产提供有力保障. 一.ABB机器人IRB 6700日常检查与维护 外 ...

  2. 基于融合语义信息改进的内容推荐算法。Improved content recommendation algorithm integrating semantic information

    引言 路漫漫其修远兮,吾将上下而求索.每天一篇论文,做更好的自己. 本文读的这篇论文为发表于2023年5月28日的一篇名为<基于融合语义信息改进的内容推荐算法>(基于融合语义信息改进的内容 ...

  3. 百万架构师第四十七课:并发编程的原理(二)|JavaGuide

    原文链接 JavaGuide <并发编程的艺术> 并发编程的实现原理 目标 上节课内容回顾 synchronized 原理分析 wait 和 notify Lock 同步锁 回顾 原子性 ...

  4. 自动化-Yaml文件读取函数封装

    1.文件布局 打开文件修改读取方式为w load函数加载文件 class ReadConfiYaml: def __init__(self,yaml_file): self.yaml_file=yam ...

  5. python以及java环境搭建+解决不同版本环境共存问题

    1.搭建python环境 1.安装python3.9.7,选择自定义安装.将文件添加至环境路径,然后选择下一步. 2.默认.然后选择下一步. 3.选择适用于所有使用者,选择自己想要存放的路径,然后选择 ...

  6. Python 潮流周刊#93:为什么“if not list”比len()快2倍?(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  7. windows本地认证

    windows本地认证 本地认证概述 本地认证最简单的例子就是我们的电脑上存储着自己的账号密码,无论电脑是否联网,只要能开机,就可以输入账号密码登录到电脑中,工作组就是采用本地认证. 那认证流程是什么 ...

  8. php 过滤掉emoji表情

    <?php function filter_emoji($str) { $str = preg_replace_callback( //执行一个正则表达式搜索并且使用一个回调进行替换 '/./u ...

  9. Pydantic配置继承抽象基类模式

    title: Pydantic配置继承抽象基类模式 date: 2025/3/21 updated: 2025/3/21 author: cmdragon excerpt: Pydantic模型配置系 ...

  10. 如何设置家用威联通 NAS UPS 断电后自动关机并通知其他设备?

    场景 备注: 求轻喷, 求放过. 我真的是个理线方面的白痴. 这已经是我的极限了. 我的家庭实验室 Homelab 服务器集群配置如下. 上半部分之前已经介绍过了, 这里就不再赘述了. 今天重点介绍介 ...