18年9月4日更新
看到很多小伙伴说代码有问题运行不了,其实当时贴的只是项目的部分代码,直接运行肯定是不行的,所以现在把这个功能抽离出来,放到了github,希望大家可以提出宝贵意见。
和以前代码有出入的地方是没有引入别的类,然后图片路径发生了改变,MP4和MP3文件和图片是网上找的,不一定啥时候就不能用了,自行更改就好。
GitHub地址: https://github.com/fengkang92/miniprogress-videoList
===========================================================
效果类似一条视频的小程序,就是视频列表,然后每个视频上覆盖一张视频的封面图,点击封面图的播放按钮视频播放,点击别的视频的时候,停止播放当前视频,播放点击的视频。差不多是这样:
首先上代码:
wxml
<block wx:for="{{videoList}}">
<view class='video-item'>
<view class='wrapper'>
<video class='video-video' wx:if='{{index==videoIndex}}' id='video{{index}}' autoplay='{{true}}' show-center-play-btn="{{false}}" src='{{item.resource_add}}'></video>
<image class='video-video2' wx:if='{{index!=videoIndex}}' mode='aspectFill' src='{{item.coverimg}}'></image>
<image class='videoPlay' wx:if='{{index!=videoIndex}}' data-index='{{index}}' bindtap='videoPlay' src='/images/icon/play.png'></image>
</view>
<view class='video-name'>{{item.title}}</view>
<view class='video-desc' style="{{item.upStatus?'':'display:-webkit-box'}}">{{item.description}}</view>
<view class='video-bottom'>
<view class='video-btn' data-index="{{index}}" bindtap='upDown'>
<image hidden='{{item.upStatus}}' src='/images/icon/slide.png'></image>
<image hidden='{{!item.upStatus}}' src='/images/icon/up.png'></image>
<text>{{!item.upStatus?'展开':'收起'}}</text>
</view>
</view>
</view>
</block>
js
videoPlay(event){
var index = video.getDataSet(event, 'index');
if (!this.data.videoIndex) { // 没有播放时播放视频
this.setData({
videoIndex: index
})
var videoContext = wx.createVideoContext('video' + index)
videoContext.play()
} else {
var videoContextPrev = wx.createVideoContext('video' + this.data.videoIndex)
videoContextPrev.stop()
this.setData({
videoIndex: index
})
var videoContextCurrent = wx.createVideoContext('video' + index)
videoContextCurrent.play()
}
},
在页面布局上,我们让视频的封面图定位在视频的容器中,将播放按钮定位到视频容器中,且层级最高。因为需求是点击封面图上的播放按钮视频开始播放,所以将show-center-play-btn
设置为flase
。在循环绑定数据时,将循环的index
拼成视频的ID,将循环的index作为属性绑定到播放按钮。
在JS中,首先我们设置videoIndex
来表示当前播放的视频在列表中的位置,它的初始值为null
。
视频的播放与暂停
当点击事件发生时,首先获取点击的index,然后判断videoIndex
的值:
- 如果
videoIndex
值为null
,则表示这是第一次点击,将index
绑定到videoIndex
上,然后通过var videoContext = wx.createVideoContext('video' + index)
来获取当前点击的视频,并使用videoContext.play()
将视频进行播放。 - 如果
videoIndex
的值不为null,则表示这不是第一次点击,我们首先应该将正在播放的视频停止,然后在播放点击的视频。此时,videoIndex的值表示正在播放的视频在列表中的位置,我们通过var videoContextPrev = wx.createVideoContext('video' + this.data.videoIndex)
来获取正在播放的视频上下文,然后通过videoContextPrev.stop()
把它停止。最后我们将获取到的index值重新绑定到videoIndex上表示点击视频的序号,然后重复步骤一。
封面图处理
我们已经给封面图和封面图上的播放按钮进行处理了,用微信的wx:if
或者hidden
就可以了,当videoIndex
等于index
的时候,表示要播放这个视频,将视频显示并播放,封面图和播放按钮隐藏就可以了。
一点小坑
一开始考虑到性能,由于wx:if
在页面加载的时候并不渲染数据,频繁点击的话频繁渲染数据,有点影响性能,就采用了hidden
方法,使用hidden
方法处理封面图和播放按钮一点问题也没有,处理视频的话有时候会出现视频不播放,并且显示中间播放按钮的情况,所以采用了wx:if
,这样页面开始渲染的时候不渲染视频,点击之后渲染视频,并且设置视频自动播放,就可以啦~~~