const threshold = 50
|
|
export default {
|
|
props: {
|
|
//点击事件位置设置
|
|
clickOption: {
|
|
type: Object,
|
|
default () {
|
|
return {
|
|
width: uni.upx2px(200),
|
|
height: uni.upx2px(200),
|
|
left: 'auto',
|
|
top: 'auto'
|
|
}
|
|
}
|
|
}
|
|
},
|
|
computed: {
|
|
//点击区域左边位置
|
|
clickLeft () {
|
|
return typeof this.clickOption.left == 'number' ? this.clickOption.left : (this.windowWidth / 2) - (this.clickOption.width / 2)
|
|
},
|
|
//点击区域右边位置
|
|
clickRight () {
|
|
return this.clickLeft + this.clickOption.width
|
|
},
|
|
//点击区域顶部位置
|
|
clickTop () {
|
|
return typeof this.clickOption.top == 'number' ? this.clickOption.top : (this.windowHeight / 2) - (this.clickOption.height / 2)
|
|
},
|
|
//点击区域底部位置
|
|
clickBottom () {
|
|
return this.clickTop + this.clickOption.height
|
|
}
|
|
},
|
|
data () {
|
|
return {
|
|
autoplaySync: false,
|
|
windowHeight: 0,//组件高度
|
|
windowWidth: 0,//组件宽度
|
|
clickTime: 0,//点击次数
|
|
touchstartX: 0,//触摸开始x轴位置
|
|
touchstartY: 0,//触摸开始y轴位置
|
|
touchmoveX: 0,//触摸滑动x轴距离
|
|
touchmoveY: 0,//触摸滑动y轴距离
|
|
touchTime: 0//触摸时间
|
|
}
|
|
},
|
|
methods: {
|
|
touchstart (e) {
|
|
if ( this.pageType != 'scroll' ) this.autoplaySync = false//如果是翻页阅读关闭自动播放
|
|
if ( this.touchTimer ) {//清楚定时任务
|
|
clearTimeout(this.touchTimer)
|
|
this.touchTimer = null
|
|
}
|
|
if ( this.longTimer ) {//清楚定时任务
|
|
clearTimeout(this.longTimer)
|
|
this.longTimer = null
|
|
}
|
|
const touch = e.touches[0]
|
|
this.touchstartX = touch.pageX
|
|
this.touchstartY = touch.pageY
|
|
//点击在规定区域中
|
|
if ( this.touchstartX >= this.clickLeft && this.touchstartX <= this.clickRight && this.touchstartY >= this.clickTop && this.touchstartY <= this.clickBottom) {
|
|
this.clickTime++
|
|
if ( this.clickTime == 1 ) {//第一次点击
|
|
this.touchTimer = setTimeout(() => {
|
|
this.touchTime = 300
|
|
}, 300)
|
|
this.longTimer = setTimeout(() => {
|
|
this.touchTime = 500
|
|
if ( this.touchmoveX <= threshold && this.touchmoveY <= threshold ) this.$emit('long-click')//抛出长按事件
|
|
this.resetTouch()
|
|
}, 500)
|
|
}
|
|
} else {//没有点击在规定区域中直接重置触摸事件
|
|
this.resetTouch()
|
|
}
|
|
},
|
|
touchmove (e) {
|
|
if ( this.clickTime > 0 ) {
|
|
const touch = e.touches[0]
|
|
this.touchmoveX = Math.abs(touch.pageX - this.touchstartX)
|
|
this.touchmoveY = Math.abs(touch.pageY - this.touchstartY)
|
|
}
|
|
},
|
|
touchend (e) {
|
|
if ( this.pageType != 'scroll' ) this.autoplaySync = this.autoplay//如果是横向翻页开启自动播放
|
|
if ( this.touchTimer ) {//清楚按下定时任务
|
|
clearTimeout(this.touchTimer);
|
|
this.touchTimer = null
|
|
}
|
|
if ( this.longTimer ) {//清楚长按定时任务
|
|
clearTimeout(this.longTimer)
|
|
this.longTimer = null
|
|
}
|
|
//点击次数为零或者触摸时间超过300,或者滑动距离超过阙值
|
|
if ( this.clickTime == 0 || this.touchTime > 300 || this.touchmoveX > threshold || this.touchmoveY > threshold ) {
|
|
this.resetTouch()
|
|
return
|
|
}
|
|
if ( this.clickTime == 1 ) {//第一次点击
|
|
this.touchTimer = setTimeout(() => {
|
|
this.$emit('single-click')//抛出单击事件
|
|
this.resetTouch()
|
|
}, 300)
|
|
}
|
|
if ( this.clickTime == 2 ) {//第二次点击
|
|
this.$emit('double-click')//抛出双击事件
|
|
this.resetTouch()
|
|
}
|
|
},
|
|
resetTouch () {
|
|
this.touchstartX = 0
|
|
this.touchstartY = 0
|
|
this.touchmoveX = 0
|
|
this.touchmoveY = 0
|
|
this.touchTime = 0
|
|
this.clickTime = 0
|
|
}
|
|
}
|
|
}
|