2017-06-01 4 views
0

J'ai essayé ce code de points de couleur multitouch données dans le tutoriel http://www.vogella.com/tutorials/AndroidTouch/article.htmlandroid multitouch sur tutoriel vogella ne fonctionne pas

Je veux placer un point sur le toucher et quand je déplace mon doigt un point shuold reste là et une autre doit se déplacer .Juste comme un joystick.

donc pop-up point apparaît et reste jusqu'à ce que je lève le doigt et si je déplace mon doigt un autre point de même couleur doit se déplacer

J'ai essayé ce code

public class MultitouchView extends View { 

    private static final int SIZE = 150; 

    float xx; 
    float yy; 

    float[] abcisa; 
    float[] ordinate; 

    private SparseArray<PointF> mActivePointers; 

    private Paint mPaint; 
    private int[] colors = { Color.BLUE, Color.GREEN, Color.MAGENTA, 
      Color.BLACK, Color.CYAN, Color.GRAY, Color.RED, Color.DKGRAY, 
      Color.LTGRAY, Color.YELLOW }; 

    private Paint textPaint; 


    public MultitouchView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     initView(); 
    } 

    private void initView() { 
     mActivePointers = new SparseArray<PointF>(); 
     mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     // set painter color to a color you like 
     mPaint.setColor(Color.BLUE); 
     mPaint.setStyle(Paint.Style.FILL_AND_STROKE); 
     textPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     textPaint.setTextSize(20); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 

     // get pointer index from the event object 
     int pointerIndex = event.getActionIndex(); 

     // get pointer ID 
     int pointerId = event.getPointerId(pointerIndex); 

     // get masked (not specific to a pointer) action 
     int maskedAction = event.getActionMasked(); 

     switch (maskedAction) { 

      case MotionEvent.ACTION_DOWN: 
      case MotionEvent.ACTION_POINTER_DOWN: { 
       // We have a new pointer. Lets add it to the list of pointers 

       PointF f = new PointF(); 

        xx = f.x = event.getX(pointerIndex); 
        yy = f.y = event.getY(pointerIndex); 
       canvas.drawCircle(xx, yy, SIZE, mPaint); 
        mActivePointers.put(pointerId, f); 

       break; 
      } 
      case MotionEvent.ACTION_MOVE: { // a pointer was moved 
       for (int size = event.getPointerCount(), i = 0; i < size; i++) { 
        PointF point = mActivePointers.get(event.getPointerId(i)); 
        if (point != null) { 
         point.x = event.getX(i); 
         point.y = event.getY(i); 
        } 
       } 
       break; 
      } 
      case MotionEvent.ACTION_UP: 
      case MotionEvent.ACTION_POINTER_UP: 
      case MotionEvent.ACTION_CANCEL: { 
       mActivePointers.remove(pointerId); 
       break; 
      } 
     } 
     invalidate(); 

     return true; 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 

     // draw all pointers 
     for (int size = mActivePointers.size(), i = 0; i < size; i++) { 
      PointF point = mActivePointers.valueAt(i); 

      if (point != null) 
       mPaint.setColor(colors[i % 9]); 
      canvas.drawCircle(xx, yy, SIZE, mPaint); 
      canvas.drawCircle(point.x, point.y, SIZE, mPaint); 

     } 

     canvas.drawText("Total pointers: " + mActivePointers.size(), 10, 40 , textPaint); 
    } 

} 

J'ai essayé aussi de stocker xx et yy dans un tableau comme xx [pointerID] et que l'accès sur canvas.drawCircle mais l'application est écrasé

son code était comme ça

public class MultitouchView extends View { 

    private static final int SIZE = 150; 

    float[] xx; 
    float[] yy; 

    private SparseArray<PointF> mActivePointers; 

    private Paint mPaint; 
    private int[] colors = { Color.BLUE, Color.GREEN, Color.MAGENTA, 
      Color.BLACK, Color.CYAN, Color.GRAY, Color.RED, Color.DKGRAY, 
      Color.LTGRAY, Color.YELLOW }; 

    private Paint textPaint; 

    public MultitouchView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     initView(); 
    } 

    private void initView() { 
     mActivePointers = new SparseArray<PointF>(); 
     mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     // set painter color to a color you like 
     mPaint.setColor(Color.BLUE); 
     mPaint.setStyle(Paint.Style.FILL_AND_STROKE); 
     textPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     textPaint.setTextSize(20); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 

     // get pointer index from the event object 
     int pointerIndex = event.getActionIndex(); 

     // get pointer ID 
     int pointerId = event.getPointerId(pointerIndex); 

     // get masked (not specific to a pointer) action 
     int maskedAction = event.getActionMasked(); 

     switch (maskedAction) { 

      case MotionEvent.ACTION_DOWN: 
      case MotionEvent.ACTION_POINTER_DOWN: { 
       // We have a new pointer. Lets add it to the list of pointers 

       PointF f = new PointF(); 

        xx[pointerId] = f.x = event.getX(pointerIndex); 
        yy[pointerId] = f.y = event.getY(pointerIndex); 

        mActivePointers.put(pointerId, f); 

       break; 
      } 
      case MotionEvent.ACTION_MOVE: { // a pointer was moved 
       for (int size = event.getPointerCount(), i = 0; i < size; i++) { 
        PointF point = mActivePointers.get(event.getPointerId(i)); 
        if (point != null) { 
         point.x = event.getX(i); 
         point.y = event.getY(i); 
        } 
       } 
       break; 
      } 
      case MotionEvent.ACTION_UP: 
      case MotionEvent.ACTION_POINTER_UP: 
      case MotionEvent.ACTION_CANCEL: { 
       mActivePointers.remove(pointerId); 
       break; 
      } 
     } 
     invalidate(); 

     return true; 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 

     // draw all pointers 
     for (int size = mActivePointers.size(), i = 0; i < size; i++) { 
      PointF point = mActivePointers.valueAt(i); 

      if (point != null) 
       mPaint.setColor(colors[i % 9]); 
      canvas.drawCircle(xx[i], yy[i], SIZE, mPaint); 
      canvas.drawCircle(point.x, point.y, SIZE, mPaint); 

     } 

     canvas.drawText("Total pointers: " + mActivePointers.size(), 10, 40 , textPaint); 
    } 

} 

