Android基于Canvas,自定义View实现简单的画图工具

本文介绍如何在Android中通过自定义View和Canvas实现一个简单的画图工具,包括绘制图形、橡皮擦功能、保存图像到jpg文件等操作。详细步骤包括:自定义View实现画图逻辑、XML布局文件的创建以及主Activity的设置。
摘要由CSDN通过智能技术生成

我们要实现的功能:

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值