2011-08-25 3 views
3

내 Android Finger Paint 앱에서 필자는 두 개의 뷰의 이미지 뷰 뒷면과 페인트 뷰를 사용하여 페인팅 및 지우기에 적합합니다. 그러나 저장 후 실제 그림 위치가 변경됩니다. 이미지에내 Android Finger 페인트 앱이 이미지의 불규칙한 위치에 페인트를 보냅니다.

제거 죽은 링크

코드 위치는 하지 변화하지

public MyView(Context c) { 
    super(c); 
    //mBitmap = Bitmap.createScaledBitmap(originalBitmap,bw,bh,true); 
    mBitmap = Bitmap.createBitmap(bw,bh,Bitmap.Config.ARGB_8888); 
    mCanvas = new Canvas(mBitmap); 
    mPath = new Path(); 
    mBitmapPaint = new Paint(Paint.DITHER_FLAG); 
    mBitmapPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC)); 
} 
@Override 
protected void onDraw(Canvas canvas) { 
    canvas.drawColor(Color.TRANSPARENT); 
    canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); 
    canvas.drawPath(mPath, mPaint); 
} 

myimage.setOnTouchListener(this); 
public boolean onTouch(View v, MotionEvent event) { 
    ImageView myimage = (ImageView) v; 
    // Dump touch event to log 
    dumpEvent(event); 
    // Handle touch events here... 
    switch (event.getAction() & MotionEvent.ACTION_MASK) { 
     case MotionEvent.ACTION_DOWN: 
      savedMatrix.set(matrix); 
      start.set(event.getX(), event.getY()); 
      Log.d(TAG, "mode=DRAG"); 
      mode = DRAG; 
      break; 
     case MotionEvent.ACTION_POINTER_DOWN: 
      oldDist = spacing(event); 
      Log.d(TAG, "oldDist=" + oldDist); 
      if (oldDist > 10f) { 
       savedMatrix.set(matrix); 
       midPoint(mid, event); 
       mode = ZOOM; 
       Log.d(TAG, "mode=ZOOM"); 
      } 
      break; 
     case MotionEvent.ACTION_UP: 
     case MotionEvent.ACTION_POINTER_UP: 
      mode = NONE; 
      Log.d(TAG, "mode=NONE"); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      if (mode == DRAG) { 
       /////// limiting the panning 
       matrix.getValues(matrixValues); 
       float currentY = matrixValues[Matrix.MTRANS_Y]; 
       float currentX = matrixValues[Matrix.MTRANS_X]; 
       float currentScale = matrixValues[Matrix.MSCALE_X]; 
       float currentHeight = height * currentScale; 
       float currentWidth = width * currentScale; 
       float dx = event.getX() - start.x; 
       float dy = event.getY() - start.y; 
       float newX = currentX+dx; 
       float newY = currentY+dy; 
       RectF drawingRect = new RectF(newX, newY, newX+currentWidth, newY+currentHeight); 
       float diffUp = Math.min(viewRect.bottom-drawingRect.bottom, viewRect.top-drawingRect.top); 
       float diffDown = Math.max(viewRect.bottom-drawingRect.bottom, viewRect.top-drawingRect.top); 
       float diffLeft = Math.min(viewRect.left-drawingRect.left, viewRect.right-drawingRect.right); 
       float diffRight = Math.max(viewRect.left-drawingRect.left, viewRect.right-drawingRect.right); 
       if(diffUp > 0){ dy +=diffUp; } 
       if(diffDown < 0){ dy +=diffDown; } 
       if(diffLeft> 0){ dx += diffLeft; } 
       if(diffRight < 0){dx += diffRight; } 
       matrix.postTranslate(dx, dy); 
      } 
      else if (mode == ZOOM) { 
       float newDist = spacing(event); 
       Log.d(TAG, "newDist=" + newDist); 
       if (newDist > 10f) { 
       matrix.set(savedMatrix); 
       float scale = newDist/oldDist; 
       matrix.getValues(matrixValues); 
       float currentScale = matrixValues[Matrix.MSCALE_X]; 
       // limit zoom 
       if (scale * currentScale > maxZoom) { 
        scale = maxZoom/currentScale; 
       } 
       else if(scale * currentScale < minZoom){ 
        scale = minZoom/currentScale; 
       } 
       matrix.postScale(scale, scale, mid.x, mid.y); 
      } 
     } 
     break; 
    } 
    myimage.setImageMatrix(matrix); 
    return true; // indicate event was handled 
} 

