自定义画图View,可绘制各种形状,圆形,矩形,三角形,椭圆,橡皮擦以及撤销反撤销等功能

本文介绍了如何在Android中自定义View实现手势绘图,包括绘制圆形、矩形、三角形、椭圆等形状,以及使用橡皮擦、清屏和撤销/反撤销功能。通过在手指移动时实时绘制并保存路径,手指抬起时更新缓冲Bitmap,实现了图形的动态绘制。文章提供了关键代码示例,并分享了完整的GitHub源代码链接。
摘要由CSDN通过智能技术生成

最近在弄手势绘图这块,但是发现在绘制形状这块没有简单的方式,所以还是自己来实现,便于自身理解。

包含了各种图形的绘制,橡皮擦,清屏以及撤销反撤销功能。可以自定义拓展去绘制各种形状,只专注于使用Canvas绘制图形。

代码实现比较简单,且都有注释,在此就不做过多详细解释。

不多说,先上图:

图一
图二

 

绘制形状主要解决的难点: 跟随手势实时绘制出来,并实时展现到屏幕上,不消失。

我现在的解决方式分2步:

1. 手指移动时,通过onDraw(Canvas)实时将形状绘制到屏幕上,并将路径保存到Path中。

2. 手指抬起时,将保存的路径再次绘制到缓冲Bitmap中并显示在屏幕上。并加入到撤销数组中。

涉及到2个类:PaintView(自定义View),以及PaintData(撤销数据存储)

具体代码:

PaintView类

​

package com.mark.paintview.view;

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.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import com.mark.paintview.PaintData;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class PaintView extends View {


    static final String TAG = "PaintView";

    public static final int DRAW_MODE_ERASE = 0;//橡皮擦

    public static final int DRAW_MODE_NORMAL = 1;//普通绘制
    public static final int DRAW_MODE_LINE = 2;//直线
    public static final int DRAW_MODE_OVAL = 3;//椭圆
    public static final int DRAW_MODE_CIRCLE = 4;//正圆
    public static final int DRAW_MODE_RECT = 5;//矩形
    public static final int DRAW_MODE_ROUND_RECT = 6;//圆角矩形
    public static final int DRAW_MODE_TRIANGLE_ONE = 7;//等腰三角形
    public static final int DRAW_MODE_TRIANGLE_TWO = 8;//直角三角形
    public static final int DRAW_MODE_ARROW = 9;//箭头


    Paint mStrokePaint, mErasePaint;
    Path mDrawPath;
    Canvas mBufferCanvas;
    Bitmap mBufferBitmap;

    Random random;

    int drawMode = DRAW_MODE_NORMAL;

    List<PaintData> mUndoList, mRedoList;

    public PaintView(Context context) {
        this(context, null);
    }

    public PaintView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public PaintView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值