Update to use new multi-pointer APIs.

This commit is contained in:
Dianne Hackborn
2009-08-04 20:03:31 -07:00
parent bae114d3da
commit 30712dcdf7

View File

@@ -65,6 +65,7 @@ public class PointerLocation extends Activity {
private final Paint mTextLevelPaint; private final Paint mTextLevelPaint;
private final Paint mPaint; private final Paint mPaint;
private final Paint mTargetPaint; private final Paint mTargetPaint;
private final Paint mPathPaint;
private final FontMetricsInt mTextMetrics = new FontMetricsInt(); private final FontMetricsInt mTextMetrics = new FontMetricsInt();
private int mHeaderBottom; private int mHeaderBottom;
private boolean mCurDown; private boolean mCurDown;
@@ -92,6 +93,9 @@ public class PointerLocation extends Activity {
mTargetPaint = new Paint(); mTargetPaint = new Paint();
mTargetPaint.setAntiAlias(false); mTargetPaint.setAntiAlias(false);
mTargetPaint.setARGB(192, 0, 0, 255); mTargetPaint.setARGB(192, 0, 0, 255);
mPathPaint = new Paint();
mPathPaint.setAntiAlias(false);
mPathPaint.setARGB(255, 64, 128, 255);
mPaint.setStyle(Paint.Style.STROKE); mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(1); mPaint.setStrokeWidth(1);
} }
@@ -138,19 +142,29 @@ public class PointerLocation extends Activity {
final int N = ps.mXs.size(); final int N = ps.mXs.size();
float lastX=0, lastY=0; float lastX=0, lastY=0;
mPaint.setARGB(255, 0, 255, 255); boolean haveLast = false;
boolean drawn = false;
mPaint.setARGB(255, 128, 255, 255);
for (int i=0; i<N; i++) { for (int i=0; i<N; i++) {
float x = ps.mXs.get(i); float x = ps.mXs.get(i);
float y = ps.mYs.get(i); float y = ps.mYs.get(i);
if (i > 0) { if (Float.isNaN(x)) {
canvas.drawLine(lastX, lastY, x, y, mTargetPaint); haveLast = false;
continue;
}
if (haveLast) {
canvas.drawLine(lastX, lastY, x, y, mPathPaint);
canvas.drawPoint(lastX, lastY, mPaint); canvas.drawPoint(lastX, lastY, mPaint);
drawn = true;
} }
lastX = x; lastX = x;
lastY = y; lastY = y;
haveLast = true;
} }
if (drawn) {
if (ps.mVelocity != null) { if (ps.mVelocity != null) {
mPaint.setARGB(255, 255, 0, 0); mPaint.setARGB(255, 255, 64, 128);
float xVel = ps.mVelocity.getXVelocity() * (1000/60); float xVel = ps.mVelocity.getXVelocity() * (1000/60);
float yVel = ps.mVelocity.getYVelocity() * (1000/60); float yVel = ps.mVelocity.getYVelocity() * (1000/60);
canvas.drawLine(lastX, lastY, lastX+xVel, lastY+yVel, mPaint); canvas.drawLine(lastX, lastY, lastX+xVel, lastY+yVel, mPaint);
@@ -159,8 +173,7 @@ public class PointerLocation extends Activity {
} }
} }
if (mCurDown && NP > 0) { if (mCurDown && ps.mCurDown) {
final PointerState ps = mPointers.get(0);
canvas.drawLine(0, (int)ps.mCurY, getWidth(), (int)ps.mCurY, mTargetPaint); canvas.drawLine(0, (int)ps.mCurY, getWidth(), (int)ps.mCurY, mTargetPaint);
canvas.drawLine((int)ps.mCurX, 0, (int)ps.mCurX, getHeight(), mTargetPaint); canvas.drawLine((int)ps.mCurX, 0, (int)ps.mCurX, getHeight(), mTargetPaint);
int pressureLevel = (int)(ps.mCurPressure*255); int pressureLevel = (int)(ps.mCurPressure*255);
@@ -169,6 +182,7 @@ public class PointerLocation extends Activity {
canvas.drawCircle(ps.mCurX, ps.mCurY, ps.mCurWidth, mPaint); canvas.drawCircle(ps.mCurX, ps.mCurY, ps.mCurWidth, mPaint);
} }
} }
}
@Override @Override
public boolean onTouchEvent(MotionEvent event) { public boolean onTouchEvent(MotionEvent event) {
@@ -188,57 +202,70 @@ public class PointerLocation extends Activity {
// mRect.setEmpty(); // mRect.setEmpty();
//} //}
if (action == MotionEvent.ACTION_DOWN) { if (action == MotionEvent.ACTION_DOWN) {
for (int p=0; p<NP; p++) { if (NP == 0) {
final PointerState ps = mPointers.get(p);
ps.mXs.clear();
ps.mYs.clear();
ps.mVelocity = VelocityTracker.obtain();
}
}
while (NP < event.getPointerCount()) {
PointerState ps = new PointerState(); PointerState ps = new PointerState();
ps.mVelocity = VelocityTracker.obtain(); ps.mVelocity = VelocityTracker.obtain();
mPointers.add(ps); mPointers.add(ps);
NP++; NP++;
} }
for (int p=0; p<NP; p++) {
if ((action&MotionEvent.ACTION_MASK) == MotionEvent.ACTION_POINTER_DOWN) { final PointerState ps = mPointers.get(p);
final PointerState ps = mPointers.get(
(action&MotionEvent.ACTION_POINTER_MASK)
>> MotionEvent.ACTION_POINTER_SHIFT);
ps.mXs.clear(); ps.mXs.clear();
ps.mYs.clear(); ps.mYs.clear();
ps.mVelocity = VelocityTracker.obtain(); ps.mVelocity = VelocityTracker.obtain();
ps.mCurDown = false;
}
mPointers.get(0).mCurDown = true;
} }
if (NP > event.getPointerCount()) { if ((action&MotionEvent.ACTION_MASK) == MotionEvent.ACTION_POINTER_DOWN) {
NP = event.getPointerCount(); final int id = (action&MotionEvent.ACTION_POINTER_ID_MASK)
>> MotionEvent.ACTION_POINTER_ID_SHIFT;
while (NP <= id) {
PointerState ps = new PointerState();
ps.mVelocity = VelocityTracker.obtain();
mPointers.add(ps);
NP++;
} }
final PointerState ps = mPointers.get(id);
ps.mVelocity = VelocityTracker.obtain();
ps.mCurDown = true;
}
final int NI = event.getPointerCount();
mCurDown = action != MotionEvent.ACTION_UP mCurDown = action != MotionEvent.ACTION_UP
&& action != MotionEvent.ACTION_CANCEL; && action != MotionEvent.ACTION_CANCEL;
for (int p=0; p<NP; p++) { for (int i=0; i<NI; i++) {
final PointerState ps = mPointers.get(p); final PointerState ps = mPointers.get(event.getPointerId(i));
ps.mVelocity.addMovement(event); ps.mVelocity.addMovement(event);
ps.mVelocity.computeCurrentVelocity(1); ps.mVelocity.computeCurrentVelocity(1);
final int N = event.getHistorySize(); final int N = event.getHistorySize();
for (int i=0; i<N; i++) { for (int j=0; j<N; j++) {
ps.mXs.add(event.getHistoricalX(p, i)); ps.mXs.add(event.getHistoricalX(i, j));
ps.mYs.add(event.getHistoricalY(p, i)); ps.mYs.add(event.getHistoricalY(i, j));
} }
ps.mXs.add(event.getX(p)); ps.mXs.add(event.getX(i));
ps.mYs.add(event.getY(p)); ps.mYs.add(event.getY(i));
ps.mCurX = (int)event.getX(p); ps.mCurX = (int)event.getX(i);
ps.mCurY = (int)event.getY(p); ps.mCurY = (int)event.getY(i);
//Log.i("Pointer", "Pointer #" + p + ": (" + ps.mCurX //Log.i("Pointer", "Pointer #" + p + ": (" + ps.mCurX
// + "," + ps.mCurY + ")"); // + "," + ps.mCurY + ")");
ps.mCurPressure = event.getPressure(p); ps.mCurPressure = event.getPressure(i);
ps.mCurSize = event.getSize(p); ps.mCurSize = event.getSize(i);
ps.mCurWidth = (int)(ps.mCurSize*(getWidth()/3)); ps.mCurWidth = (int)(ps.mCurSize*(getWidth()/3));
} }
if ((action&MotionEvent.ACTION_MASK) == MotionEvent.ACTION_POINTER_UP) {
final int id = (action&MotionEvent.ACTION_POINTER_ID_MASK)
>> MotionEvent.ACTION_POINTER_ID_SHIFT;
final PointerState ps = mPointers.get(id);
ps.mXs.add(Float.NaN);
ps.mYs.add(Float.NaN);
ps.mCurDown = false;
}
//if (mCurDown) { //if (mCurDown) {
// mRect.union(mCurX-mCurWidth-3, mCurY-mCurWidth-3, // mRect.union(mCurX-mCurWidth-3, mCurY-mCurWidth-3,
// mCurX+mCurWidth+3, mCurY+mCurWidth+3); // mCurX+mCurWidth+3, mCurY+mCurWidth+3);