微信小程序video控件的使用

微信小程序video控件的使用

一、简介

video控件是微信小程序提供的系统组件之一,用于实现播放视频的功能。

二、属性

| 属性名 | 类型 | 默认值 | 说明 | 最低版本 |

|——–|——–|——–|——–|——–|

| src | String| | 要播放视频的资源地址 | |

| initial-time| String | | 指定视频初始播放位置| 1.6.0 |

| duration |Number|| 指定视频时长 | 1.1.0 |

| controls |Boolean |true| 是否显示默认播放控件(播放/暂停按钮、播放进度、时间)| |

| danmu-list |Object Array||弹幕列表 | |

| danmu-btn |Boolean|false | 是否显示弹幕按钮,只在初始化时有效,不能动态变更| |

| enable-danmu |Boolean|false| 是否展示弹幕,只在初始化时有效,不能动态变更 | |

|autoplay|Boolean|false|是否自动播放| |

|loop|Boolean|false|是否循环播放| 1.4.0 |

|muted|Boolean|false|是否静音播放| 1.4.0 |

|page-gesture|Boolean|false|在非全屏模式下,是否开启亮度与音量调节手势|1.6.0 |

|direction|Number||设置全屏时视频的方向,不指定则根据宽高比自动判断。有效值为 0(正常竖向), 90(屏幕逆时针90度), -90(屏幕顺时针90度)|1.7.0|

|bindplay|EventHandle||当开始/继续播放时触发play事件| |

|bindpause|EventHandle||当暂停播放时触发 pause 事件| |

|bindended|EventHandle||当播放到末尾时触发 ended 事件| |

|bindtimeupdate|EventHandle||播放进度变化时触发,event.detail = {currentTime, duration} 。触发频率 250ms 一次| |

|bindfullscreenchange|EventHandle||当视频进入和退出全屏是触发,event.detail = {fullScreen, direction},direction取为 vertical 或 horizontal| |

|objectFit|String|contain|当视频大小与 video 容器大小不一致时,视频的表现形式。contain:包含,fill:填充,cover:覆盖| 1.4.0|

|poster|String||视频封面的图片网络资源地址,如果 controls 属性值为 false 则设置 poster 无效| |

||||||

video 组件 默认宽度300px、高度225px,可通过wxss设置宽高。

三、相关实现api

1、wx.createVideoContext

创建并返回 video 上下文 videoContext 对象。在自定义组件下,第二个参数传入组件实例this,以操作组件内 video 组件

2、videoContext对象

videoContext 通过 videoId 跟一个 video 组件绑定,通过它可以操作一个 video 组件。

videoContext 对象的方法列表:

| 方法 | 参数 | 说明 | 最低版本 |

|——–|——–|——–|——–|

|play | 无| 播放 | |

|pause| 无| 暂停 | |

|seek | position| 跳转到指定位置,单位 s| |

|sendDanmu|danmu|发送弹幕,danmu 包含两个属性 text, color。||

|sendDanmu|danmu|发送弹幕,danmu 包含两个属性 text, color。||

|sendDanmu|danmu|发送弹幕,danmu 包含两个属性 text, color。||

|playbackRate|rate|设置倍速播放,支持的倍率有 0.5/0.8/1.0/1.25/1.5|1.4.0|

|requestFullScreen|无|进入全屏,可传入{direction}参数(1.7.0起支持),详见video组件文档|1.4.0|

|exitFullScreen|无|退出全屏|1.4.0|

四、代码实现

在四川建设厅的代码实现中,我们未涉及弹幕功能的相关使用,所以以下代码不涉及弹幕的代码,如果想自己尝试使用,可以在官网查看其相关代码

实现效果,如下图

小程序视频播放UI效果图

实现原理:

在四川建设厅中,我们将视频播放控件进行了组件化的封装,将其放入一个名为courseVideoPlayer的组件中,组件的相关知识,可以查看佳斌写的自定义组件的实现,加以学习。

核心代码:

courseVideoPlayer.wxml


<view>

  <!--poster="{{coverImageUrl}}" -->

  <video id="myVideo" class="myVideo" src="{{playUrl}}" autoplay='false'  controls='true' bindtimeupdate='timeUpdate' bindended='endAction'>

    <!-- <cover-view bindtap='startFirstPlayAction' class='cover-view' wx:if="{{isShowCoverView}}"></cover-view>  -->

    <cover-view bindtap='_startFirstPlayAction' class='cover-view' wx:if="{{isShowCoverView}}">

      <cover-image class='cover-view' src="{{coverImageUrl}}" mode="aspectFill"/>

      <cover-image style='position:absolute; top:50%; left:50%; width:132rpx; height:132rpx; margin:-66rpx 0 0 -66rpx; z-index:10000' src="/image/video-play.png"/>

    </cover-view>

  </video>

</view>


这部分代码主要是视频界面部分,除了使用到video控件之外,我们还用到了cover-view以及cover-image组件,这两个组件的使用,在此,我做一下简单的介绍:

