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
S'il vous plaît partager vos journaux de plantage –