var MIN_DISTANCE = 10; function changeData(newValue, oldValue, ownerInstance, instance) { var state = instance.getState(); if (newValue.left != undefined) { state.left = newValue.left } if (newValue.bounce != undefined) { state.bounce = newValue.bounce } // console.log('changeData', JSON.stringify(newValue)) } /** * 开始触摸操作 * @param {Object} e * @param {Object} ins */ function touchstart(e, ins) { var instance = e.instance; // 计算滑动开始位置 stopTouchStart(e, ins) } /** * 开始滑动操作 * @param {Object} e * @param {Object} ownerInstance */ function touchmove(e, ownerInstance) { var instance = e.instance; // 是否可以滑动页面 stopTouchMove(e); if (e.preventDefault) { // 阻止页面滚动 e.preventDefault() } // var state = instance.getState(); // && state.bounce move(instance, ownerInstance) return false } /** * 结束触摸操作 * @param {Object} e * @param {Object} ownerInstance */ function touchend(e, ownerInstance) { var instance = e.instance; var state = instance.getState() ownerInstance.callMethod('moveEnd', { velocity: Math.abs(state.deltaX / state.timing), direction: state.direction, deltaX: state.deltaX, deltaY: state.deltaY }) } /** * 设置移动距离 * @param {Object} instance * @param {Object} ownerInstance */ function move(instance, ownerInstance) { var state = instance.getState() var value = state.deltaX || 0 var state = instance.getState() if (state.direction == 'horizontal') { // instance.requestAnimationFrame(function() { // instance.setStyle({ // transform: 'translateX(' + value + 'px)', // '-webkit-transform': 'translateX(' + value + 'px)' // }) // }) ownerInstance.callMethod('moveTo', { deltaX: value, deltaY: state.deltaY || 0, left: state.left + value }) } } /** * 滑动中,是否禁止打开 * @param {Object} event */ function stopTouchMove(event) { var instance = event.instance; var state = instance.getState(); var touch = event.touches[0]; state.timing = getDate().getTime() - state.startTime; state.deltaX = touch.clientX - state.startX; state.deltaY = touch.clientY - state.startY; state.offsetX = Math.abs(state.deltaX); state.offsetY = Math.abs(state.deltaY); state.direction = state.direction || getDirection(state.offsetX, state.offsetY); } /** * 设置滑动开始位置 * @param {Object} event */ function stopTouchStart(event) { var instance = event.instance; var state = instance.getState(); resetTouchStatus(instance); var touch = event.touches[0]; state.startTime = getDate().getTime(); state.startX = touch.clientX; state.startY = touch.clientY; } function getDirection(x, y) { if (x > y && x > MIN_DISTANCE) { return 'horizontal'; } if (y > x && y > MIN_DISTANCE) { return 'vertical'; } return ''; } /** * 重置滑动状态 * @param {Object} event */ function resetTouchStatus(instance) { var state = instance.getState(); state.direction = ''; state.deltaX = 0; state.deltaY = 0; state.offsetX = 0; state.offsetY = 0; } module.exports = { changeData: changeData, touchstart: touchstart, touchmove: touchmove, touchend: touchend }