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