(1)cover-view:覆盖在原生组件之上的文本视图,可覆盖的原生组件包括map、video、canvas、camera,只支持嵌套cover-view、cover-image。

(2)cover-image:覆盖在原生组件之上的图片视图,可覆盖的原生组件同cover-view,支持嵌套在cover-view里。

属性:src String 图标路径,支持临时路径、网络地址(1.6.0起支持)。暂不支持base64格式。

按照功能来说,cover-view和cover-image实质上与普通的基础控件view与image无异,只是这两个控件特殊在,他可以覆盖在map、video、canvas、camera控件中,也正是因为这个特殊性,导致了他们在试用时也存在这一些差异,试用这两个控件的过程中,我们需要考虑以下几个注意点:

* Bug & Tips *

tip: 基础库 1.6.0 起支持css transition动画,transition-property只支持transform (translateX, translateY)与opacity。

tip: 基础库 1.6.0 起支持css opacity。

tip: 只可嵌套在原生组件map、video、canvas、camera内,避免嵌套在其他组件内。

tip: 事件模型遵循冒泡模型,但不会冒泡到原生组件。

tip: 文本建议都套上cover-view标签,避免排版错误。

tip: 只支持基本的定位、布局、文本样式。不支持设置单边的border、background-image、shadow、overflow等。

tip: 建议子节点不要溢出父节点

courseVideoPlayer.js


let studyPlayerManager = require('../../../../utils/studyManager/studyPlayerManager.js')

let currentTime = 0

let videoCtx = null

let app = getApp()

Component({

  /**

   * 组件的属性列表

   */

  properties: {

    playUrl:{

      type:String,

      value:'',

      observer: function (newVal, oldVal) {

        if (newVal.length){

          videoCtx.play()

        }

      }

    },

    totalSecondsTime:{

      type:Number,

      value:10

    },

    playInfo:{

      type: Object,

      value: {},

      observer: function (newVal, oldVal) {

      }

    },

    coverImageUrl:{

      type: String,

      value: '../../../image/course-img.jpg',

      observer: function (newVal, oldVal) {

      }

    },

    isShowCoverView:{

      type:Boolean,

      value:true,

      observer: function (newVal, oldVal) {

      }

    },

    // 初始播放时间

    initialTime : {

      type:Number,

      value:0

    }

  },



  /**

   * 组件的初始数据

   */

  data: {

    lastTime: 0,

    zindex: Math.max,

    currentTime: 0,

    isTest:false

  },

  attached: function () {

    wx.setStorageSync('lastTime', '0');

    wx.setStorageSync('maxTime', '0');

    videoCtx = wx.createVideoContext('myVideo', this)

    // 初始化toast

    new app.WeToast(this)

    studyPlayerManager.initStudyPlayerManager(this)

  },

  moved: function () {

  },

  detached: function () {

    this.studyPlayerManager.deallocStudyPlayerManager()

  },

  /**

   * 组件的方法列表

   */

  methods: {

    play() {

      videoCtx.play()

    },

    pause() {

      videoCtx.pause()

    },

    timeUpdate(e) {

      this.triggerEvent("videoTimeUpdate", e.detail.currentTime)

      var maxTime = parseInt(wx.getStorageSync('maxTime'));

      console.log('maxTime:' + maxTime);

      var lastTime = parseInt(wx.getStorageSync('lastTime'));

      console.log('lastTime:' + lastTime);

      currentTime = e.detail.currentTime;

      console.log('currentTime:' + currentTime)

      if (currentTime != 0 && ((currentTime - lastTime) < 3)) {

        wx.setStorageSync('lastTime', currentTime);

      }

      if (currentTime != 0 && currentTime > maxTime && (((currentTime - lastTime) > 0) && ((currentTime - lastTime) < 3))) {

        wx.setStorageSync('maxTime', currentTime);

        console.log('设置最大时间!')

      }

      if (!this.data.isTest && currentTime > maxTime) {

        if ((currentTime - lastTime) > 3) {

          //跳转到上次的进度

          videoCtx.seek(maxTime);

          wx.setStorageSync('lastTime', maxTime);

          this.wetoast.toast({

            title: '不能进行跳转!请认真学习'

          })

        }

      }

    },

    endAction(e) {

      let maxTime = parseInt(wx.getStorageSync('maxTime'));



      if (!this.data.isTest && ((this.properties.totalSecondsTime - maxTime) > 3)) {

        this.wetoast.toast({

          title: '不能进行跳转!请认真学习'

        })

        videoCtx.seek(maxTime)

        videoCtx.play()

      }else{

        this.triggerEvent("videoPlayEndEvent")

        this._playEndAction()

      }

    },

    fullScreenChangeAction(e) {

      console.log(e)

    },

    changeScreenTap() {

      this.videoCtx.requestFullScreen({ direction: 90 })

    },

    // 跳转到某个点

    seekToPoint(time){

      console.log('跳转到时间:'+time)

      videoCtx.seek(time)

    }

  }

})

代码中,主要实现了对video控件的进度条的拖拽进行了控制,如果在用户将进度条拖拽到还未观看过的视频位置,那么视频将会跳回到用户观看过的最大位置,并提示用户不能进装操作。

