It seems Toon Warz, another game using multitouch also has some issues
on N1 and Droid. Can others confirm the problem with the code posted
above? Did anyone arrive at a solution? This is a pretty bad situation
for game developers as nothing freaks users more out than bad
controls. I think the code above is even a demo code from the android
framework so i find it kinda strange that the problem didn't pop up
during their testing phase. I also couldn't find any information on
the logcat output telling me about the drop of a bad pointer.

On 23 Jan., 19:39, mzechner <mario.zech...@gmail.com> wrote:
> I can confirm this problem using the sample code above, my own code
> and playing multipong. I created two videos, one showing the problem
> for the sample code above and one showing it in multipong.
>
> http://www.youtube.com/watch?v=865cd2Ui0Co(sample 
> code)http://www.youtube.com/watch?v=glNWToF6aOI(multipong from market)
>
> Each time thepointergo crazy LogCat displays messages tagged
> "InputDevice" saying "droppingbadpointer#0", in all 3 cases (sample
> code, my code, multipong). ThepointerIds get mixed up, and as can be
> seen in the video for the sample code above the x coordinate for the
> secondpointeris wrong. I have a suspicion that this might be a
> driver related bug. In any way it makes writting games with multitouch
> impossible.
>
> The bug can be reproduced by quickly tapping around and then settle
> with 2 digits on the screen. It does not work always but often enough
> to be annoying in a game with a dual analog stick setup on screen
> (like in my code).
>
> I hope this gets fixed asap. If more people can confirm this i file a
> bug athttp://b.google.com/
>
> On 15 Jan., 21:32, Mirmathrax <mirmath...@gmail.com> wrote:
>
> > here is in the original text from the post, this explains how to make
> > the bug occur:
>
> >  1)  Touch screen with finger 1 and start doodling
> >      2)  Without removing finger 1, touch screen with finger 2 and
> > start doodling
> >      3)  Remove finger 1 from the screen (without removing finger 2)
> >      4)  Replace finger 1 on the screen and start doodling again
> > (never remove finger 2)
> >      5)  Voila, you will see the bug.  The drawn lines for finger 1
> > will suddeny connect to finger 2.
>
> > This is because  there is a bug when the first finger is placed back
> > down again, the event only has points for the wrong finger!  Even
> > though finger 1 went back down at a new location, the code thinks for
> > some reason that finger 2 is the one that went back down (but it never
> > went up).
>
> > -Colin
>
> > On Jan 15, 2:35 pm, rollbak <roll...@gmail.com> wrote:
>
> > > Can you please explain which the issue is?
>
> > > On Jan 15, 1:09 pm, Mirmathrax <mirmath...@gmail.com> wrote:
>
> > > > Multi-touch API is bugged (at least on Motorola Droid). Here is a
> > > > method to reproduce the error for analysis:
>
> > > > 1)  Create a new android project in Eclipse with the following fields:
>
> > > >  Project name:           PointerLocation
> > > >  Build target:              Android 2.0.1
> > > >  Application Name:     PointerLocation
> > > >  Package Name:        com.example.pointerlocation
> > > >  Create Activity:         PointerLocation
>
> > > > 2)  Copy the following code and paste this into the
> > > > PointerLocation.java file that is automatically created
>
> > > > /*
> > > >  * Copyright (C) 2007 The Android Open Source Project
> > > >  *
> > > >  * Licensed under the Apache License, Version 2.0 (the "License");
> > > >  * you may not use this file except in compliance with the License.
> > > >  * You may obtain a copy of the License at
> > > >  *
> > > >  *      http://www.apache.org/licenses/LICENSE-2.0
> > > >  *
> > > >  * Unless required by applicable law or agreed to in writing, software
> > > >  * distributed under the License is distributed on an "AS IS" BASIS,
> > > >  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> > > > implied.
> > > >  * See the License for the specific language governing permissions and
> > > >  * limitations under the License.
> > > >  */
>
> > > > package com.example.pointerlocation;
>
> > > > import android.app.Activity;
> > > > import android.content.Context;
> > > > import android.graphics.Canvas;
> > > > import android.graphics.Paint;
> > > > import android.graphics.Paint.FontMetricsInt;
> > > > import android.os.Bundle;
> > > > import android.util.Log;
> > > > import android.view.MotionEvent;
> > > > import android.view.ViewConfiguration;
> > > > import android.view.WindowManager;
> > > > import android.view.VelocityTracker;
> > > > import android.view.View;
>
> > > > import java.util.ArrayList;
>
> > > > /**
> > > >  * Demonstrates wrapping a layout in a ScrollView.
> > > >  *
> > > >  */
> > > > public class PointerLocation extends Activity {
> > > >     @Override
> > > >     protected void onCreate(Bundle icicle) {
> > > >         super.onCreate(icicle);
> > > >         setContentView(new MyView(this));
>
> > > >         // Make the screen full bright for this activity.
> > > >         WindowManager.LayoutParams lp = getWindow().getAttributes();
> > > >         lp.screenBrightness = 1.0f;
> > > >         getWindow().setAttributes(lp);
> > > >     }
>
> > > >     public static class PointerState {
> > > >         private final ArrayList<Float> mXs = new ArrayList<Float>();
> > > >         private final ArrayList<Float> mYs = new ArrayList<Float>();
> > > >         private boolean mCurDown;
> > > >         private int mCurX;
> > > >         private int mCurY;
> > > >         private float mCurPressure;
> > > >         private float mCurSize;
> > > >         private int mCurWidth;
> > > >         private VelocityTracker mVelocity;
> > > >     }
>
> > > >     public class MyView extends View {
> > > >         private final ViewConfiguration mVC;
> > > >         private final Paint mTextPaint;
> > > >         private final Paint mTextBackgroundPaint;
> > > >         private final Paint mTextLevelPaint;
> > > >         private final Paint mPaint;
> > > >         private final Paint mTargetPaint;
> > > >         private final Paint mPathPaint;
> > > >         private final FontMetricsInt mTextMetrics = new FontMetricsInt
> > > > ();
> > > >         private int mHeaderBottom;
> > > >         private boolean mCurDown;
> > > >         private int mCurNumPointers;
> > > >         private int mMaxNumPointers;
> > > >         private final ArrayList<PointerState> mPointers
> > > >                  = new ArrayList<PointerState>();
>
> > > >         public MyView(Context c) {
> > > >             super(c);
> > > >             mVC = ViewConfiguration.get(c);
> > > >             mTextPaint = new Paint();
> > > >             mTextPaint.setAntiAlias(true);
> > > >             mTextPaint.setTextSize(10
> > > >                     * getResources().getDisplayMetrics().density);
> > > >             mTextPaint.setARGB(255, 0, 0, 0);
> > > >             mTextBackgroundPaint = new Paint();
> > > >             mTextBackgroundPaint.setAntiAlias(false);
> > > >             mTextBackgroundPaint.setARGB(128, 255, 255, 255);
> > > >             mTextLevelPaint = new Paint();
> > > >             mTextLevelPaint.setAntiAlias(false);
> > > >             mTextLevelPaint.setARGB(192, 255, 0, 0);
> > > >             mPaint = new Paint();
> > > >             mPaint.setAntiAlias(true);
> > > >             mPaint.setARGB(255, 255, 255, 255);
> > > >             mPaint.setStyle(Paint.Style.STROKE);
> > > >             mPaint.setStrokeWidth(2);
> > > >             mTargetPaint = new Paint();
> > > >             mTargetPaint.setAntiAlias(false);
> > > >             mTargetPaint.setARGB(255, 0, 0, 192);
> > > >             mPathPaint = new Paint();
> > > >             mPathPaint.setAntiAlias(false);
> > > >             mPathPaint.setARGB(255, 0, 96, 255);
> > > >             mPaint.setStyle(Paint.Style.STROKE);
> > > >             mPaint.setStrokeWidth(1);
>
> > > >             PointerState ps = new PointerState();
> > > >             ps.mVelocity = VelocityTracker.obtain();
> > > >             mPointers.add(ps);
> > > >         }
>
> > > >         @Override
> > > >         protected void onMeasure(int widthMeasureSpec, int
> > > > heightMeasureSpec) {
> > > >             super.onMeasure(widthMeasureSpec, heightMeasureSpec);
> > > >             mTextPaint.getFontMetricsInt(mTextMetrics);
> > > >             mHeaderBottom = -mTextMetrics.ascent+mTextMetrics.descent
> > > > +2;
> > > >             Log.i("foo", "Metrics: ascent=" + mTextMetrics.ascent
> > > >                     + " descent=" + mTextMetrics.descent
> > > >                     + " leading=" + mTextMetrics.leading
> > > >                     + " top=" + mTextMetrics.top
> > > >                     + " bottom=" + mTextMetrics.bottom);
> > > >         }
>
> > > >         @Override
> > > >         protected void onDraw(Canvas canvas) {
> > > >             final int w = getWidth();
> > > >             final int itemW = w/7;
> > > >             final int base = -mTextMetrics.ascent+1;
> > > >             final int bottom = mHeaderBottom;
>
> > > >             final int NP = mPointers.size();
>
> > > >             if (NP > 0) {
> > > >                 final PointerState ps = mPointers.get(0);
> > > >                 canvas.drawRect(0, 0, itemW-1,
> > > > bottom,mTextBackgroundPaint);
> > > >                 canvas.drawText("P: " + mCurNumPointers + " / " +
> > > > mMaxNumPointers,
> > > >                         1, base, mTextPaint);
>
> > > >                 final int N = ps.mXs.size();
> > > >                 if ((mCurDown && ps.mCurDown) || N == 0) {
> > > >                     canvas.drawRect(itemW, 0, (itemW * 2) - 1, bottom,
> > > > mTextBackgroundPaint);
> > > >                     canvas.drawText("X: " + ps.mCurX, 1 + itemW, base,
> > > > mTextPaint);
> > > >                     canvas.drawRect(itemW * 2, 0, (itemW * 3) - 1,
> > > > bottom, mTextBackgroundPaint);
> > > >                     canvas.drawText("Y: " + ps.mCurY, 1 + itemW * 2,
> > > > base, mTextPaint);
> > > >                 } else {
> > > >                     float dx = ps.mXs.get(N-1) - ps.mXs.get(0);
> > > >                     float dy = ps.mYs.get(N-1) - ps.mYs.get(0);
> > > >                     canvas.drawRect(itemW, 0, (itemW *
>
> ...
>
> Erfahren Sie mehr »

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to