首页 > 其他分享 >鸿蒙Next开发实战教程:实现抖音长按快速评论特效

鸿蒙Next开发实战教程:实现抖音长按快速评论特效

时间:2024-12-07 19:33:08浏览次数:4  
标签:touches 音长 鸿蒙 实现 弹框 评论 Next event 表情

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

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

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

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

图片

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

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

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

标签:touches,音长,鸿蒙,实现,弹框,评论,Next,event,表情
From: https://www.cnblogs.com/youlanjihua/p/18592574

相关文章

  • 关于HarmonyOS NEXT中的模块化开发
    今天不写页面和动画,斗胆给大家讲一讲软件工程。软件工程讲究高内聚低耦合,意思就是把整个工程按照分工不同分成不同的模块,每一个模块紧密联系又互不影响。就像一座摩天大楼,它里面的电路网非常庞大和复杂,它们每一层楼每一个房间都能独立运行且互不影响,所有的房间电路都通过一个总开......
  • 鸿蒙Next开发实战教程-使用WebSocket实现即时聊天
    鸿蒙系统提供了WebSocket库,使用它可以很方面的实现即时聊天功能,今天就使用WebSocket来实现一个完整的聊天功能。首先创建一个WebSocket实例:letws=webSocket.createWebSocket()然后创建WebSocket连接,我找到一个简单的ws地址,它直接返回我们发送的消息:leturl='ws://124.......
  • 鸿蒙技术分享:鸿蒙应用元服务上架审核拒审问题(持续更新@20241121)
    ......
  • 鸿蒙应用开发从入门到入行 - 第八天:Tabs选项卡页签视图切换
    鸿蒙应用开发从入门到入行第八天-Tabs选项卡导读:在本篇文章里,您将掌握使用Tabs选项卡做栏目分类,这是未来应用开发中极为常用的组件首先说一声抱歉,比较忙很久没更新了。但放心吧,目前该忙的事已经忙完,后面会恢复更新频率。以及后续有计划出一套免费视频教程,敬请期待!本......
  • 如何在x86模拟器和鸿蒙API9如何使用MQTT模块ohos_mqtt
    目录引言安装失败的原因如何编译so文件的x86_64版本下载源代码 安装NDK代码编译安装MQTT软件包避免MQTT软件包自动升级设置libs客户端程序的编写运行测试结语参考文献引言在上周的博客(如何在鸿蒙API9和x86模拟器中使用MQTT-CSDN博客)中介绍了我的学生有个需求......
  • 鸿蒙NEXT开发中如何确保使用 PersistentStorage 存储的数据安全?
    大家好,我是V哥,在鸿蒙NEXT开发中,我们会使用PersistentStorage来存储一些数据,那问题来了,如何确保使用PersistentStorage存储的数据安全呢,今天的内容来聊一聊这个话题。首先,确保PersistentStorage存储的数据安全,我们可以考虑以下这些方面:数据加密:静态数据加密:对存储......
  • 鸿蒙开发-Divider 组件
    在ArkTS中,Divider组件是用于在界面上显示分割线的组件,以下是其详细介绍:基本功能Divider组件主要用于将页面中的不同部分进行视觉上的分隔,使页面布局更加清晰和有条理,增强用户界面的可读性和美观性。常用属性color:用于设置分割线的颜色,接受ResourceColor类型的值,可以是......
  • HarmonyOS Next 与其他系统加密技术对比
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)与其他常见操作系统(如安卓、iOS)加密技术的差异,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。第一......
  • HarmonyOS Next 分布式加密协作应用案例剖析
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)在分布式加密协作应用中的应用,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。第一章:应用场景与架......
  • 鸿蒙 Next 中 State 的使用方法介绍
    在ArkUI框架中,@State装饰器用于管理组件内的状态,使得状态变化能够触发UI的更新。以下将详细介绍@State的使用方法。一、概述1.定义与作用@State装饰的变量,即状态变量,是私有的,只能在组件内部访问。它是大部分状态变量的数据源,一旦其值发生改变,就可以触发直接绑定UI组件的刷新,从......