// Show an event in the LogCat view, for debugging 
private void dumpEvent(MotionEvent event) { 
    String names[] = { "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE", 
         "POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?" }; 
    StringBuilder sb = new StringBuilder(); 
    int action = event.getAction(); 
    int actionCode = action & MotionEvent.ACTION_MASK; 
    sb.append("event ACTION_").append(names[actionCode]); 
    if (actionCode == MotionEvent.ACTION_POINTER_DOWN || actionCode == MotionEvent.ACTION_POINTER_UP) { 
     sb.append("(pid ").append(action >> MotionEvent.ACTION_POINTER_ID_SHIFT); 
     sb.append(")"); 
    } 
    sb.append("["); 
    for (int i = 0; i < event.getPointerCount(); i++) { 
     sb.append("#").append(i); 
     sb.append("(pid ").append(event.getPointerId(i)); 
     sb.append(")=").append((int) event.getX(i)); 
     sb.append(",").append((int) event.getY(i)); 
     if (i + 1 < event.getPointerCount()) 
      sb.append(";"); 
     } 
     sb.append("]"); 
     Log.d(TAG, sb.toString()); 
    } 

    //Determine the space between the first two fingers 
    private float spacing(MotionEvent event) { 
     float x = event.getX(0) - event.getX(1); 
     float y = event.getY(0) - event.getY(1); 
     return FloatMath.sqrt(x * x + y * y); 
    } 

    // Calculate the mid point of the first two fingers 
    private void midPoint(PointF point, MotionEvent event) { 
     float x = event.getX(0) + event.getX(1); 
     float y = event.getY(0) + event.getY(1); 
     point.set(x/2, y/2); 
    } 
} 
+0

이미지 뷰의 ontouchlistner 코드를 추가하십시오. 문제는 그림을 그리고 냄비를 찍은 다음 저장하면 발생합니다. 맞습니까? – Ronnie

답변

1

입니다! 링크 된 이미지를 자세히 살펴보면 핑거 팅이 사진 모서리를 기준으로 움직이지 않는다는 것을 알 수 있습니다. 즉, 사진의 현재 스크롤 위치를 기준으로하지 않고 도면의 위치를 ​​화면에 상대적으로 저장합니다.

저장할 때 배경 사진이 잘리고/또는 확장된다는 사실을 고려해야합니다.

+0

예, 어떻게 달성 할 수 있습니까? –

+0

@raj : 핑거 페인트를 전송하려고하면 배경이 스크롤 된 X 및 Y 위치로 전송해야합니다. – Gabe

+0

이 활동을 시작했을 때 이미지를 그림으로 그릴 수있는 버튼을 누른 후 유일한 이미지가 나타납니다 (패닝 및 확대/축소 가능). 그림 이미지는 투명한 전망입니다. 우리는 X와 Y로 이동할 수 없습니다. –

0

페인트/지우기 모드를 유지합니다. 페인트/지우기 모드에서 패닝 및 확대/축소를 허용하지 않습니다. 페인트/지우기가 해제되면 도면 캐시를 가져 와서 이미지 뷰로 설정합니다. 이제 변경 사항이 비트 맵에 영구적으로 반영됩니다. 이제는 화면 이동/확대/축소를 할 수 있으며 페인트/지우기 모드로 다시 들어가 편집 할 수 있습니다.

+0

두 가지 다른 모드, 이것은 메뉴의 코드입니다 : http://dl.dropbox.com/u/38493970/Full.java –

+0

다른 해결책으로는 이미지 뷰와 함께 paintview 확대/축소 및 이동이 있습니다. 어떻게 비트 맵을 저장합니까? – Ronnie

+0

페인트보기에는 확대/축소 및 패닝이 없으며 이미지 뷰에는이 char가 있습니다. –

관련 문제