当前位置: 首页 > 科技观察

如何使用JS开发带有自定义播放栏的视频播放器

时间:2023-03-15 19:59:38 科技观察

更多内容请访问:https://harmonyos.51cto.com,与华为官方效果图共建的鸿蒙技术社区原控效果图:修改效果图:看到demo效果后,我们来说明一下如何开发。在开发开发部分之前,我们需要先阅读文档,了解系统提供的能力。从属性、事件、方法中我们可以看出,有了现在提供的能力,视频的控制栏完全可以改写。接下来就是界面的构思和布局:界面布局1.整体布局整体界面分为视频播放、视频列表、评论区三个部分。所以我们先在代码中构建三个div。2.视频区域布局把控制栏覆盖在视频上,我们需要用到stack组件,如下图:视频控制栏分为上下两部分,所以我们需要建两个div来包裹里面的控件,如下图所示:下面是控件条上细节上的控件,包括文字、按钮、滑块等,这里不再赘述。3.视频列表区和评论区视频列表区和评论区的排版比较简单。标题栏划分显示区域,列表列表显示内容。在评论区,多了一个评论功能栏,其结构布局如图所示:整个布局结构大致介绍一下,下面是html页面的全部代码,供参考:0}}"@touchend="toolsTouched"@touchmove="videoTouchMoved">{{playedVideo.name}}

{{isPlayed?"‖":"?"}}{{thisTimeStr}}{{totalTimeStr}}
{{speedStr}}
2.0X1.5X1.0X0.5X
{{isAllScreen?"╬":"?"}}视频列表:{{$item.name}}评论区:{{$item.内容}}发布当然只有hml还不够,还需要style的配合,style相关文档参考gitee:https://gitee.com/panda-coder/harmonyos-apps/tree/master/Playerlogiccontrol-jslogiccontrol过程比较复杂,每个人都有不同的实现方法,不可能详细讲解,所以我就挑一部分来讲解。1.实现控制条的功能实现控制条的基本功能,比如play/暂停、滑条、全屏等,需要依赖视频控制方法,只需要执行相应的函数即可。this.$element(controlid).method(parameter)2.computedcomputed是一个非常有用的属性方法。computed中的函数可以直接在html中使用,只要computed函数的data数据发生变化就会触发重新计算。例如:computed:{playedVideo(){//当前正在播放的视频returnthis.videoSource[this.playIndex]},}获取当前正在播放的视频的数据,在上面的方法中,修改this.videoSource或者this的任意值。playIndex,会触发playedVideo函数重新计算。这样,处理一些实时变化的数据就很方便了。计算代码中totalTimeStr、thisTimeStr、speedStr的值,返回一个格式化的文本内容。3.$watch在视频中有一个功能,就是点击屏幕后显示控制条。5秒无操作控制条会自动消失,非控制条部分会直接消失,点击控制条部分刷新间隔为5秒。大家可以先想想这部分逻辑控制怎么设计,以及需要的功能逻辑操作等等,再往下看。我使用$watch部分来监视showToolsTime参数。$watch是当监听值发生变化时执行回调函数,返回上次监听值变化后的值。在onInit函数中监听showToolsTime。onInit(){this.$watch("showToolsTime",'watchShowToolsTimeEvent')this.videoSource=data.videoSourcethis.commentsSource=data.commentsthis.playIndex=0;this.showToolsTime=5;},/监听控制条显示时间watchShowToolsTimeEvent(newV,oldV){if(newV>0){clearTimeout(this.watchTimer)this.watchTimer=setTimeout(()=>{if(newV>oldV)this.showToolsTime=newV--this.showToolsTime;},1000)}else{this.$element("speedPopup").hide()}},watchShowToolsTimeEvent中有两个关键点,一是clearTimeout,二是返回值不能和newV相同。js中的setTimeOut是异步执行的。如果定时器(setTimeOut)没有被清除并在外部赋值,会造成数据异步赋值的问题。如果返回值与newV一致,则$watch无效(除非外部触发),所以执行this.showToolsTime=newV后,还必须执行–this.showToolsTime。这样,无论在哪里修改this.showToolsTime的值,都会每秒减1(大于0时)。4.分布式能力分布式能力参考官方文档,没有特殊处理。文档:https://developer.harmonyos.com/cn/docs/documentation/doc-references/js-apis-distributed-migration-00000010500249655。左右滑动切换视频。首先通过touchmove事件收集手指滑动的坐标。然后在touchend事件中判断手指滑动方向。判断代码如下:getTouchMoveOrientation(source,num){letorientation=[]for(leti=1;iMath.abs(Y)&&X>0){orientation.push("left2right")}elseif(Math.abs(X)>Math.abs(Y)&&X<0){orientation.push("right2left")}elseif(Math.abs(X)0){orientation.push("top2bottom")}elseif(Math.abs(X){if(orientation.indexOf(item)==index){obj[item]=1}else{obj[item]+=1}})for(letiinobj){if(obj[i]>maxNum){maxNum=obj[i]}}if(maxNum