밑에 소스는 제가 api가지고 만든 소스입니다.
여기서 손날이나 특정 영역을 무시 하고 펜으로 그릴때만 그리기를 하고 싶은데 도통 이리저리
터치 좌표점을 수정해도 이상하게 되서 이렇게 질문드립니다...ㅜㅜㅜ
도와주시면 감사하겠습니다^^
(이건 클래스를 따로 만들어서 쓴것이라 전체 소스는 올리기가 그렇네요..ㅠㅠ)
public class MyView extends View implements View.OnClickListener {
public static Bitmap mBitmap;
private Canvas mCanvas;
private Path mPath;
private Paint mBitmapPaint;
private Paint mPaint;
Context Context;
StringBuilder builder = new StringBuilder();
// 여러개의좌표를 얻기위한 배열
float[] x = new float[10];
float[] y = new float[10];
boolean[] touched = new boolean[10];
public MyView(Context context) {
super(context);
Context = context;
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setDither(true);
mPaint.setColor(0xFF000000);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeJoin(Paint.Join.ROUND);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setStrokeWidth(5);
mPath = new Path();
mBitmapPaint = new Paint(Paint.DITHER_FLAG);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(mBitmap);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(0xFFFFFFFF);
canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
canvas.drawPath(mPath, mPaint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction() & MotionEvent.ACTION_MASK;
int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK);
pointerIndex = pointerIndex >> MotionEvent.ACTION_POINTER_ID_SHIFT;
int pointerId = event.getPointerId(pointerIndex);
int pointerCount = event.getPointerCount();
float mX = 0, mY = 0;
float TOUCH_TOLERANCE = 4;
mX = x[pointerId];
mY = y[pointerId];
switch (action) {
case MotionEvent.ACTION_DOWN:
pointerId = event.getPointerId(pointerIndex);
x[pointerId] = (int) event.getX(pointerIndex);
y[pointerId] = (int) event.getY(pointerIndex);
mPath.reset();
mPath.moveTo(x[pointerId], y[pointerId]);
mCanvas.drawPath(mPath, mPaint);
invalidate();
break;
case MotionEvent.ACTION_POINTER_DOWN:
pointerId = event.getPointerId(pointerIndex);
x[pointerId] = (int) event.getX(pointerIndex);
y[pointerId] = (int) event.getY(pointerIndex);
mPath.reset();
mPath.rMoveTo(x[pointerId], y[pointerId]);
mCanvas.drawPath(mPath, mPaint);
invalidate();
break;
case MotionEvent.ACTION_UP:
x[pointerId] = (int) event.getX(pointerIndex);
y[pointerId] = (int) event.getY(pointerIndex);
mPath.lineTo(x[pointerId], y[pointerId]);
// commit the path to our off screen
mCanvas.drawPath(mPath, mPaint);
// kill this so we don't double draw
mPath.reset();
break;
case MotionEvent.ACTION_POINTER_UP:
x[pointerId] = (int) event.getX(pointerIndex);
y[pointerId] = (int) event.getY(pointerIndex);
mPath.lineTo(x[pointerId], y[pointerId]);
mCanvas.drawPath(mPath, mPaint);
mPath.reset();
break;
case MotionEvent.ACTION_CANCEL:
touched[pointerId] = false;
x[pointerId] = (int) event.getX(pointerIndex);
y[pointerId] = (int) event.getY(pointerIndex);
break;
case MotionEvent.ACTION_MOVE:
for (int i = 0; i < pointerCount; i++) {
pointerIndex = i;
pointerId = event.getPointerId(pointerIndex);
x[pointerId] = (int) event.getX(pointerIndex);
y[pointerId] = (int) event.getY(pointerIndex);
float dx = Math.abs(x[pointerId] - mX);
float dy = Math.abs(y[pointerId] - mY);
if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
mX = x[pointerId];
mY = y[pointerId];
}
}
mPath.quadTo(mX, mY, (x[pointerId] + mX) / 2,
(y[pointerId] + mY) / 2);
invalidate();
break;
}
updateTextView();
return true;
}
}