S'il vous plaît aider.

journal des blocages

06-01 16: 48: 42,781 10922-10922/com.example.nimishmaravikd.colourmtouch E/AndroidRuntime: EXCEPTION FATAL: principal processus: com.example.nimishmaravikd.colourmtouch, PID: 10922 java.lang.NullPointerException: Tentative d'écriture sur le tableau null à com.example.nimishmaravikd.colourmtouch.MultitouchView.onTouchEvent (MultitouchView.java:73) at android.view.View.dispatchTouchEvent (View.java: 9323) at android.view.ViewGroup .dispatchTransformedTouchEvent (ViewGroup.java:2554) à android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2198) à android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:2554) à android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2198) à android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:2554) à android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2198) à android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup .java: 2554) à android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2198) à co m.android.internal.policy.PhoneWindow $ DecorView.superDispatchTouchEvent (PhoneWindow.java:2405) à com.android.internal.policy.PhoneWindow.superDispatchTouchEvent (PhoneWindow.java:1739) at android.app.Activity.dispatchTouchEvent (Activity.java:2832) à com.android.internal.policy.PhoneWindow $ DecorView.dispatchTouchEvent (PhoneWindow.java:2366) à android.view.View.dispatchPointerEvent (View.java:9543) à android.view. ViewRootImpl $ ViewPostImeInputStage.processPointerEvent (ViewRootImpl.java:4619) à l'adresse android.view.ViewRootImpl $ ViewPostImeInputStage.onProcess (ViewRootImpl.java:4480) at android.view.ViewRootImp l $ InputStage.deliver (ViewRootImpl.java:4010) à android.view.ViewRootImpl $ InputStage.onDeliverToNext (ViewRootImpl.java:4063) à android.view.ViewRootImpl $ InputStage.forward (ViewRootImpl.java:4029) à android.view.ViewRootImpl $ AsyncInputStage.forward (ViewRootImpl.java:4155) à android.view.ViewRootImpl $ InputStage.apply (ViewRootImpl.java:4037) à android.view.ViewRootImpl $ AsyncInputStage.apply (ViewRootImpl.java:4212) à android.view.ViewRootImpl $ InputStage.deliver (ViewRootImpl.java:4010) à android.view.ViewRootImpl $ InputStage.onDeliverToNext (ViewRootImpl.java:4063) à android.view.ViewRootImpl $ InputStage.forward (ViewRootImpl.java: 4029) à android.view.ViewRootImpl $ InputStage.apply (ViewRootImpl.java:4037) à android.view.ViewRootImpl $ InputStage.deliver (ViewRootImpl.java:4010) à android.view.ViewRootImpl.deliverInputEvent (ViewRootImpl.java:6397) à android.view.ViewRootImpl.doProcessInputEvents (ViewRootImpl.java:6371) à android.view.ViewRootImpl.enqueueInputEvent (ViewRootImpl.java:6318) à androïde .view.ViewRootImpl $ WindowInputEventReceiver.onInputEvent (ViewRootImpl.java:6576) à android.view.InputEventReceiver.dispatchInputEvent (InputEventReceiver.java:185) à android.os.MessageQueue.nativePollOnce (native Method) à android.os. MessageQueue.next (MessageQueue.java:324) at android.os.Looper.loop (Looper.java:135) à android.app.ActivityThread.main (ActivityThread.java:5582) à java.lang.reflect.Method.invoke (méthode native) à com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java: 726) à l'adresse com.android.internal.os.ZygoteInit.main (ZygoteInit.java:616) 06-01 16: 48: 42.791 10922-10933/com.example.nimishmaravikd.colourmtouch I/ActivityThreadEui: schedulePauseActivity com.example .nimishmaravikd.colourmtouch.MainActivity fini = true userLeaving = false configChanges = 0 dontReport = false

+0

S'il vous plaît partager vos journaux de plantage –

Répondre

0

ne pas changer tout le code: - Selon ma compréhension que vous voulez déplacer même color.i juste vérifié les mouvements de même couleur.

mPaint.setColor(colors[i % 1]); 

Essayez ceci !!

+0

Non je veux 1> .on point de point apparaît 2> lorsque je bouge le doigt un autre point se déplace autour du premier point ET je veux faire pour tous les pointeurs –

+0

Voir.Le comportement de la touche est comme Touchez le doigt, un point apparaît à l'écran puis avec quand vous mettez le deuxième doigt pour une autre couleur ici. donc on a 10 fingures c'est pourquoi l'exemple met 10 couleurs différentes.Ceci fonctionne parfaitement. Alors qu'est-ce que tu veux de nouveau dans tout ça? –

+0

à chaque tapotement un point doit rester là à l'emplacement initial et à partir de cet emplacement si je bouge mon doigt un autre point de la même couleur devrait se déplacer autour du premier point. Mean chaque pointeur montre deux cercles point de même couleur un autre statique –