Improve touch paint sample to use geometrical touch width.
Added multitouch support.
Fixed the trackball based drawing.
Change-Id: I15d9c5c4ac26a83f476f98c1f2ef3a5841e2ffbd
diff --git a/samples/ApiDemos/src/com/example/android/apis/graphics/TouchPaint.java b/samples/ApiDemos/src/com/example/android/apis/graphics/TouchPaint.java
index 0942852..14e6c4f 100644
--- a/samples/ApiDemos/src/com/example/android/apis/graphics/TouchPaint.java
+++ b/samples/ApiDemos/src/com/example/android/apis/graphics/TouchPaint.java
@@ -159,21 +159,20 @@
public class MyView extends View {
private static final int FADE_ALPHA = 0x06;
private static final int MAX_FADE_STEPS = 256/FADE_ALPHA + 4;
+ private static final int TRACKBALL_SCALE = 10;
+
private Bitmap mBitmap;
private Canvas mCanvas;
private final Rect mRect = new Rect();
private final Paint mPaint;
private final Paint mFadePaint;
- private boolean mCurDown;
- private int mCurX;
- private int mCurY;
- private float mCurPressure;
- private float mCurSize;
- private int mCurWidth;
+ private float mCurX;
+ private float mCurY;
private int mFadeSteps = MAX_FADE_STEPS;
public MyView(Context c) {
super(c);
+ setFocusable(true);
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setARGB(255, 255, 255, 255);
@@ -229,61 +228,59 @@
}
@Override public boolean onTrackballEvent(MotionEvent event) {
- boolean oldDown = mCurDown;
- mCurDown = true;
int N = event.getHistorySize();
- int baseX = mCurX;
- int baseY = mCurY;
- final float scaleX = event.getXPrecision();
- final float scaleY = event.getYPrecision();
+ final float scaleX = event.getXPrecision() * TRACKBALL_SCALE;
+ final float scaleY = event.getYPrecision() * TRACKBALL_SCALE;
for (int i=0; i<N; i++) {
//Log.i("TouchPaint", "Intermediate trackball #" + i
// + ": x=" + event.getHistoricalX(i)
// + ", y=" + event.getHistoricalY(i));
- drawPoint(baseX+event.getHistoricalX(i)*scaleX,
- baseY+event.getHistoricalY(i)*scaleY,
- event.getHistoricalPressure(i),
- event.getHistoricalSize(i));
+ mCurX += event.getHistoricalX(i) * scaleX;
+ mCurY += event.getHistoricalY(i) * scaleY;
+ drawPoint(mCurX, mCurY, 1.0f, 16.0f);
}
//Log.i("TouchPaint", "Trackball: x=" + event.getX()
// + ", y=" + event.getY());
- drawPoint(baseX+event.getX()*scaleX, baseY+event.getY()*scaleY,
- event.getPressure(), event.getSize());
- mCurDown = oldDown;
+ mCurX += event.getX() * scaleX;
+ mCurY += event.getY() * scaleY;
+ drawPoint(mCurX, mCurY, 1.0f, 16.0f);
return true;
}
@Override public boolean onTouchEvent(MotionEvent event) {
- int action = event.getAction();
- mCurDown = action == MotionEvent.ACTION_DOWN
- || action == MotionEvent.ACTION_MOVE;
- int N = event.getHistorySize();
- for (int i=0; i<N; i++) {
- //Log.i("TouchPaint", "Intermediate pointer #" + i);
- drawPoint(event.getHistoricalX(i), event.getHistoricalY(i),
- event.getHistoricalPressure(i),
- event.getHistoricalSize(i));
+ int action = event.getActionMasked();
+ if (action != MotionEvent.ACTION_UP && action != MotionEvent.ACTION_CANCEL) {
+ int N = event.getHistorySize();
+ int P = event.getPointerCount();
+ for (int i = 0; i < N; i++) {
+ for (int j = 0; j < P; j++) {
+ mCurX = event.getHistoricalX(j, i);
+ mCurY = event.getHistoricalY(j, i);
+ drawPoint(mCurX, mCurY,
+ event.getHistoricalPressure(j, i),
+ event.getHistoricalTouchMajor(j, i));
+ }
+ }
+ for (int j = 0; j < P; j++) {
+ mCurX = event.getX(j);
+ mCurY = event.getY(j);
+ drawPoint(mCurX, mCurY, event.getPressure(j), event.getTouchMajor(j));
+ }
}
- drawPoint(event.getX(), event.getY(), event.getPressure(),
- event.getSize());
return true;
}
- private void drawPoint(float x, float y, float pressure, float size) {
+ private void drawPoint(float x, float y, float pressure, float width) {
//Log.i("TouchPaint", "Drawing: " + x + "x" + y + " p="
- // + pressure + " s=" + size);
- mCurX = (int)x;
- mCurY = (int)y;
- mCurPressure = pressure;
- mCurSize = size;
- mCurWidth = (int)(mCurSize*(getWidth()/3));
- if (mCurWidth < 1) mCurWidth = 1;
- if (mCurDown && mBitmap != null) {
- int pressureLevel = (int)(mCurPressure*255);
+ // + pressure + " width=" + width);
+ if (width < 1) width = 1;
+ if (mBitmap != null) {
+ float radius = width / 2;
+ int pressureLevel = (int)(pressure * 255);
mPaint.setARGB(pressureLevel, 255, 255, 255);
- mCanvas.drawCircle(mCurX, mCurY, mCurWidth, mPaint);
- mRect.set(mCurX-mCurWidth-2, mCurY-mCurWidth-2,
- mCurX+mCurWidth+2, mCurY+mCurWidth+2);
+ mCanvas.drawCircle(x, y, radius, mPaint);
+ mRect.set((int) (x - radius - 2), (int) (y - radius - 2),
+ (int) (x + radius + 2), (int) (y + radius + 2));
invalidate(mRect);
}
mFadeSteps = 0;