当前位置 : 主页 > 手机教程 > 手机资讯 >

微信小程序中视频的显示与隐藏功能

来源:互联网 收集:自由互联 发布时间:2023-01-20
目录 在微信小程序中实现视频的播放与暂停 需求: 思路: 代码实现: 总结: 在微信小程序中实现视频的播放与暂停 需求: 视频列表中只能有一个视频在播放 点击视频实现播放与暂
目录
  • 在微信小程序中实现视频的播放与暂停
    • 需求:
    • 思路:
    • 代码实现:
  • 总结:

    在微信小程序中实现视频的播放与暂停

    需求:

    • 视频列表中只能有一个视频在播放
    • 点击视频实现播放与暂停功能
    • 加载完成显示图片,点击后变为视频播放
    • 从上次播放的位置进行播放

    思路:

    • 定义一个标记变量,控制视频的播放与暂停
    • true => 本次问播放
    • false => 本次为暂停
    • 每次点击后,更新data中视频的id值
    • 声明一个数组,用于存放播放视频的id和播放时间
     {
          vid:xxx,
          currentTime:xxx  
      }

    事件的流程图

    代码实现:

    静态

    <!-- 使用scroll-view组件 -->  
    <scroll-view class="scroll_video" enable-flex scroll-y>
        <view class="scroll_videoList_item" wx:for="{{videoList}}" wx:key="index">
          <!-- 注意这个id是标签属性,
            点击视频标签,事件的回调 event属性会获取到这个id值
            item.data.vid == vid => 点击获取到id
    		bindtimeupdate:视频的进度条发生变化时触发
    			通过event.detail.currentTime获取播放的时间(详见官网)
           -->
          <video 
            src="{{item.data.urlInfo.url}}" 
            id="{{item.data.vid}}" 
            class="scroll_video_item" 
            wx:if="{{vid == item.data.vid ? isPlay? true : false :false}}"
            bindtap="clickVideo"
            poster="{{item.data.coverUrl}}"
            bindtimeupdate="handlerUpdate"
          ></video>
          <!-- 视频加载的时候使用图片代替,点击时切换为视频 -->
          <image 
            id="{{item.data.vid}}" 
            class="scroll_img_item" 
            src="{{item.data.coverUrl}}" 
            bindtap="clickVideo"
            wx:else
          ></image>
        </view>
      </scroll-view>

    逻辑:

     //页面中使用到的数据
    data: {
        // 保存点击的nav id
        clickId: '',
        // 保存视频的数据
        videoList: [],
        // 保存点击的视频的id
        vid: '',
        // 控制视频是否播放
        isPlay: true,   //为true =>这一次为播放,为false => 这一次为暂停
      },
          
      //视频的播放与暂停
     clickVideo(event) {
        // 获取用户点击视频的id
        // console.log(event.currentTarget.id);
        let vid = event.currentTarget.id
        // 创建视频的上下文与video组件进行一一关联
        if (!this.player) {
          // 没有视频的上下文,创建一个
          this.player = wx.createVideoContext(vid)
          // 播放视频
          this.player.play()
          // 存储这次点击的视频的id
          this.setData({
            vid
          })
        } else {
          // 有视频上下文了
          if (vid != this.data.vid) {
            // 说明再次点击的是其他的视频
            // 暂停上一个视频 -> 创建一个新的视频上下文 -> 播放这个视频
            this.player.pause()
            this.player = wx.createVideoContext(vid)
            this.player.play()
            this.setData({
              isPlay: true,//只要id不同,都是暂停上一次,播放这一次!!!
              vid
            })
          } else {
            // 说明第二次点击的是正在播放的视频
            if(this.data.isPlay){
              // 上一次的为播放,这一次需要暂停
              this.player.pause()
              // 修改状态
              this.setData({
                isPlay:false,
              })
            }else {
              // 上一次为暂停,这一次需要播放
              this.player.play()
              this.setData({
                isPlay:true,
              })
            }
          }
        }
      },
          
      // 视频播放的时间
      handlerUpdate(event) {
        const { videoUpdataTime } = this.data
        // 定义一个存储视频id和时间的对象
        const updateTime = {
          vid: event.currentTarget.id,
          currentTime: event.detail.currentTime,
        }
        // 如果数组里有时间,则更新时间,如果没有事件,则添加这个对象
        let updateItem = videoUpdataTime.find(item => item.vid == updateTime.vid)
        if (updateItem) {
          // 有,更新时间
          updateItem.currentTime = event.detail.currentTime
        } else {
          // 没有,添加整个对象
          videoUpdataTime.push(updateTime)
        }
        // 更新数据
        this.setData({
          videoUpdataTime,
        })
      },

    总结:

    • 没有思路的时候,可以画一个流程图,不要空想
    网友评论