J'ai vu un très bon code sur les développeurs Android, mais je ne le trouve plus... Sa sortie est des courbes de Bézier donc ce sera assez lisse. Voici le code que j'ai édité:
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();
}}
ensuite dans le onCreate de l'activité dans laquelle vous voulez l'utiliser, il vous suffit d'écrire quelque chose comme ceci:
RelativeLayout parent = (RelativeLayout) findViewById(R.id.signImageParent);
myDrawView = new MyDrawView(this);
parent.addView(myDrawView);
Ce composant est transparent et utilise de la peinture noire pour dessiner avec votre doigt. Donc si vous voulez voir ce que vous avez dessiné, il suffit de dessiner une image blanche ou grise en arrière-plan de ce composant (vous ajoutez simplement une ligne au début de onDraw), ou vous pouvez utiliser l'arrière-plan du parent.
Ensuite, lorsque vous voulez créer une image de ce que vous avez dessiné, il vous suffit d'appeler
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);
Cela dépend de ce que vous voulez obtenir comme résultat, vous pouvez utiliser ce code ou au lieu de parent vous pouvez le faire avec myDrawView et vous n'obtiendrez que l'image que vous avez dessinée sans arrière-plan (puisque nous avons notre arrière-plan myDrawView transparent).
J'espère que cela vous aidera. N'hésitez pas à laisser vos commentaires.