当前OpenHarmony提供的热区设置属性(responseRegion)只能在不同的触摸热区中触发相同的事件,那么如何实现不同热区不同事件呢,本例即以上述视频播放场景为例进行说明。
效果呈现
效果说明:开始时视频以正常速度播放,播放到5秒时,长按播放器右侧触发快进播放,播放到14秒时长按播放器左侧触发快退播放。
环境要求
本例基于以下环境开发,开发者也可以基于其他适配的版本进行开发:
实现思路
本例即采用上述思路为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://www.jmbhsh.com/toutiao/36134.html