OpenHarmony成功复合手势识别

  • 电脑网络维修
  • 2024-11-15

OpenHarmony提供的热区设置属性(responseRegion)只能在不同的触摸热区中触发相反的事情,那么如何成功不同热区不共事情呢,本例即以上述视频播放场景为例启动说明。

成果出现

成果说明:开局时视频以反常速度播放,播放到5秒时,长按播放器右侧触发快进播放,播放到14秒时长按播放器左侧触发快退播放。

环境要求

本例基于以下环境开发,开发者也可以基于其余适配的版本启动开发:

成功思绪

简直组件的一切触摸事情都会前往event,经过前往的event可以失掉到触摸点的坐标位置,那么就可以依据坐标位置为不同的组件区域减少不同的交互举措。如图:假定有一个长度为200vp的组件,咱们宿愿点击组件的左侧时触发事情A,点击组件的右侧时触发事情B,那么就可以经过触摸点的坐标来判别,当触摸点的x坐标<=100时,触发事情A,反之触发事情B。

本例即驳回上述思绪为Video组件的左右两侧减少不同的交互举措。从而成功长按视频播放器的左侧触发前进播放,长按右侧触发快进播放。

开发步骤

本例具体开发步骤如下,开发步骤中仅展现相关步骤代码,全量代码请参考完整代码章节的内容。

经过Video组件创立视频播放器,并减少触摸手势,经过触摸控制视频的播放、暂停。

