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