2011-08-25 14 views
3

在我的Android手指繪畫應用程序中,我在頂部使用了兩個視圖的imageview背面和paintview,它對於繪畫和刪除工作正常。但保存後,真正的繪畫位置發生了變化。我的Android手指繪畫應用程序將圖像發送到圖像上的不規則位置

去除死鏈接到圖片

代碼爲

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

添加您的imageview的ontouchlistner代碼。當你繪製,平移然後保存時,問題就會發生。對吧? – Ronnie

回答

1

位置不變化!如果仔細觀察鏈接的圖像,就會發現您的指紋不會相對於照片的角落移動。換句話說,您將相對於屏幕保存圖形的位置,而不是相對於照片的當前滾動位置。

保存時,您必須考慮背景照片被裁剪和/或縮放的事實。

+0

是的,我們將如何實現這一目標。 –

+0

@raj:當您轉移指紋時,您必須將其轉移到背景滾動到的任何X和Y位置。 – Gabe

+0

在這個活動開始時,它顯示的是唯一的圖像(可以平移和縮放)按下按鈕後,我們允許在圖像上繪畫。繪畫圖像是透明的視圖。我們不能通過X和Y. –

0

保持畫圖/擦除模式。在繪製/擦除模式下,禁止平移和縮放。當paint/erase關閉時,獲取繪圖緩存並將其設置爲imageview。現在這些更改永久存在於位圖中。所以你現在可以平移/縮放,再次進入油漆/擦除模式進一步編輯。

+0

兩種不同的模式如何,這是菜單的代碼:http://dl.dropbox.com/u/38493970/Full.java –

+0

替代解決方案,使用paintview縮放和平移以及imageview。你怎麼保存位圖? – Ronnie

+0

油漆視圖沒有縮放和平移,只有imageview有這個字符的 –

相關問題