마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

그리기 관련 멀티터치 관련 질문요...

0 추천
밑에 소스는 제가 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;
}
}
익명사용자 님이 2013년 10월 18일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...