2016-12-18 3 views
0

useres가 태블릿에 활성 펜을 사용하여 그림을 그릴 수있는 Android 앱을 만듭니다. 사용자는 다양한 도구를 제공하는 다양한 모드 (예 : 펜, 지우개, 선, 원) 중에서 선택할 수 있습니다.
선 및 원 도구를 사용하면 사용자가 길이/반경 및 방향을 사용하여 선/원을 그릴 수 있습니다. 이것은 아주 잘 작동하지만, 사용자가 펜을 움직이면 다른 줄/원이 그려지며 화면을 채 웁니다.Android : 한 지점에서 다른 지점으로 선을 그려 보자.

이미지 :Current result vs. how it should be when drawing from circle center

코드 :

@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); 
    canvas = new Canvas(mBitmap); 
} 

@Override 
protected void onDraw(Canvas c){ 
    c.drawBitmap(mBitmap, 0, 0, bitmapPaint); 
} 

private float mX, mY, firstX, firstY; 

private void touch_start(float x, float y) { //called from MotionEvent.ACTION_DOWN 
    path.moveTo(x, y); 
    firstX = x; 
    firstY = y; 
    mX = x; 
    mY = y; 
} 

private void touch_move(float x, float y) { //called from MotionEvent.ACTION_MOVE 
    path.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); 
    switch(mode){ 
     case "line": 
      canvas.drawLine(firstX, firstY, x, y, paint); 
      break; 
     case "circle": 
      canvas.drawCircle(firstX, firstY, (Math.abs(firstX-x) + Math.abs(firstY-y))/1.5f, paint); // divisor 1.5 just a rough value 
      break; 
     default: 
      canvas.drawPath(path, paint); 
      break; 
    } 
    mX = x; 
    mY = y; 
} 

사람이 내가이 생각 고칠 수 어떻게?
미리 감사드립니다.

+0

:

이 새로운 touch_move입니다. 'touch_move()'를 호출하기 전에'invalidate()'가 없다면, 그것도 필요할 것입니다. – Gary99

답변

0

나는 혼자 해결책을 찾았습니다.
그릴 때 원을 표시하기 위해 새 캔버스 animationCanvas을 만들고 animationBitmap을 작성했습니다.
최종 원형은 MotionEvent.ACTION_UP의 방법에서 그려집니다. 어쩌면

private void touch_move(float x, float y) { //called from MotionEvent.ACTION_MOVE 
    path.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); 
    switch(mode){ 
     case "line": 
      animationCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); // clear previously drawn line (for animation) 
      animationCanvas.drawLine(firstX, firstY, x, y, paint); 
      break; 
     case "circle": 
      animationCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); // clear previously drawn circle (for animation) 
      animationCanvas.drawCircle(firstX, firstY, (Math.abs(firstX-x) + Math.abs(firstY-y))/1.5f, paint); // divisor 1.5 just a rough value 
      break; 
     default: 
      canvas.drawPath(path, paint); 
      break; 
    }  
    mX = x; 
    mY = y; 
} 

하지 최상의 솔루션하지만 그것은 작동 :) 당신은 아마()`하기 전에 각`drawXxx()의``canvas.reset 필요

관련 문제