Я работаю в Titanium SDK 3.1.1 и развертываю на устройстве Android 4.0. Я пытаюсь перетащить вид в в любом направлении, но пока событие touchmove уволено, что-то пошло не так, и событие прерывается. Событие touchmove работает , пока я пытаюсь горизонтально перетащить, если попытаться перетащить вид в ось y, событие прервано. Приложение не разбивается, и событие touchhend не запускается. Хотя, глядя на LogCat я получаю следующее:Не удается вертикально перетащить вид в Android
D/InputEventConsistencyVerifier(11897): TouchEvent: ACTION_MOVE contained 1 pointers but there are currently 0 pointers down.
D/InputEventConsistencyVerifier(11897): in [email protected]
D/InputEventConsistencyVerifier(11897): 0: sent at 199051208557000, MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=214.55301, y[0]=163.79526, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=1, eventTime=199051208, downTime=199051042, deviceId=2, source=0x1002 }
D/InputEventConsistencyVerifier(11897): -- recent events --
D/InputEventConsistencyVerifier(11897): 1: sent at 199050732492000, MotionEvent { action=ACTION_UP, id[0]=0, x[0]=186.61124, y[0]=73.907616, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x80000000, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=199050732, downTime=199049818, deviceId=2, source=0x1002 }
D/InputEventConsistencyVerifier(11897): 2: sent at 199050713565000, MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=186.61124, y[0]=73.907616, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x80000000, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=199050713, downTime=199049818, deviceId=2, source=0x1002 }
D/InputEventConsistencyVerifier(11897): 3: sent at 199050693173000, MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=205.57172, y[0]=81.89763, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x80000000, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=199050693, downTime=199049818, deviceId=2, source=0x1002 }
D/InputEventConsistencyVerifier(11897): 4: sent at 199050683204000, MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=233.51352, y[0]=96.87891, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x80000000, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=199050683, downTime=199049818, deviceId=2, source=0x1002 }
D/InputEventConsistencyVerifier(11897): 5: sent at 199050669151000, MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=264.44907, y[0]=115.85519, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x80000000, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=199050669, downTime=199049818, deviceId=2, source=0x1002 }
Я не понимаю, почему это происходит, я сделал перетащить & капли поведения, прежде чем в Android с помощью Titanium и не сталкивались с этой проблемой. Это код для touchstart, TouchMove и touchend событий:
var draggedView = Titanium.UI.createView({
backgroundColor : 'transparent',
width : circleWidth + 'dp',
widthNumber : circleWidth,
height : circleWidth + 'dp',
heightNumber : circleWidth,
left : '10dp',
top : '10dp',
leftNumber : 10,
topNumber : 10,
zIndex : 4,
});
var dragView = Titanium.UI.createView({
backgroundColor : 'transparent',
opacity : 1,
width : circleWidth + 'dp',
height : circleWidth + 'dp',
widthNumber : circleWidth,
heightNumber : circleWidth,
left : '10dp',
top : '20dp',
leftNumber : 10,
topNumber : 20,
zIndex : 4
});
var targetView = Ti.UI.createImageView({
image : imagesPath + "KineduPaperPlane.png",
width : '100dp',
widthNumber : 100,
height : '100dp',
heightNumber : 100,
bottom : '-120dp',
bottomNumber : -120
});
dragView.addEventListener('touchstart', function(e) {
if (dragEnabled == true) {
curX = e.x;
curY = e.y;
}
});
dragView.addEventListener('touchmove', function(e) {
if (dragEnabled == true) {
if (targetViewDisplayed == false) {
targetView.animate({
bottom : '20dp',
duration : 200
});
targetView.bottomNumber = 20;
targetViewDisplayed = true;
}
deltaX = e.x - curX;
deltaY = e.y - curY;
currentPositionX = initialViewX + deltaX;
currentPositionY = initialViewY + deltaY;
draggedView.setLeft(currentPositionX + 'dp');
draggedView.leftNumber = currentPositionX;
draggedView.setTop(currentPositionY + 'dp');
draggedView.topNumber = currentPositionY;
}
});
function recallControl() {
var animateControlToOrigin = Ti.UI.createAnimation({
left : initialViewX,
top : initialViewY,
duration : 300,
});
animateControlToOrigin.addEventListener("complete", function(e) {
draggedView.setLeft(initialViewX + 'dp');
draggedView.leftNumber = initialViewX;
draggedView.setTop(initialViewY + 'dp');
draggedView.topNumber = initialViewY;
dragView.setLeft(initialViewX + 'dp');
dragView.leftNumber = initialViewX;
dragView.setTop(initialViewY + 'dp');
dragView.topNumber = initialViewY;
});
draggedView.animate(animateControlToOrigin);
}
dragView.addEventListener("touchend", function(e) {
if (dragEnabled == true) {
if (targetViewDisplayed == true) {
var leftLimit = true;
var rightLimit = true;
var topLimit = false;
var lowerLimit = false;
if (currentPositionY > (Ti.Platform.displayCaps.platformHeight - circleWidth - 100)) {
topLimit = true;
}
if (currentPositionY < Ti.Platform.displayCaps.platformHeight) {
lowerLimit = true;
}
if (leftLimit && rightLimit && topLimit && lowerLimit) {
var circleWidthAnimated = 20;
var animationLeft = (Ti.Platform.displayCaps.platformWidth/2) - (circleWidth/2);
var draggedViewAwayAnimation = Ti.UI.createAnimation({
left : animationLeft + 'dp',
height : circleWidthAnimated + 'dp',
width : circleWidthAnimated + 'dp',
borderRadius : circleWidthAnimated/2,
opacity : 0,
duration : 400
})
draggedView.animate(draggedViewAwayAnimation);
var targetViewAwayAnimationPart2 = Ti.UI.createAnimation({
top : '10dp',
left : '-150dp',
duration : 1200,
opacity : 0,
});
draggedViewAwayAnimation.addEventListener("complete", function(e) {
targetView.animate(targetViewAwayAnimationPart1);
targetView.leftNumber = animationLeft;
targetView.heightNumber = circleWidthAnimated;
targetView.widthNumber = circleWidthAnimated;
});
var animationLeftPart1 = (Ti.Platform.displayCaps.platformWidth/2) - circleWidthAnimated - (2) + 30;
var targetViewAwayAnimationPart1 = Ti.UI.createAnimation({
bottom : 0,
left : animationLeftPart1 + 'dp',
duration : 600,
});
targetViewAwayAnimationPart1.addEventListener("complete", function(e) {
targetView.animate(targetViewAwayAnimationPart2);
targetView.bottomNumber = 0;
targetView.leftNumber = animationLeftPart1;
});
targetViewAwayAnimationPart2.addEventListener("complete", function(e) {
dragEnabled = false;
targetView.leftNumber = -150;
targetView.top = 10;
});
} else {
targetView.animate({
bottom : '-20dp',
duration : 200
});
targetView.bottomNumber = -20;
targetViewDisplayed = false;
recallControl();
}
}
}
});
dragView представляет собой прозрачный вид я использую для обнаружения события прикосновения и draggedView это один движимые изменениями, обнаруженных на этих событиях. TargetView является конечным пунктом назначения для draggedView.
Поскольку я отображаю представления с использованием точек на дюйм, я добавил некоторые свойства, которые содержат числовые значения для таких свойств, как верхний, левый, ширина и т. Д. Если есть способ работать с dpi и арифметическими операциями, я был бы рад, если вам скажут как это сделать.
Возвращаясь к моей проблеме, я не понимаю причину остановки события touchmove. Сообщение ACTION_MOVE contained 1 pointers but there are currently 0 pointers down
создает впечатление, что во время моей попытки отслеживания пальцев теряется вертикальное перетаскивание.
Может ли кто-нибудь прямо в проблеме? Что вызывает такое поведение? Спасибо за любую помощь заранее.
Хороший ответ, я использовал аналогичный подход, установив свойство canCancelEvents в false, если обнаружено движение перетаскивания. В случае, если горизонтальное перетаскивание не обнаружено (то есть нет дельта X больше или меньше нуля), свойство canCancelEvents сохраняется в true. –