由于系统未提供video进度条拖拽的事件监听接口,我们只能“绕个弯”实现该功能。

实现的原理就是通过监听video控件开放的bindtimeupdate播放过程中的进度监听事件,我们通过监听进度条当前的进度与上一次回调的进度进行比较,如果两者之差大于3,便视为用户进行了拖拽操作,具体的代码,查看上述的timeUpdate(e)与endAction(e)事件中的相关代码。

起初,原本想自定义控制器来实现监听视频进度条拖拽的相关功能,但通过实践,我们发现,在video上的cover-view中无法嵌套系统提供的slider组件,同时在video控件上,无法进行自定义拖拽事件的监听(开发工具上可以监听,真机上无法进行监听,具体的原因还需考察),所以目前只能通过该方法实现控制拖拽进度条的操作。

  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: Editor微信小程序编辑控件是一种用于实现富文本编辑的工具。它提供了一系列的编辑功能,包括字体样式设置、字号设置、加粗、斜体、下划线、对齐方式、插入图片和链接等。开发者可以通过调用Editor组件,将其集成到自己的小程序页面中。 使用Editor控件时,开发者可以灵活地控制编辑区域的样式和功能。通过设置合适的 CSS 样式,可以使编辑区域适应不同设备的屏幕大小。此外,通过配置不同的toolbar选项,开发者可以自定义编辑工具栏的按钮和功能,满足不同的编辑需求。 Editor控件还提供了一些丰富的API接口,方便开发者对编辑内容进行控制和操作。开发者可以通过API获取编辑器的内容,进行特定格式的导出和保存。同时,也可以实现一些自定义的操作,比如将编辑内容转化为HTML格式、设置光标位置等。 总之,Editor微信小程序编辑控件是一种功能强大的工具,可以帮助开发者实现富文本编辑功能。通过简单的集成和配置,开发者可以轻松创建一个交互友好的编辑界面,提升用户体验。无论是创建一个文本编辑器、留言板、富文本展示页面,还是其他需要富文本编辑的场景,Editor控件都能够满足需求,使小程序更加丰富多样。 ### 回答2: Editor是微信小程序提供的一个编辑器控件,可以用于编辑富文本内容。它可以在小程序内部被使用,允许用户进行文字、图片、表情等多种类型的编辑操作。 Editor具有以下一些特点和功能: 1. 富文本编辑:用户可以在Editor中输入和编辑富文本内容,包括文字、图片、表情等。可以通过编辑器的工具栏来设置字体样式、大小、颜色等,使得编辑过程更加灵活方便。 2. 图片和表情插入:用户可以在编辑器中插入图片和表情,可以通过上传图片文件或者选择从相册中选取图片,进而将其插入到编辑器中,方便用户对内容进行丰富的表达。 3. 撤销和重做:用户操作时,可以通过撤销和重做功能来进行操作的撤销和再次执行。这个功能可以有效地帮助用户在编辑错误时及时纠正,提高用户的编辑体验。 4. 全局替换:用户可以在编辑器中进行全局替换操作,方便用户对文本内容进行批量修改。 5. 内容限制和过滤:可以对编辑器中的内容进行限制和过滤,如限制输入长度、限制输入格式,或者过滤敏感词等。 6. 数据获取和保存:用户编辑完成后,可以通过Editor提供的API获取编辑器中的内容。用户可以将内容保存在本地或者上传到服务器进行保存和分享。 总之,Editor是一个功能强大的微信小程序编辑控件,可以为小程序带来丰富的编辑和内容创作功能,提升用户的编辑体验。同时,开发者还可以根据项目需求进行二次开发,加入更多个性化的功能和效果,以满足不同用户的需求。 ### 回答3: Editor微信小程序编辑控件是一种用于在小程序中创建和编辑富文本内容的组件。它能够提供给用户一个类似于富文本编辑器的界面,方便用户对文本样式、排版、图片等进行编辑和修改。 通过Editor编辑控件,用户可以直观地设置文字的字体、颜色、大小、加粗、斜体等样式,还可以插入链接、表格、图片和视频等多媒体内容。同时,用户还可以对文本的对齐方式、首行缩进、段落间距等进行调整,以实现更好的视觉效果。 对于开发者而言,Editor微信小程序编辑控件的接入和使用也是相对简便的。只需要在小程序的相关页面中引入Editor组件,并通过设置相应的属性,即可实现所需的编辑功能。开发者还可以监听编辑器的各种事件,如用户输入、插入图片等,并根据需要进行相应的处理。 使用Editor编辑控件可以为小程序增加更具交互性和丰富性的功能,使得用户可以更方便地编辑和发布富文本内容。无论是进行文章编辑、动态发布,还是进行社交互动,Editor都能提供良好的用户体验,并帮助用户实现更多样化的内容表达需求。 总而言之,Editor微信小程序编辑控件是一种功能强大、易用性高的富文本编辑组件,它为用户和开发者提供了灵活的编辑功能,使得小程序中的文本编辑和内容创作更加便捷和多样化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值