6161#pragma mark -
6262#pragma mark Helper classes
6363
64-
6564#if __CC_PLATFORM_IOS
6665@interface CCTapDownGestureRecognizer : UIGestureRecognizer
6766@end
@@ -172,6 +171,7 @@ @implementation CCScrollView {
172171#elif __CC_PLATFORM_ANDROID
173172 CCGestureListener *_listener;
174173 AndroidGestureDetector *_detector;
174+ CGPoint _rawScrollTranslation;
175175#endif
176176}
177177
@@ -214,7 +214,6 @@ - (id) initWithContentNode:(CCNode*)contentNode
214214 _listener = [[CCGestureListener alloc ] init ];
215215 _listener.delegate = (id <CCGestureListenerDelegate>)self;
216216 _detector = [[AndroidGestureDetector alloc ] initWithContext: [CCActivity currentActivity ] listener: _listener];
217- [[[CCDirector sharedDirector ] view ] addGestureDetector: _detector];
218217 });
219218#elif __CC_PLATFORM_MAC
220219
@@ -355,6 +354,8 @@ - (void) setScrollPosition:(CGPoint)newPos animated:(BOOL)animated
355354 newPos.x = MAX (MIN (newPos.x , self.maxScrollX ), self.minScrollX );
356355 newPos.y = MAX (MIN (newPos.y , self.maxScrollY ), self.minScrollY );
357356
357+ [self updateAndroidScrollTranslation: newPos];
358+
358359 BOOL xMoved = (newPos.x != self.scrollPosition .x );
359360 BOOL yMoved = (newPos.y != self.scrollPosition .y );
360361
@@ -409,6 +410,14 @@ - (void) setScrollPosition:(CGPoint)newPos animated:(BOOL)animated
409410 }
410411}
411412
413+ - (void )updateAndroidScrollTranslation : (CGPoint)worldPosition
414+ {
415+ #if __CC_PLATFORM_ANDROID
416+ _rawScrollTranslation = [self convertToWindowSpace: worldPosition];
417+ #endif
418+ }
419+
420+
412421- (void ) xAnimationDone
413422{
414423 _animatingX = NO ;
@@ -492,6 +501,8 @@ - (void) update:(CCTime)df
492501
493502 _contentNode.position = ccpAdd (_contentNode.position , delta);
494503
504+ [self updateAndroidScrollTranslation: CGPointMake (_contentNode.position.x, _contentNode.position.y * -1 )];
505+
495506 // Deaccelerate layer
496507 float deaccelerationX = kCCScrollViewDeacceleration ;
497508 float deaccelerationY = kCCScrollViewDeacceleration ;
@@ -740,8 +751,11 @@ - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecogni
740751 return (otherGestureRecognizer == _panRecognizer || otherGestureRecognizer == _tapRecognizer);
741752}
742753
754+ #elif __CC_PLATFORM_ANDROID
755+
743756- (void ) onEnterTransitionDidFinish
744757{
758+ #if __CC_PLATFORM_IOS
745759 // Add recognizers to view
746760 UIView* view = [CCDirector sharedDirector ].view ;
747761
@@ -751,12 +765,22 @@ - (void) onEnterTransitionDidFinish
751765 [recognizers insertObject: _tapRecognizer atIndex: 0 ];
752766
753767 view.gestureRecognizers = recognizers;
754-
768+ #elif __CC_PLATFORM_ANDROID
769+ dispatch_async (dispatch_get_main_queue (), ^{
770+ if (_detector)
771+ {
772+ [[[CCDirector sharedDirector ] view ] addGestureDetector: _detector];
773+ }
774+ });
775+ #endif
755776 [super onEnterTransitionDidFinish ];
756777}
757778
779+
780+
758781- (void ) onExitTransitionDidStart
759782{
783+ #if __CC_PLATFORM_IOS
760784 // Remove recognizers from view
761785 UIView* view = [CCDirector sharedDirector ].view ;
762786
@@ -765,11 +789,19 @@ - (void) onExitTransitionDidStart
765789 [recognizers removeObject: _tapRecognizer];
766790
767791 view.gestureRecognizers = recognizers;
792+ #elif __CC_PLATFORM_ANDROID
793+ dispatch_async (dispatch_get_main_queue (), ^{
794+ if (_detector)
795+ {
796+ [[[CCDirector sharedDirector ] view ] removeGestureDetector: _detector];
797+ }
798+ });
799+ #endif
768800
769801 [super onExitTransitionDidStart ];
770802}
771803
772- # elif __CC_PLATFORM_ANDROID
804+
773805
774806- (CCTouchPhase)handleGestureEvent : (AndroidMotionEvent *)start end : (AndroidMotionEvent *)end
775807{
@@ -820,24 +852,23 @@ - (BOOL)onScroll:(AndroidMotionEvent *)start end:(AndroidMotionEvent *)end dista
820852 _velocity = CGPointZero;
821853
822854 // Note about start and end events: We will get a CCTouchPhaseBegan for the start event, followed by CCTouchPhaseMoved in the end event
823- static CGPoint rawTranslation;
824855 CCTouchPhase phase = [self handleGestureEvent: start end: end];
825856
826857 if (phase == CCTouchPhaseCancelled || phase == CCTouchPhaseEnded)
827- rawTranslation = CGPointMake (0 .0f , 0 .0f );
858+ _rawScrollTranslation = CGPointMake (0 .0f , 0 .0f );
828859
829860 float scaleFactor = [[CCDirector sharedDirector ] view ].contentScaleFactor ;
830861
831862 dx /= scaleFactor;
832863 dy /= scaleFactor;
833864
834- rawTranslation .x += dx;
835- rawTranslation .y -= dy;
865+ _rawScrollTranslation .x += dx;
866+ _rawScrollTranslation .y -= dy;
836867
837868 CCDirector* dir = [CCDirector sharedDirector ];
838869 [[CCActivity currentActivity ] runOnGameThread: ^{
839870
840- CGPoint translation = [dir convertToGL: rawTranslation ];
871+ CGPoint translation = [dir convertToGL: _rawScrollTranslation ];
841872 translation = [self convertToNodeSpace: translation];
842873
843874 if (phase == CCTouchPhaseBegan)
@@ -868,6 +899,7 @@ - (BOOL)onScroll:(AndroidMotionEvent *)start end:(AndroidMotionEvent *)end dista
868899
869900 // Update position
870901 [self panLayerToTarget: newPos];
902+
871903 }
872904 else if (phase == CCTouchPhaseEnded)
873905 {
@@ -891,7 +923,7 @@ - (BOOL)onFling:(AndroidMotionEvent *)start end:(AndroidMotionEvent *)end veloci
891923 static CGPoint rawTranslationFling;
892924
893925 CCTouchPhase phase = [self handleGestureEvent: start end: end];
894-
926+
895927 if (phase == CCTouchPhaseCancelled || phase == CCTouchPhaseEnded)
896928 rawTranslationFling = CGPointMake (0 .0f , 0 .0f );
897929
@@ -918,9 +950,6 @@ - (BOOL)onFling:(AndroidMotionEvent *)start end:(AndroidMotionEvent *)end veloci
918950 CCDirector* dir = [CCDirector sharedDirector ];
919951 [[CCActivity currentActivity ] runOnGameThread: ^{
920952
921- CCResponderManager *mgr = [[CCDirector sharedDirector ] responderManager ];
922- [mgr removeAllResponders ];
923-
924953 CGPoint translation = [dir convertToGL: rawTranslationFling];
925954 translation = [self convertToNodeSpace: translation];
926955
0 commit comments