@Componentexport struct VideoPlayer{//...private isPlaying:boolean = trueprivate updateTime: numberprivate videoController:VideoController = new VideoController()build(){// 减少视频组件Video({src:this.videoSrc, controller:this.videoController, previewUri:this.videoPreviewer,currentProgressRate:this.playRate})//...// 失掉进展条的期间点.onUpdate((e)=>{this.updateTime = e.time}).gesture(// 减少触摸手势TapGesture({count:1}).onAction((event:GestureEvent)=>{if (this.isPlaying){// 触摸触发播放this.videoController.start()this.isPlaying = !this.isPlaying} else {// 再次触摸触发暂停this.videoController.pause()this.isPlaying =!this.isPlaying}}))}}

为Video组件减少长按手势,经过长按手势触发播放的快退和快进举措。因为触摸手势和长按手势须要互斥,即一次性只能触发一种手势,所以经过GestureGroup来成功手势的互斥。

.gesture(// 经过GestureGroup的GestureMode.Exclusive参数控制手势互斥GestureGroup(GestureMode.Exclusive,// 减少触摸手势TapGesture({count:1}).onAction((event:GestureEvent)=>{if (this.isPlaying){// 触摸触发播放this.videoController.start()this.isPlaying = !this.isPlaying} else {// 再次触摸触发暂停this.videoController.pause()this.isPlaying =!this.isPlaying}}),// 减少长按手势LongPressGesture({repeat:true})// 长按时触发快进或快退.onAction((event)=>{//减少快进和快退的逻辑,经过event失掉手势坐标启动判别。})// 长按完结后播放速度回归反常.onActionEnd(()=>{// 减少回归反常播放的逻辑})))

补充长按手势中的业务逻辑:经过event失掉到触摸点的x坐标:localX,当localX>=200时,说明触摸点在组件的右侧,触发快进播放;当localX<200时,说明触摸点在左侧,触发快退播放。当触摸中止时,回归反常播放速度。

// 减少长按手势LongPressGesture({repeat:true})// 长按时触发快进或快退.onAction((event)=>{// 失掉到触摸点x坐标localX,当localX>=200时,说明触摸点在组件的右侧,触发快进播放if (event.fingerList[0].localX>=200){// 播放速度变为2倍速this.playRate = PlaybackSpeed.Speed_Forward_2_00_X}// 当localX<200时,说明触摸点在左侧,触发快退播放if (event.fingerList[0].localX<200){if (this.intervalCount===0){// 经过进展期间减小来到达快退的目标,经过setInterval来控制前进的速度,否则会延续触发前进,瞬间前进到播放终点this.seekBack = setInterval(()=>{this.updateTime -= 1this.videoController.setCurrentTime(this.updateTime)},500)}this.intervalCount = 1}})// 长按完结后播放速度回归反常.onActionEnd(()=>{// 播放回归到1倍速this.playRate = PlaybackSpeed.Speed_Forward_1_00_X// 清空计时器clearInterval(this.seekBack)this.intervalCount = 0})

完整代码

说明:本例中经常使用的视频等资源须要交流为开发者自己的资源。

@Entry@Componentexport struct VideoPlayer{private videoSrc:Resource = $rawfile('video_1.mp4')private isPlaying:boolean = trueprivate updateTime: number = 0private videoPreviewer:Resource = $r('app.media.wandering_previewer')private videoController:VideoController = new VideoController()@State playRate:number = 1private seekBack:number = 0private intervalCount:number = 0build(){Column(){// 减少视频组件Video({src:this.videoSrc, controller:this.videoController, previewUri:this.videoPreviewer,currentProgressRate:this.playRate}).width('100%').height('30%').backgroundColor('#fffff0').controls(true).objectFit(ImageFit.Contain)// 失掉进展条的期间点.onUpdate((e)=>{this.updateTime = e.time}).gesture(// 经过GestureGroup的GestureMode.Exclusive参数控制手势互斥GestureGroup(GestureMode.Exclusive,// 减少触摸手势TapGesture({count:1}).onAction((event:GestureEvent)=>{if (this.isPlaying){// 触摸触发播放this.videoController.start()this.isPlaying = !this.isPlaying} else {// 再次触摸触发暂停this.videoController.pause()this.isPlaying =!this.isPlaying}}),// 减少长按手势LongPressGesture({repeat:true})// 长按时触发快进或快退.onAction((event)=>{// 失掉到触摸点x坐标localX,当localX>=200时,说明触摸点在组件的右侧,触发快进播放if (event.fingerList[0].localX>=200){// 播放速度变为2倍速this.playRate = PlaybackSpeed.Speed_Forward_2_00_X}// 当localX<200时,说明触摸点在左侧,触发快退播放if (event.fingerList[0].localX<200){if (this.intervalCount===0){// 经过进展期间减小来到达快退的目标,经过setInterval来控制前进的速度,否则会延续触发前进,瞬间前进到播放终点this.seekBack = setInterval(()=>{this.updateTime -= 1this.videoController.setCurrentTime(this.updateTime)},500)}this.intervalCount = 1}})// 长按完结后播放速度回归反常.onActionEnd(()=>{// 播放回归到1倍速this.playRate = PlaybackSpeed.Speed_Forward_1_00_X// 清空计时器clearInterval(this.seekBack)this.intervalCount = 0})))}.height('100%').width('100%')}}
  • 关注微信

本网站的文章部分内容可能来源于网络和网友发布,仅供大家学习与参考,如有侵权,请联系站长进行删除处理,不代表本网站立场,转载联系作者并注明出处:https://duobeib.com/diannaowangluoweixiu/7343.html

猜你喜欢

热门标签

洗手盆如何疏浚梗塞 洗手盆为何梗塞 iPhone提价霸占4G市场等于原价8折 明码箱怎样设置明码锁 苏泊尔电饭锅保修多久 长城画龙G8253YN彩电输入指令画面变暗疑问检修 彩星彩电解除童锁方法大全 三星笔记本培修点上海 液晶显示器花屏培修视频 燃气热水器不热水要素 热水器不上班经常出现3种处置方法 无氟空调跟有氟空调有什么区别 norltz燃气热水器售后电话 大连站和大连北站哪个离周水子机场近 热水器显示屏亮显示温度不加热 铁猫牌保险箱高效开锁技巧 科技助力安保无忧 创维8R80 汽修 a1265和c3182是什么管 为什么电热水器不能即热 标致空调为什么不冷 神舟培修笔记本培修 dell1420内存更新 青岛自来水公司培修热线电话 包头美的洗衣机全国各市售后服务预定热线号码2024年修缮点降级 创维42k08rd更新 空调为什么运转异响 热水器为何会漏水 该如何处置 什么是可以自己处置的 重庆华帝售后电话 波轮洗衣机荡涤价格 鼎新热水器 留意了!不是水平疑问! 马桶产生了这5个现象 方便 极速 邢台空调移机电话上门服务 扬子空调缺点代码e4是什么疑问 宏基4736zG可以装置W11吗 奥克斯空调培修官方 为什么突然空调滴水很多 乐视s40air刷机包 未联络视的提高方向 官网培修 格力空调售后电话 皇明太阳能电话 看尚X55液晶电视进入工厂形式和软件更新方法 燃气热水器缺点代码

热门资讯

关注我们

微信公众号