2017-06-01 78 views
0

Android的多点触控我试图教程 http://www.vogella.com/tutorials/AndroidTouch/article.html上vogella教程不工作

给予多点触控色点的这个代码,我要放置在触摸点,当我将我的手指一个点shuold留在那里,另一个应该移动就像操纵杆一样。

所以弹出点出现并停留在那里,直到我举起我的手指,如果将我的手指相同颜色的另一点应该移动

我想这个代码

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); 
    } 

} 

我也试图存储XX和在阵列中作为YY XX [pointerID]以及访问上canvas.drawCircle但应用程序崩溃

它的代码是这样

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); 
    } 

} 

请帮忙。

崩溃日志

06-01 16:48:42.781 10922-10922/com.example.nimishmaravikd.colourmtouch E/AndroidRuntime:致命异常:主 工艺:com.example.nimishmaravikd.colourmtouch, PID:10922 java.lang.NullPointerException:尝试写入空数组 at 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) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2198) at co在android.app.Activity.dispatchTouchEvent()中, (android.view.java:9543) at android.view。 ViewRootImpl $ ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4619) at android.view.ViewRootImpl $ ViewPostImeInputStage.onProcess(ViewRootImpl.java:4480) at android.view.ViewRootImp升$ 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) 在(ViewRootImpl.java:4010) at android.view.ViewRootImpl $ InputStage.forward(ViewRootImpl.java: 4029) at android.view.ViewRootImpl $ InputStage.apply(ViewRootImpl.java:4037) at 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) 在机器人.view.ViewRootImpl $ WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6576) 在android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185) 在android.os.MessageQueue.nativePollOnce(本机方法) 在android.os。 MessageQueue.next(MessageQueue.java:324) at android.os.Looper.loop(Looper.java:135) 在android.app.ActivityThread.main(ActivityThread.java:5582) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java: 726) at 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完成=真userLeaving =假configChanges = 0 dontReport =假

+0

请分享您的崩溃日志 –

回答

0

不要改变所有代码: - 按我的理解,你只想移动相同color.i检查相同的颜色移动。

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

试试这个!

+0

否我想要1> .on tap dot出现2>当我移动手指另一个点围绕第一个点移动并且我想为所有指针做这个 –

+0

See.Mutitouch行为就像是什么时候ü轻点手指,屏幕上会出现一个点,然后当您将第二个手指放在另一个颜色的位置时。所以我们有10个音色,这就是为什么例子把10个不同的颜色。这是完美的作品。所以你想在这个新的?每个水龙头上的 –

+0

一个点应该保留在非常初始的位置,如果我移动我的手指,那么相同颜色的另一个点应该围绕第一个点移动。每个指针显示两个相同颜色的圆点一个静态的其他可移动 –