微信小程序实现自动播放视频模仿gif动图效果实例

需求背景:

在小程序页面插入gif动态图,但gif图一般体积比较大,转而用自动播放视频的模式来模拟gif图的效果,丰富页面展示。自动播放的视频,无控制条,无声音,自动循环播放。

技术难点:

因为微信小程序在同一个页面,存在多个视频时(建议不超过3个视频),会出现卡顿甚至闪退的情况。
developers.weixin.qq.com/community/d

方案:

参考小程序社区讨论方案,当视频未出现在屏幕可视区域时,用图片占位,出现在屏幕中,把图片替换成视频,并且自动播放。

代码注意点:

video标签用wx:if来控制,image标签用visibility样式来占位。

<view class="container" style="width: {{videoWidth}}rpx;height: {{videoHeight}}rpx">
  <image class="image" style="visibility: {{play ? 'hidden' : 'visible'}};" id="image_{{videoId}}" src="{{poster}}" />
  <video class="video" wx:if="{{play}}" id="video_{{videoId}}" controls="{{controls}}" object-fit='contain' show-center-play-btn="{{showCenterPlayBtn}}" enable-progress-gesture="{{enableProgressGesture}}" direction="{{direction}}" enable-play-gesture="{{enablePlayGesture}}" muted="{{muted}}" loop="{{loop}}" src="{{videoUrl}}" />
</view>
.container {
    position: relative;
    width: 100%;
    height: 100%;
}
.image {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 10;
    width: 100%;
    height: 100%;
}
.video {
    width: 100%;
    height: 100%;
}
Component({
    properties: {
        // 视频宽度
        videoWidth: {
            type: Number,
            value: 0,
        },
        // 视频高度
        videoHeight: {
            type: Number,
            value: 0,
        },
        // 视频海报/封面图
        poster: {
            type: String,
            value: '',
        },
        // 视频链接
        videoUrl: {
            type: String,
            value: '',
        },
        // 是否显示播放进度条
        controls: {
            type: Boolean,
            value: false,
        },
        // 是否显示中间播放按钮
        showCenterPlayBtn: {
            type: Boolean,
            value: false,
        },
        // 是否静音
        muted: {
            type: Boolean,
            value: true,
        },
        // 是否显示静音按钮
        showMuteBtn: {
            type: Boolean,
            value: true,
        },
        // 是否启用手势控制进度
        enableProgressGesture: {
            type: Boolean,
            value: false,
        },
        // 是否启用手势控制播放
        enablePlayGesture: {
            type: Boolean,
            value: false,
        },
        // 方向
        direction: {
            type: Number,
            value: 0,
        },
        // 指定开始播放时间,单位:秒
        showPlayTime: {
            type: Number,
            value: 0,
        },
        // 视频id(唯一标识)
        videoId: {
            type: String,
            value: '',
        },
        // 是否播放
        play: {
            type: Boolean,
            value: false,
        },
        // 是否循环播放
        loop: {
            type: Boolean,
            value: true,
        },
    },
    data: {
        paly: false, // 是否播放
        context: null, // 创建的视频实例对象
    },
    lifetimes: {
        attached() {
            this.videObserve();
        },
    },
    methods: {
        // 监听视频组件是否进入可视区域
        videObserve() {
            this._observer = this.createIntersectionObserver({
                observeAll: true,
            });

            this._observer.relativeToViewport().observe(`#image_${this.data.videoId}`, (res) => {
                // res.intersectionRatio === 0表示不相交
                if (res.intersectionRatio === 0) {
                    this.setData({
                        play: false,
                    });
                } else {
                    const ctx = this.data.context || wx.createVideoContext(`video_${this.data.videoId}`, this);
                    if (ctx) {
                        this.setData(
                            {
                                context: ctx,
                                play: true,
                            },
                            () => {
                                // 加延时是为了等wxml节点创建完,拿到节点再播放,否则可能会出现播放失败
                                setTimeout(() => {
                                    ctx.play();
                                }, 400);
                            }
                        );
                    }
                }
            });
        },
    },
});

效果图

视频进入可视区域,才加载视频开始播放。视频离开可视区域,play=false,清除video标签,即清除视频。

未来优化点

目前视频刚开始渲染时,会出现闪黑屏的效果。后续看看能否改成白色(白色比黑色好接受一些),也要看小程序视频支持情况。

目前未限制一屏不能超过3个视频同时播放。如果视频宽高比较小,可能会出现一屏有很多视频,从而卡顿或闪退。

总结

