@@ -196,6 +196,7 @@ public void onAnimationEnd(Animator animator) {
196196 private Tweener mBackgroundAnimator ;
197197 private PointCloud mPointCloud ;
198198 private float mInnerRadius ;
199+ private int mPointerId ;
199200
200201 public GlowPadView (Context context ) {
201202 this (context , null );
@@ -736,9 +737,10 @@ private void startBackgroundAnimation(int duration, float alpha) {
736737
737738 @ Override
738739 public boolean onTouchEvent (MotionEvent event ) {
739- final int action = event .getAction ();
740+ final int action = event .getActionMasked ();
740741 boolean handled = false ;
741742 switch (action ) {
743+ case MotionEvent .ACTION_POINTER_DOWN :
742744 case MotionEvent .ACTION_DOWN :
743745 if (DEBUG ) Log .v (TAG , "*** DOWN ***" );
744746 handleDown (event );
@@ -752,6 +754,7 @@ public boolean onTouchEvent(MotionEvent event) {
752754 handled = true ;
753755 break ;
754756
757+ case MotionEvent .ACTION_POINTER_UP :
755758 case MotionEvent .ACTION_UP :
756759 if (DEBUG ) Log .v (TAG , "*** UP ***" );
757760 handleMove (event );
@@ -765,6 +768,7 @@ public boolean onTouchEvent(MotionEvent event) {
765768 handleCancel (event );
766769 handled = true ;
767770 break ;
771+
768772 }
769773 invalidate ();
770774 return handled ? true : super .onTouchEvent (event );
@@ -776,19 +780,24 @@ private void updateGlowPosition(float x, float y) {
776780 }
777781
778782 private void handleDown (MotionEvent event ) {
779- float eventX = event .getX ();
780- float eventY = event .getY ();
783+ int actionIndex = event .getActionIndex ();
784+ float eventX = event .getX (actionIndex );
785+ float eventY = event .getY (actionIndex );
781786 switchToState (STATE_START , eventX , eventY );
782787 if (!trySwitchToFirstTouchState (eventX , eventY )) {
783788 mDragging = false ;
784789 } else {
790+ mPointerId = event .getPointerId (actionIndex );
785791 updateGlowPosition (eventX , eventY );
786792 }
787793 }
788794
789795 private void handleUp (MotionEvent event ) {
790796 if (DEBUG && mDragging ) Log .v (TAG , "** Handle RELEASE" );
791- switchToState (STATE_FINISH , event .getX (), event .getY ());
797+ int actionIndex = event .getActionIndex ();
798+ if (event .getPointerId (actionIndex ) == mPointerId ) {
799+ switchToState (STATE_FINISH , event .getX (actionIndex ), event .getY (actionIndex ));
800+ }
792801 }
793802
794803 private void handleCancel (MotionEvent event ) {
@@ -801,7 +810,9 @@ private void handleCancel(MotionEvent event) {
801810
802811 // mActiveTarget = -1; // Drop the active target if canceled.
803812
804- switchToState (STATE_FINISH , event .getX (), event .getY ());
813+ int actionIndex = event .findPointerIndex (mPointerId );
814+ actionIndex = actionIndex == -1 ? 0 : actionIndex ;
815+ switchToState (STATE_FINISH , event .getX (actionIndex ), event .getY (actionIndex ));
805816 }
806817
807818 private void handleMove (MotionEvent event ) {
@@ -811,9 +822,17 @@ private void handleMove(MotionEvent event) {
811822 int ntargets = targets .size ();
812823 float x = 0.0f ;
813824 float y = 0.0f ;
825+ int actionIndex = event .findPointerIndex (mPointerId );
826+
827+ if (actionIndex == -1 ) {
828+ return ; // no data for this pointer
829+ }
830+
814831 for (int k = 0 ; k < historySize + 1 ; k ++) {
815- float eventX = k < historySize ? event .getHistoricalX (k ) : event .getX ();
816- float eventY = k < historySize ? event .getHistoricalY (k ) : event .getY ();
832+ float eventX = k < historySize ? event .getHistoricalX (actionIndex , k )
833+ : event .getX (actionIndex );
834+ float eventY = k < historySize ? event .getHistoricalY (actionIndex , k )
835+ : event .getY (actionIndex );
817836 // tx and ty are relative to wave center
818837 float tx = eventX - mWaveCenterX ;
819838 float ty = eventY - mWaveCenterY ;
0 commit comments