2013-06-18 32 views
3

我正在開發一個android繪圖應用程序,它有一個用於繪製的自定義視圖的相關佈局。到目前爲止,除了在縮放畫布時繪圖發生在錯誤的位置上時,它們都可以工作,所以最好顯示代碼而不是試圖解釋它。是的,我嘗試過使用path.offset,但沒有成功。主要的問題是,當它在縮放時繪製,而在正確的位置繪製時,路徑太敏感,當您的手指居中時很好,但是如果您上下/左右移動路徑移動速度比手指快。Android Java,在一個縮放畫布上繪製

package com.nick.sketchr; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Path; 
import android.graphics.Rect; 
import android.view.MotionEvent; 
import android.view.View; 

public class CustomCanvas extends View { 
private Bitmap mBitmap; 
private Canvas mCanvas; 
private Path mPath; 
private Paint mBitmapPaint; 
private Paint mPaint; 
private float old_scale; 
private float dmx,dmy; 
private double scale; 
private long timevar2; 
private Rect bounds; 
public CustomCanvas(Context c) { 
    super(c); 
    mPath = new Path(); 
    mBitmapPaint = new Paint(Paint.DITHER_FLAG); 
    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(3); 
    dmx = Main_App.w/2/2; 
    dmy = Main_App.h/2/2; 
    scale = 1; 
} 

@Override 
protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    super.onSizeChanged(w, h, oldw, oldh); 
    mBitmap = Bitmap.createBitmap(Main_App.w/2, Main_App.h/2, Bitmap.Config.ARGB_8888); 
    mCanvas = new Canvas(mBitmap); 
    mBitmap.eraseColor(Color.WHITE); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    float sc = (float) scale; 
    canvas.scale(sc, sc, Main_App.w/2, Main_App.h/2); 
    canvas.drawBitmap(mBitmap, dmx, dmy, mBitmapPaint); 
    canvas.drawPath(mPath, mPaint); 
} 
private float mX, mY; 
private static final float TOUCH_TOLERANCE = 4; 

private void touch_start(float x, float y) { 
    mPath.reset(); 
    mPath.moveTo(x, y); 
    mX = x; 
    mY = y; 
} 
private void touch_move(float x, float y) { 
    float dx = Math.abs(x - mX); 
    float dy = Math.abs(y - mY); 
    if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { 
     mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); 
     mX = x; 
     mY = y; 
    } 
} 
private void touch_up() { 
    mPath.lineTo(mX, mY); 
    mPath.offset(-dmx, -dmy); //this is the problem area 
    //also the path shows wrong when canvas is scaled... o_o 
    mCanvas.drawPath(mPath, mPaint); 
    mPath.reset(); 
} 
@Override 
public boolean onTouchEvent(MotionEvent event){ 
    float x = event.getX()/(float)scale+bounds.left; 
    float y = event.getY()/(float)scale+bounds.top; 
    if(event.getPointerCount() == 2){ 
     timevar2 = event.getEventTime(); 
     float newx = event.getX(0); 
     float newy = event.getY(0); 
     float oldx = event.getX(1); 
     float oldy = event.getY(1); 
     mPath.reset(); 
     float equa = (float) (Math.pow(newx - oldx, 2) + Math.pow(newy - oldy, 2)); 
     float cscale = (float) Math.sqrt(equa)/100; 
     float scaled = (cscale - old_scale); 
     if(scaled < -0.1){ 
      if(scale > 0.1){ 
       scale -= 0.03; 
      } 
     } 
     if(scaled > 0.1){ 
      scale += 0.03; 
     } 
     dmx = (float) (((newx + oldx)/2)-(Main_App.w/2/2)*scale); 
     dmy = (float) (((newy + oldy)/2)-(Main_App.h/2/2)*scale); 
     old_scale = cscale; 
     invalidate(); 
     return true; 
    } 
    long dt = event.getEventTime() - timevar2; 
    if(dt < 100){ 
     return true; 
    } 
    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      touch_start(x, y); 
      invalidate(); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      touch_move(x, y); 
      invalidate(); 
      break; 
     case MotionEvent.ACTION_UP: 
      touch_up(); 
      invalidate(); 
      break; 
     } 
    return true; 
} 

public void clear(){ 
    mBitmap.eraseColor(Color.TRANSPARENT); 
    invalidate(); 
    System.gc(); 
} 
} 

回答

0

不完全確定,但您可能會錯誤地縮放Canvas。相反,嘗試:

canvas.scale(width_of_canvas, height_of_canvas) 
onDraw()

method.Currently您正在使用的1比例值。