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

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

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

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

 

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

首先你看这个弹出框,它并不存在于页面之中,因为在弹出之后整个页面是有蒙版的,除了它之外所有按键不能点击,所以它其实是一个弹框,我选择使用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. 【VMware vSphere】扩容或缩减 vCenter Server 的磁盘空间大小。

    我们在部署 vCenter Server 时,根据不同环境的情况,可以选择不同的部署选项,比如环境中的主机可能运行了 100 个,或者虚拟机运行了 1000 个,此时按照官方推荐的选择"小型 ...

  2. 安卓编译报错Execution failed for task ‘:expo-modules-core:prepareBoost‘. Not in GZIP format的解决方案

    作者: Kovli 重要通知:红宝书第5版2024年12月1日出炉了,感兴趣的可以去看看,https://u.jd.com/saQw1vP 红宝书第五版中文版 红宝书第五版英文原版pdf下载(访问密码 ...

  3. 清华大学推出第三讲普通人如何抓住 DeepSeek 红利,普通人必备的免费AI手册!

    前言 在当今这个日新月异的时代,人工智能(AI)技术正以前所未有的速度改变着我们的生活.工作和社会结构.从智能手机上的语音助手到自动驾驶汽车,从医疗诊断到学术研究,AI的应用无处不在,它如同一股不可阻 ...

  4. 无线路由器dBi越大越好吗?

    无线路由器dBi越大越好吗? 目前,常见的无线路由器,通过查看参数可知,大多为3dBi.5dBi或7dBi,对于用户来说,这个数值到底是越大越好,还是越小越好呢?对于这个问题,其实通过下面这张天线增益 ...

  5. 互联网和DeepSeak时代,获取信息这么容易,为什么我们还是学习不好?

    因为人性倾向于立即获得享受,而不是延迟获得享受,然而,学习就是延迟获得享受,所以,学习,其实是反人性的一种活动. 学习,特别是对知识的深入学习,其实需要付出大量的时间和精力,这个过程中必然伴随着各种各 ...

  6. 数字先锋 | 天翼云xDeepSeek,赋能东莞开启智慧政务新篇章!

    人工智能浪潮奔涌 DeepSeek堪称"全能战士" 在各行各业疯狂"上分" 特别是在政务领域 其以强大的智能问答 公文写作.数据分析等能力 为政务服务按下了&q ...

  7. SpringBoot - [00] 注解大全

    原文链接:https://mp.weixin.qq.com/s/DgNhohtJyEq4vMGEzqrP8A @SpringBootApplication 这个注解用于标识一个SpringBoot应用 ...

  8. 【攻防世界】catcat-new

    catcat-new 题目来源 攻防世界 NO.GFSJ1168 题解 dirsearch爆破目录,得到http://61.147.171.105:55027/admin,没有有用信息 点开主页的图片 ...

  9. css 技巧:利用 after 伪对象和 background 属性实现 img 图片标签占位图

    同步发布:https://blog.jijian.link/2020-04-15/css-img-after-placeholder/ 如图: 图片加载失败了,在浏览器会默认显示一张破图.受各种网速. ...

  10. nnUNet 使用方法

    首先明确分割任务. 其次明确研究方法和步骤. 再做好前期准备,如数据集的采集.标注以及其中的训练集/测试集划分. 其中的参考链接: (四:2020.07.28)nnUNet最舒服的训练教程(让我的奶奶 ...