到此这篇关于微信小程序实现自动播放视频模仿gif动图效果的文章就介绍到这了,更多相关小程序自动播放视频模仿gif动图内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 小程序点击图片实现自动播放视频

    通过列表的点击事件自动播放列表对应的视频,同时停止上一个视频的播放. 源码: <view> <view class='vv' wx:for='{{vedio_data}}' wx:key=''> <view class='block' style='margin-left:20rpx;'> <image src='/img/1.png' class='img1' style='margin-left:20rpx'></image> <tex

  • 微信小程序实现自动播放视频模仿gif动图效果实例

    需求背景: 在小程序页面插入gif动态图,但gif图一般体积比较大,转而用自动播放视频的模式来模拟gif图的效果,丰富页面展示.自动播放的视频,无控制条,无声音,自动循环播放. 技术难点: 因为微信小程序在同一个页面,存在多个视频时(建议不超过3个视频),会出现卡顿甚至闪退的情况. developers.weixin.qq.com/community/d- 方案: 参考小程序社区讨论方案,当视频未出现在屏幕可视区域时,用图片占位,出现在屏幕中,把图片替换成视频,并且自动播放. 代码注意点: vi

  • 微信小程序实现下拉刷新和轮播图效果

    本文实例为大家分享了微信小程序实现下拉刷新和轮播图展示的具体代码,供大家参考,具体内容如下 先上图,再解释 wxml页面代码: <scroll-view scroll-y="true" bindscrolltolower="lower" style="height:{{screenH}}px" class="scroll"> <swiper autoplay="{{autoplay}}"

  • 微信小程序中的video视频实现 自定义播放按钮、封面图、视频封面上文案

    效果图展示: 实现方法: 在video中添加一个cover-view,在cover-view写两个cover-image,一个用来存储封面图.一个用来存放播放按钮,同级写一个cover-view用来完成封面上的文字,设置绝对定位,水平垂直居中,在播放按钮上添加点击事件,点击之后隐藏cover-view,最后在监听视频结束事件,重新填充封面跟播放按钮就可以了. 代码: <video id="myVideo" src="{{videoSrc}}" enable-d

  • 微信小程序中插入激励视频广告并获取收益(实例代码)

    最近微信小程序后台发送通知,小程序激励式视频广告组件日前已全量上线,也就是说大家可以在小程序中插入激励视频广告了,之前只允许小游戏可以使用 . 激励式视频广告 用户在小程序中主动触发激励式广告,并达成奖励下发标准(完整播放视频广告,并手动点击 "关闭广告" 按钮),将获得该小程序下发的奖励.广告触发场景与奖励内容均由流量主自定义. 新建广告位 首先进入小程序后台点击流量主,点击广告位管理,点击新建广告位,就可以新建所需要的广告了,目前有三种 banner,激励视频,插屏广告. 插入广告

  • 微信小程序 audio音频播放详解及实例

     微信小程序 audio音频播放 audio audio为音频组件,我们可以轻松的在小程序中播放音频. 属性名 类型 默认值 说明 id String   video 组件的唯一标识符, src String   要播放音频的资源地址 loop Boolean false 是否循环播放 controls Boolean true 是否显示默认控件 poster String   默认控件上的音频封面的图片资源地址,如果 controls 属性值为 false 则设置 poster 无效 name

  • 微信小程序录音与播放录音功能

    小程序中提供了两种录音的API 旧版录音功能 首先启动录音,然后停止录音即可拉到音频的临时地址 启动录音: var that = this; wx.startRecord({ success: function (res) { // 调用了停止录音接口就会触发这个函数,res.tempFilePath为录音文件临时路径 var tempFilePath = res.tempFilePath that.setData({ src: tempFilePath }) }, fail: function

  • 微信小程序 wxParse插件显示视频问题

    修改wxParse/html2json.js 文件 ,在 html2json(html, bindName) 方法里 var node = { node: 'element', tag: tag, }; 这里使用 node.tag 能够获取标签类型,比如: img.embed.video 这里我的系统后台编辑器使用的是ckeditor 上传视频.生成的便签是:embed 所以加上判断: if (node.tag =="embed"){ var embUrl = node.attr.sr

  • 微信小程序实现音乐播放器

    今天继续玩小程序的api,看着别人例子跟着做一个小程序,留下一个脚印吧.末尾附上github源码地址.实现以下微信小程序的音乐播放器,先看下效果图 界面做的确实挺丑的,先上wxss文件 //index.wxss .button-style{ background-color: #eee; border-radius: 8rpx; margin: 20rpx; } 只是顶一个简单的按钮的圆角和间距,颜色这个我还是用primary这个小绿色. 下面是index.wxml文件 //index.wxml

  • 微信小程序多音频播放进度条问题

    真的脑子疼,小程序的音频组件居然没有进度控制的功能,网上的方法又很少,逻辑通了就好写了. 1.所有音频播放.停止按钮使用状态切换控制 2.当点击某个音频播放时,首先将所有音频的状态置为停止状态,然后将当前音频置为播放状态 3.滚动条插件配合音频控件一起使用 4.播放状态时滚动条的长度随音频进度变化而变化,时间也要显示 5.拖动滚动条时,音频的当前时间随滚动条变化而变化 1.wxml <text class="left_text">{{item.currentProcess}

  • 微信小程序仿抖音视频之整屏上下切换功能的实现代码

    效果演示: WXML: <view class="video_box"> <view bindtouchend="touchEnd" id="myVideo{{index}}" animation="{{animation}}" bindtouchstart="touchStart" bindtouchmove="touchMove" class="video

随机推荐