| 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 | |
| } |