tôi thấy mã thực sự tốt trên các nhà phát triển Android, nhưng Tôi không thể tìm thấy nó nữa ... Đó là đầu ra là đường cong bezier vì vậy nó sẽ được khá trơn tru. Đây là mã mà tôi chỉnh sửa:
public class MyDrawView extends View {
private Bitmap mBitmap;
private Canvas mCanvas;
private Path mPath;
private Paint mBitmapPaint;
private Paint mPaint;
public MyDrawView(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);
}
@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.drawBitmap(mBitmap, 0, 0, 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);
// commit the path to our offscreen
mCanvas.drawPath(mPath, mPaint);
// kill this so we don't double draw
mPath.reset();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
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();
}}
sau đó trong onCreate của hoạt động bạn muốn sử dụng nó trong bạn chỉ cần viết một cái gì đó như thế này:
RelativeLayout parent = (RelativeLayout) findViewById(R.id.signImageParent);
myDrawView = new MyDrawView(this);
parent.addView(myDrawView);
Quan điểm này là minh bạch và sử dụng sơn màu đen để vẽ với ngón tay của bạn. Vì vậy, nếu bạn muốn xem những gì bạn vẽ chỉ đơn giản là vẽ một bitmap màu trắng hoặc màu xám trên nền của khung nhìn này (bạn chỉ cần thêm một dòng trong startnig của onDraw), hoặc bạn có thể sử dụng nền của phụ huynh.
Sau đó, khi bạn muốn tạo một hình ảnh từ những gì bạn đã vẽ bạn chỉ cần gọi
parent.setDrawingCacheEnabled(true);
Bitmap b = parent.getDrawingCache();
FileOutputStream fos = null;
try {
fos = new FileOutputStream(getFileName());
} catch (FileNotFoundException e) {
e.printStackTrace();
}
b.compress(CompressFormat.PNG, 95, fos);
Nó phụ thuộc vào những gì bạn muốn có như đầu ra, bạn có thể sử dụng mã này hoặc thay mẹ bạn có thể làm điều này với myDrawView và bạn chỉ nhận được hình ảnh bạn đã vẽ mà không có nền (vì chúng tôi có nền myDrawView trong suốt).
Hy vọng điều này sẽ hữu ích. Hãy để lại phản hồi.
Mã tuyệt vời ... !!! – Manjunath
Cảm ơn, đó là những gì tôi cần. – lucasjmatias
Điều gì sẽ xảy ra nếu tôi có một TextView mà tôi muốn biến nó thành một bảng vẽ để cho phép vẽ miễn phí? –