const BindingX = uni.requireNativePlugin('bindingx');
|
|
const animation = uni.requireNativePlugin('animation');
|
|
export default {
|
|
mounted() {
|
|
this.container = this.getEl(this.$refs['container'])
|
|
},
|
|
methods: {
|
|
_notifyTouchChangeForItems(isTouchEnd) {
|
|
this.swiperViews && this.swiperViews.forEach(it => {
|
|
it.canClick = isTouchEnd
|
|
})
|
|
},
|
|
touchstart(e) {
|
|
if (this.isAnimated) return;
|
|
if (this.stop) return
|
|
this.isScrolling = true
|
|
this._notifyTouchChangeForItems(false)
|
|
this.stop = true
|
|
this.startTime = new Date().getTime()
|
|
const props = [{
|
|
element: this.container,
|
|
property: 'transform.translateX',
|
|
expression: uni.upx2px(this.left) + '+x'
|
|
}]
|
|
if (this.is3D) {
|
|
const deltaScale = `${this.scale}/${this.width}*x`
|
|
const currentScale = `${this.scale}-abs(x)/${this.width}*1`
|
|
const realScale = `min(${currentScale},${this.scale})`
|
|
const currentCardExp = `${realScale} < 1 ? 1 : ${realScale}`;
|
|
const leftCardExp = `${deltaScale} > 0 ? min(${this.scale},(1 + ${deltaScale})) : min(1,(1 + ${deltaScale}))`;
|
|
const rightCardExp = `${deltaScale} > 0 ? min(1,(1 - ${deltaScale})) : min(${this.scale},(1 - ${deltaScale}))`;
|
|
props.push({
|
|
element: this.getSwipteItemEl(this.position),
|
|
property: 'transform.scale',
|
|
expression: currentCardExp
|
|
})
|
|
if (this.position - 1 > -1) {
|
|
props.push({
|
|
element: this.getSwipteItemEl(this.position - 1),
|
|
property: 'transform.scale',
|
|
expression: leftCardExp
|
|
})
|
|
}
|
|
if (this.position + 1 > this._size) {
|
|
props.push({
|
|
element: this.getSwipteItemEl(this.position + 1),
|
|
property: 'transform.scale',
|
|
expression: rightCardExp
|
|
})
|
|
}
|
|
}
|
|
this.eventpan = BindingX.bind({
|
|
anchor: this.container,
|
|
eventType: 'pan',
|
|
props
|
|
}, (e) => {
|
|
if (e.state === 'end' ||
|
|
e.state === 'exit') {
|
|
setTimeout(() => {
|
|
this._notifyTouchChangeForItems(true)
|
|
}, 10)
|
|
const timing = new Date().getTime() - this.startTime
|
|
const velocity = Math.abs(e.deltaX / timing)
|
|
this.stop = false
|
|
this.isScrolling = false
|
|
if (this.eventpan && this.eventpan.token) {
|
|
BindingX.unbind({
|
|
token: this.eventpan.token,
|
|
eventType: 'pan'
|
|
})
|
|
}
|
|
this.moveEnd({
|
|
velocity,
|
|
deltaX: e.deltaX,
|
|
deltaY: e.deltaY
|
|
})
|
|
}
|
|
})
|
|
},
|
|
getSwipteItemEl(idx) {
|
|
return this.swiperViews[idx].$el.ref
|
|
},
|
|
/**
|
|
* 获取ref
|
|
* @param {Object} el
|
|
*/
|
|
getEl(el) {
|
|
return el.ref
|
|
}
|
|
}
|
|
}
|