All these bugs (and several more you may not have discovered yet, e.g.
event noise on touch up/down) are covered in excruciating detail on my
blog, http://lukehutch.wordpress.com/android-stuff .  The main posts
you will want to read are:

http://lukehutch.wordpress.com/2009/01/10/full-working-multitouch-on-the-t-mobile-g1-android-phone/
http://lukehutch.wordpress.com/2009/01/25/get-multi-touch-support-on-your-t-mobile-g1-today/
http://lukehutch.wordpress.com/2010/01/06/my-multi-touch-code-ported-to-eclair/

These are hardware / firmware limitations and it is actually
impossible to overcome them on current hardware/firmware.  Some could
possibly be fixed with a firmware update from synaptics though this
probably won't happen (e.g. partially raising a touch point up loses
one of X or Y but not the other) and some of the bugs will not be
fixed without new hardware (the fact it's a 2x1D device and not a 2D
device).

--
Luke Hutchison


On Jan 28, 7:06 pm, Mario Zechner <[email protected]> wrote:
> 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 <[email protected]> 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(samplecode)http://www.youtube.com/watch?v=glNWToF6aOI(multipongfrom
> > 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 <[email protected]> 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 <[email protected]> wrote:
>
> > > > Can you please explain which the issue is?
>
> > > > On Jan 15, 1:09 pm, Mirmathrax <[email protected]> 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 + " / " +
>
> ...
>
> read more »

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

Reply via email to