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