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

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

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

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

 

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

首先你看这个弹出框,它并不存在于页面之中,因为在弹出之后整个页面是有蒙版的,除了它之外所有按键不能点击,所以它其实是一个弹框,我选择使用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. 若依-Vue 单体版本 更换mybatisPlus

    1.单体模块在pom.xml ; 多模块版本在ruoyi-common\pom.xml.模块添加整合依赖 <!-- mybatis-plus 增强CRUD --> <dependen ...

  2. QT5笔记: 31. 文件目录操作

    开发的时候,QtCreator F1 查看相关类的信息

  3. Emacs 的优点及与 DE 的比较

    一.引言 在编程领域,对于工具的选择一直是开发者们热议的话题.今天,我们来探讨一下 Emacs 及其所具有的优点,并思考使用 Emacs 写程序是否真的比使用集成开发环境(IDE)更方便. 二.Ema ...

  4. PHP将变量存储在数据库中,读取并执行变量的方法

    http://www.edbiji.com/doccenter/showdoc/4/nav/1214.html 例如将下边的字符串存储到数据库中您好,您的验证码是".$authcode.&q ...

  5. rust学习笔记(7)

    crate 中文是货箱,这是我们编写自己的库或者程序的方式 库 使用rustc可以把一个文件编译为lib rustc --crate-type=lib rary.rs 构建的方式选择lib 编译出来的 ...

  6. mysql导入失败

    mysqldump导出数据库表的数据会加上一些SQL的注释,这些注释会在批量执行SQL语句中造成错误,需要提前删除. sql开始部分: SET @@SESSION.SQL_LOG_BIN = @MYS ...

  7. Dockerfile 语法与常用命令

    转发请注明出处: 一.Dockerfile 核心语法规则 指令大写:所有指令必须大写(如 FROM, RUN) 顺序执行:指令按顺序从上到下执行 分层构建:每条指令生成一个镜像层,修改上层不会影响下层 ...

  8. 解决Oracle锁表情况

    在使用Oracle数据库更新数据的时候,有两种查询方式可以修改编辑数据: select t.*,t.rowid from table t select * from table for update ...

  9. linux下expdp和impdp命令

    一.查看管理理员目录(同时查看操作系统是否存在,因为Oracle并不关心该目录是否存在,如果不存在,则出错) >select * from dba_directories; 删除定义目录 > ...

  10. 微服务架构的守护者:Redisson 分布式锁与看门狗机制实战指南

    1. 分布式锁简介 1.1 什么是分布式锁 在单机应用中,可以使用 Java 内置的锁机制(如 synchronized.ReentrantLock 等)来实现线程间的同步.但在分布式环境下,由于应用 ...