2013-08-01 2 views
1

Я работаю в 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 создает впечатление, что во время моей попытки отслеживания пальцев теряется вертикальное перетаскивание.

Может ли кто-нибудь прямо в проблеме? Что вызывает такое поведение? Спасибо за любую помощь заранее.

ответ

1

сделал таргетинг на любой вид с горизонтальным прокруткой?

У меня была такая же проблема раньше, моя есть потому, что у меня есть scrollview, вложенный внутри прокручиваемого изображения. я решаю его, переключая scrollingEnabled, чтобы быть истинным один раз за раз, а другой - false.

, так что я могу предположить, это могло бы быть связано с тем, что один из видов в стеке, включенных внутри окна, имеет горизонтальную прокрутку, и вызывает, когда u прокручивается по горизонтали, указатель не знает, к какому событию должен идти. проверьте из окна в targetView.

только предположение, надеюсь, что это поможет!

+0

Хороший ответ, я использовал аналогичный подход, установив свойство canCancelEvents в false, если обнаружено движение перетаскивания. В случае, если горизонтальное перетаскивание не обнаружено (то есть нет дельта X больше или меньше нуля), свойство canCancelEvents сохраняется в true. –