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