最近在弄手势绘图这块,但是发现在绘制形状这块没有简单的方式,所以还是自己来实现,便于自身理解。
包含了各种图形的绘制,橡皮擦,清屏以及撤销反撤销功能。可以自定义拓展去绘制各种形状,只专注于使用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) {