var max = 200
|
|
var refreshHeight = 80
|
|
function touchstart(event, ins) {
|
|
console.log('touchstart');
|
|
var state = ins.getState()
|
|
if ( state.refresh ) return
|
|
var touch = event.touches[0] || event.changedTouches[0]
|
|
state.startX = touch.pageX
|
|
state.startY = touch.pageY
|
|
}
|
|
function touchmove(event, ins) {
|
|
console.log('touchmove');
|
|
var state = ins.getState()
|
|
if ( state.refresh ) return
|
|
if ( state.startY > 0) {
|
|
var touch = event.touches[0] || event.changedTouches[0]
|
|
if ((Math.abs(touch.pageY - state.startY) > Math.abs(touch.pageX - state.startX)) && Math.abs(touch.pageY - state.startY) > 20) {
|
|
var pageY = touch.pageY
|
|
var rate = max / (max + Math.abs(pageY - state.startY))
|
|
state.threshold = rate * (pageY - state.startY)
|
|
if ( state.threshold > 0 && !state.pulldownable ) return
|
|
if ( state.threshold < 0 && !state.pullupable ) return
|
|
if ( state.threshold > max ) {
|
|
state.threshold = max
|
|
}
|
|
if ( state.threshold < -max ) {
|
|
state.threshold = -max
|
|
}
|
|
ins.selectComponent('.yingbing-scroller-wrapper').setStyle({
|
|
transform: 'translateY(' + state.threshold + 'px)',
|
|
transition: ''
|
|
})
|
|
if ( state.threshold > 0 ) {
|
|
ins.callMethod('pullingdown', state.threshold)
|
|
} else {
|
|
ins.callMethod('pullingup', Math.abs(state.threshold))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function touchend(event, ins) {
|
|
touchaction(event, ins)
|
|
}
|
|
function touchcancel(event, ins) {
|
|
touchaction(event, ins)
|
|
}
|
|
function touchaction (event, ins) {
|
|
var state = ins.getState()
|
|
if ( state.refresh ) return
|
|
if ( state.threshold > 0 && state.pulldownable ) {//下拉
|
|
if ( state.threshold > refreshHeight ) {//满足下拉条件
|
|
ins.selectComponent('.yingbing-scroller-wrapper').setStyle({
|
|
transform: 'translateY(' + refreshHeight + 'px)',
|
|
transition: 'transform .1s'
|
|
})
|
|
ins.callMethod('pulldown')
|
|
state.refresh = true
|
|
} else {//不满足下拉条件恢复样式
|
|
stop(ins)
|
|
}
|
|
}
|
|
if ( state.threshold < 0 && state.pullupable ) {//上拉
|
|
if ( Math.abs(state.threshold) > refreshHeight ) {//满足上拉条件
|
|
ins.selectComponent('.yingbing-scroller-wrapper').setStyle({
|
|
transform: 'translateY(-' + refreshHeight + 'px)',
|
|
transition: 'transform .1s'
|
|
})
|
|
ins.callMethod('pullup')
|
|
state.refresh = true
|
|
} else {//不满足上拉条件恢复样式
|
|
stop(ins)
|
|
}
|
|
}
|
|
}
|
|
function stop (ins) {
|
|
var state = ins.getState()
|
|
ins.selectComponent('.yingbing-scroller-wrapper').setStyle({
|
|
transform: 'translateY(0)',
|
|
transition: 'transform .1s'
|
|
})
|
|
state.threshold = 0
|
|
state.startY = 0
|
|
state.refresh = false
|
|
}
|
|
function refreshStateWatcher (newVal, oldVal, ins) {
|
|
if ( newVal == 'pulldown' ) {
|
|
var state = ins.getState()
|
|
state.threshold = refreshHeight + 1
|
|
state.refresh = false
|
|
touchaction(null, ins)
|
|
}
|
|
if ( newVal == 'pullup' ) {
|
|
var state = ins.getState()
|
|
state.threshold = -(refreshHeight + 1)
|
|
state.refresh = false
|
|
touchaction(null, ins)
|
|
}
|
|
if ( newVal == 'stop' ) stop(ins)
|
|
}
|
|
function pulldownableWatcher (newVal, oldVal, ins) {
|
|
var state = ins.getState()
|
|
if ( state ) state.pulldownable = newVal
|
|
}
|
|
function pullupableWatcher (newVal, oldVal, ins) {
|
|
var state = ins.getState()
|
|
if ( state ) state.pullupable = newVal
|
|
}
|
|
module.exports = {
|
|
refreshStateWatcher: refreshStateWatcher,
|
|
pulldownableWatcher: pulldownableWatcher,
|
|
pullupableWatcher: pullupableWatcher,
|
|
touchstart: touchstart,
|
|
touchmove: touchmove,
|
|
touchend: touchend,
|
|
touchcancel: touchcancel
|
|
}
|