123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- Component({
- behaviors: [],
- options: {
- addGlobalClass: true,
- pureDataPattern: /^_/
- },
- properties: {
- duration: {
- type: Number,
- value: 500
- },
- easingFunction: {
- type: String,
- value: 'default'
- },
- loop: {
- type: Boolean,
- value: false,
- },
- videoList: {
- type: Array,
- value: [],
- observer: function observer(...args) {
- const newVal = args.length > 0 && args[0] !== undefined ? args[0] : []
- console.log(newVal)
- this._videoListChanged(newVal)
- }
- }
- },
- data: {
- nextQueue: [],
- prevQueue: [],
- curQueue: [],
- circular: false,
- _last: 1,
- _change: -1,
- _invalidUp: 0,
- _invalidDown: 0,
- _videoContexts: []
- },
- lifetimes: {
- attached() {
- this.data._videoContexts = [
- wx.createVideoContext('video_0', this), wx.createVideoContext('video_1', this), wx.createVideoContext('video_2', this)]
- },
- },
- methods: {
- _videoListChanged(newVal) {
- const _this = this
- const data = this.data
- newVal.forEach(function (item) {
- data.nextQueue.push(item)
- })
- if (data.curQueue.length === 0) {
- this.setData({
- curQueue: data.nextQueue.splice(0, 3)
- }, function () {
- _this.playCurrent(0)
- })
- }
- },
- animationfinish(e) {
- const _data = this.data
- const _last = _data._last
- const _change = _data._change
- const curQueue = _data.curQueue
- const prevQueue = _data.prevQueue
- const nextQueue = _data.nextQueue
- const current = e.detail.current
- const diff = current - _last
- if (diff === 0) return
- this.data._last = current
- this.playCurrent(current)
- this.triggerEvent('change', {activeId: curQueue[current].id})
- const direction = diff === 1 || diff === -2 ? 'up' : 'down'
- if (direction === 'up') {
- console.log(this.data)
- if (this.data._invalidDown === 0) {
- const change = (_change + 1) % 3
- const add = nextQueue.shift()
- const remove = curQueue[change]
- if (add) {
- prevQueue.push(remove)
- curQueue[change] = add
- this.data._change = change
- } else {
- this.data._invalidUp += 1
- }
- } else {
- this.data._invalidDown -= 1
- }
- }
- if (direction === 'down') {
- if (this.data._invalidUp === 0) {
- const _change2 = _change
- const _remove = curQueue[_change2]
- const _add = prevQueue.pop()
- if (_add) {
- curQueue[_change2] = _add
- nextQueue.unshift(_remove)
- this.data._change = (_change2 - 1 + 3) % 3
- } else {
- this.data._invalidDown += 1
- }
- } else {
- this.data._invalidUp -= 1
- }
- }
- let circular = true
- if (nextQueue.length === 0 && current !== 0) {
- circular = false
- }
- if (prevQueue.length === 0 && current !== 2) {
- circular = false
- }
- this.setData({
- curQueue,
- circular
- })
- },
- playCurrent(current) {
- this.data._videoContexts.forEach(function (ctx, index) {
- if (index !== current) {
- ctx.pause()
- } else {
- ctx.play()
- }
- })
- },
- onPlay: function onPlay(e) {
- this.trigger(e, 'play')
- },
- onPause: function onPause(e) {
- this.trigger(e, 'pause')
- },
- onEnded: function onEnded(e) {
- this.trigger(e, 'ended')
- },
- onError: function onError(e) {
- this.trigger(e, 'error')
- },
- onTimeUpdate: function onTimeUpdate(e) {
- this.trigger(e, 'timeupdate')
- },
- onWaiting: function onWaiting(e) {
- this.trigger(e, 'wait')
- },
- onProgress: function onProgress(e) {
- this.trigger(e, 'progress')
- },
- onLoadedMetaData: function onLoadedMetaData(e) {
- this.trigger(e, 'loadedmetadata')
- },
- trigger: function trigger(e, type, ...args) {
- const ext = args.length > 2 && args[2] !== undefined ? args[2] : {}
- const detail = e.detail
- const activeId = e.target.dataset.id
- this.triggerEvent(
- type, Object.assign(Object.assign(Object.assign({}, detail), {activeId}), ext)
- )
- }
- },
- })
|