From cab81af61827efa2fe3df6d1ffa75c5edfc984ff Mon Sep 17 00:00:00 2001 From: puckey Date: Sat, 21 Apr 2018 14:53:02 +0200 Subject: [PATCH 1/4] Avoid transitioning from pinch until all fingers have been released. --- Source/Core/ScreenSpaceEventHandler.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Core/ScreenSpaceEventHandler.js b/Source/Core/ScreenSpaceEventHandler.js index 8b6be308ad7c..e8d11b9aa64c 100644 --- a/Source/Core/ScreenSpaceEventHandler.js +++ b/Source/Core/ScreenSpaceEventHandler.js @@ -435,7 +435,7 @@ define([ // Otherwise don't trigger CLICK, because we are adding more touches. } - if (numberOfTouches !== 2 && screenSpaceEventHandler._isPinching) { + if (numberOfTouches === 0 && screenSpaceEventHandler._isPinching) { // transitioning from pinch, trigger PINCH_END screenSpaceEventHandler._isPinching = false; @@ -446,7 +446,7 @@ define([ } } - if (numberOfTouches === 1) { + if (numberOfTouches === 1 && !screenSpaceEventHandler._isPinching) { // transitioning to single touch, trigger DOWN var position = positions.values[0]; Cartesian2.clone(position, screenSpaceEventHandler._primaryPosition); From 293aeeb38bc9a8325e71a7cb0df5592b08291a30 Mon Sep 17 00:00:00 2001 From: puckey Date: Mon, 23 Apr 2018 17:13:40 +0200 Subject: [PATCH 2/4] Add touch pinch release tests --- Specs/Core/ScreenSpaceEventHandlerSpec.js | 84 +++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/Specs/Core/ScreenSpaceEventHandlerSpec.js b/Specs/Core/ScreenSpaceEventHandlerSpec.js index 70014aec08a8..5f5cd8ece572 100644 --- a/Specs/Core/ScreenSpaceEventHandlerSpec.js +++ b/Specs/Core/ScreenSpaceEventHandlerSpec.js @@ -1037,6 +1037,90 @@ defineSuite([ expect(action).not.toHaveBeenCalled(); }); + it('handles touch pinch release', function() { + var leftDownEventType = ScreenSpaceEventType.LEFT_DOWN; + var leftDownAction = createCloningSpy('LEFT_DOWN'); + handler.setInputAction(leftDownAction, leftDownEventType); + + var pinchEndEventType = ScreenSpaceEventType.PINCH_END; + var pinchEndAction = createCloningSpy('PINCH_END'); + handler.setInputAction(pinchEndAction, pinchEndEventType); + + var touch1Position = { + clientX : 1, + clientY : 2 + }; + var touch2Position = { + clientX : 4, + clientY : 3 + }; + if (usePointerEvents) { + DomEventSimulator.firePointerDown(element, combine( + { + pointerType : 'touch', + pointerId : 1 + }, + touch1Position + )); + DomEventSimulator.firePointerDown(element, combine( + { + pointerType : 'touch', + pointerId : 2 + }, + touch2Position + )); + + // Releasing one of two fingers should not trigger + // PINCH_END or LEFT_DOWN: + leftDownAction.calls.reset(); + DomEventSimulator.firePointerUp(element, combine( + { + pointerType : 'touch', + pointerId : 1 + }, + touch1Position + )); + expect(pinchEndAction).not.toHaveBeenCalled(); + expect(leftDownAction).not.toHaveBeenCalled(); + pinchEndAction.calls.reset(); + + // Releasing both fingers should trigger PINCH_END: + DomEventSimulator.firePointerUp(element, combine({ + pointerType : 'touch', + pointerId : 2 + }, touch2Position)); + expect(pinchEndAction).toHaveBeenCalled(); + } else { + DomEventSimulator.fireTouchStart(element, { + changedTouches : [ + combine({ identifier : 0 }, touch1Position), + combine({ identifier : 1 }, touch2Position) + ] + }); + leftDownAction.calls.reset(); + + // Releasing one of two fingers should not trigger + // PINCH_END or LEFT_DOWN: + DomEventSimulator.fireTouchEnd(element, { + changedTouches : [ + combine({ identifier : 0 }, touch1Position) + ] + }); + + expect(pinchEndAction).not.toHaveBeenCalled(); + expect(leftDownAction).not.toHaveBeenCalled(); + + // Releasing both fingers should trigger PINCH_END: + pinchEndAction.calls.reset(); + DomEventSimulator.fireTouchEnd(element, { + changedTouches : [ + combine({ identifier : 1 }, touch2Position) + ] + }); + expect(pinchEndAction).toHaveBeenCalled(); + } + }); + it('handles touch click', function() { var eventType = ScreenSpaceEventType.LEFT_CLICK; From edc82940b6215d13fe27a2dc906094d88f9afe6f Mon Sep 17 00:00:00 2001 From: puckey Date: Mon, 23 Apr 2018 18:26:37 +0200 Subject: [PATCH 3/4] Avoid triggering PINCH_START more than once --- Source/Core/ScreenSpaceEventHandler.js | 5 +++-- Specs/Core/ScreenSpaceEventHandlerSpec.js | 23 +++++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/Source/Core/ScreenSpaceEventHandler.js b/Source/Core/ScreenSpaceEventHandler.js index e8d11b9aa64c..f50f206af001 100644 --- a/Source/Core/ScreenSpaceEventHandler.js +++ b/Source/Core/ScreenSpaceEventHandler.js @@ -401,6 +401,7 @@ define([ var numberOfTouches = positions.length; var action; var clickAction; + var pinching = screenSpaceEventHandler._isPinching; if (numberOfTouches !== 1 && screenSpaceEventHandler._buttonDown === MouseButton.LEFT) { // transitioning from single touch, trigger UP and might trigger CLICK @@ -435,7 +436,7 @@ define([ // Otherwise don't trigger CLICK, because we are adding more touches. } - if (numberOfTouches === 0 && screenSpaceEventHandler._isPinching) { + if (numberOfTouches === 0 && pinching) { // transitioning from pinch, trigger PINCH_END screenSpaceEventHandler._isPinching = false; @@ -446,7 +447,7 @@ define([ } } - if (numberOfTouches === 1 && !screenSpaceEventHandler._isPinching) { + if (numberOfTouches === 1 && !pinching) { // transitioning to single touch, trigger DOWN var position = positions.values[0]; Cartesian2.clone(position, screenSpaceEventHandler._primaryPosition); diff --git a/Specs/Core/ScreenSpaceEventHandlerSpec.js b/Specs/Core/ScreenSpaceEventHandlerSpec.js index 5f5cd8ece572..8566563bce92 100644 --- a/Specs/Core/ScreenSpaceEventHandlerSpec.js +++ b/Specs/Core/ScreenSpaceEventHandlerSpec.js @@ -1042,6 +1042,10 @@ defineSuite([ var leftDownAction = createCloningSpy('LEFT_DOWN'); handler.setInputAction(leftDownAction, leftDownEventType); + var pinchStartEventType = ScreenSpaceEventType.PINCH_START; + var pinchStartAction = createCloningSpy('PINCH_START'); + handler.setInputAction(pinchStartAction, pinchStartEventType); + var pinchEndEventType = ScreenSpaceEventType.PINCH_END; var pinchEndAction = createCloningSpy('PINCH_END'); handler.setInputAction(pinchEndAction, pinchEndEventType); @@ -1084,7 +1088,26 @@ defineSuite([ expect(leftDownAction).not.toHaveBeenCalled(); pinchEndAction.calls.reset(); + // Putting another finger down should not trigger + // PINCH_START: + pinchStartAction.calls.reset(); + DomEventSimulator.firePointerDown(element, combine( + { + pointerType : 'touch', + pointerId : 1 + }, + touch2Position + )); + expect(pinchStartAction).not.toHaveBeenCalled(); + // Releasing both fingers should trigger PINCH_END: + DomEventSimulator.firePointerUp(element, combine( + { + pointerType : 'touch', + pointerId : 1 + }, + touch2Position + )); DomEventSimulator.firePointerUp(element, combine({ pointerType : 'touch', pointerId : 2 From 78309c1aa0f66baca861e4156e7bbed454e3b81b Mon Sep 17 00:00:00 2001 From: puckey Date: Tue, 22 May 2018 17:16:36 +0200 Subject: [PATCH 4/4] avoid transitioning to pinch during pinch --- Source/Core/ScreenSpaceEventHandler.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Core/ScreenSpaceEventHandler.js b/Source/Core/ScreenSpaceEventHandler.js index f50f206af001..5e92cf1bc3b9 100644 --- a/Source/Core/ScreenSpaceEventHandler.js +++ b/Source/Core/ScreenSpaceEventHandler.js @@ -467,7 +467,7 @@ define([ event.preventDefault(); } - if (numberOfTouches === 2) { + if (numberOfTouches === 2 && !pinching) { // transitioning to pinch, trigger PINCH_START screenSpaceEventHandler._isPinching = true;