我们要实现的功能:
1、点击相应的按钮,在图上画出相应的图形,并实时展现在画布上。
2、橡皮檫功能,点击橡皮擦按钮,可以擦除画图上的图形。
3、点击确定按钮可以停止当前的绘制。
4、点击保存按钮可以把绘制的图形保存为jpg格式的图片文件。
具体如下图:
具体实现步骤:
1、先自定义view,在view里实现各种画图的操作,代码如下:
public class TestView extends View {
public int mMode = 0; //0:空 1:画直线 2:涂鸦 3:橡皮檫
private float startX, startY, endX, endY;//用来存手指移动后的坐标
private float mX, mY;
public Bitmap map;//对图像的一些操作
public Canvas canvas;
private Paint paint;//画笔
private Paint eraserPaint; //橡皮
private Path mPath;
public int color;
private TextView textView;
private int mWidth, mHeight;
private float radius;
public TestView(Context context, int width, int height, TextView textView) {
super(context);
this.mWidth = width;
this.mHeight = height;
paint = new Paint();
paint.setAntiAlias(true);//消除锯齿
paint.setStyle(Paint.Style.STROKE);//设置画笔结尾时的样式为圆润
paint.setStrokeJoin(Paint.Join.ROUND); //设置拐角的形状 MITER 尖角、 BEVEL 平角和 ROUND 圆角,默认为 MITER
paint.setStrokeCap(Paint.Cap.SQUARE); //设置线头的形状 BUTT 平头、ROUND 圆头、SQUARE 方头,默认为 BUTT
paint.setColor(Color.BLACK);
paint.setStrokeWidth(3);
//橡皮擦
eraserPaint = new Paint();
eraserPaint.setAlpha(0);
//这个属性是设置paint为橡皮擦重中之重
//这是重点
//下面这句代码是橡皮擦设置的重点
eraserPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
//上面这句代码是橡皮擦设置的重点(重要的事是不是一定要说三遍)
eraserPaint.setAntiAlias(true);
eraserPaint.setDither(true);
eraserPaint.setStyle(Paint.Style.STROKE);
eraserPaint.setStrokeJoin(Paint.Join.ROUND);
eraserPaint.setStrokeWidth(20);
mPath = new Path();
map = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);//绘制一个与手机屏幕大小的BitMap对象
canvas = new Canvas(map);
this.textView = textView;
}
//设置绘制模式
public void setMode(int mode) {
this.mMode = mode;
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.WHITE);
canvas.drawBitmap(map, 0, 0, paint);//从 0 0开始到map中的width,height的一块画布,也就是全屏幕的一块画布
switch (mMode) {
case GameActivity.DrawLinePen:
canvas.drawLine(startX, startY, endX, endY, paint);
break;
case GameActivity.DrawPolyPen:
break;
case GameActivity.DrawRectPen:
canvas.drawRect(startX, startY, endX, endY, paint);
break;
case GameActivity.DrawCirclePen:
canvas.drawCircle(startX, startY, radius, paint);
break;
case GameActivity.HandWritePen:
canvas.drawPath(mPath, paint);
break;
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//获得手指放下的坐标
float x = event.getX();
float y = event.ge