package com.project.sketchpad.view;
import java.util.ArrayList;
import com.project.sketchpad.Activity.R;
import com.project.sketchpad.Activity.SketchpadMainActivity;
import com.project.sketchpad.Contral.BitmapCtl;
import com.project.sketchpad.Contral.BitmapUtil;
import com.project.sketchpad.Contral.Circlectl;
import com.project.sketchpad.Contral.EraserCtl;
import com.project.sketchpad.Contral.LineCtl;
import com.project.sketchpad.Contral.OvaluCtl;
import com.project.sketchpad.Contral.PenuCtl;
import com.project.sketchpad.Contral.PlygonCtl;
import com.project.sketchpad.Contral.RectuCtl;
import com.project.sketchpad.Contral.Spraygun;
import com.project.sketchpad.data.CommonDef;
import com.project.sketchpad.interfaces.ISketchpadDraw;
import com.project.sketchpad.interfaces.IUndoRedoCommand;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.BitmapDrawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
/**function:实现图形的绘制与显示
*/
public class SketchpadView extends View implements IUndoRedoCommand{
//设置画笔常量
public static final int STROKE_PEN = 12; //画笔1
public static final int STROKE_ERASER = 2; //橡皮擦2
public static final int STROKE_PLYGON = 10; //多边形3
public static final int STROKE_RECT = 9; //矩形 4
public static final int STROKE_CIRCLE = 8; //圆 5
public static final int STROKE_OVAL = 7; //椭圆 6
public static final int STROKE_LINE = 6; //直线7
public static final int STROKE_SPRAYGUN=5; //喷枪8
public static final int STROKE_PAINTPOT=4; //油漆桶9
public static int flag =0; //油漆桶参数
public static final int UNDO_SIZE = 20; //撤销栈的大小
public static final int BITMAP_WIDTH = 650; //画布高
public static final int BITMAP_HEIGHT = 400; //画布宽
private int m_strokeType = STROKE_PEN; //画笔风格
private static int m_strokeColor = Color.RED; //画笔颜色
private static int m_penSize = CommonDef.SMALL_PEN_WIDTH; //画笔大小
private static int m_eraserSize = CommonDef.LARGE_ERASER_WIDTH; //橡皮擦大小
//实例新画布
private boolean m_isEnableDraw = true; //标记是否可以画
private boolean m_isDirty = false; //标记
private boolean m_isTouchUp = false; //标记是否鼠标弹起
private boolean m_isSetForeBmp = false; //标记是否设置了前bitmap
private int m_bkColor = Color.WHITE; //背景色
private int m_canvasWidth = 100; //画布宽
private int m_canvasHeight = 100; //画布高
private boolean m_canClear = true; //标记是否可清除
private Bitmap m_foreBitmap = null; //用于显示的bitmap
private Bitmap m_tempForeBitmap = null; //用于缓冲的bitmap
private Bitmap m_bkBitmap = null; //用于背后画的bitmap
private Canvas m_canvas; //画布
private Paint m_bitmapPaint = null; //画笔
private SketchPadUndoStack m_undoStack = null;//栈存放执行的操作
private ISketchpadDraw m_curTool = null; //记录操作的对象画笔类
int antiontemp = 0;//获取鼠标点击画布的event
boolean myLoop = false;// 喷枪结束标识符
private Bitmap bgBitmap = null;
///////////////// paint and Bk//////////////////////////////
//画布参数设计
public boolean isDirty(){
return m_isDirty; //
}
public void setDrawStrokeEnable(boolean isEnable){
m_isEnableDraw = isEnable; //确定是否可绘图
}
public void setBkColor(int color){ //设置背景颜色
if (m_bkColor != color){
m_bkColor = color;
invalidate();
}
}
public static void setStrokeSize(int size, int type){ //设置画笔的大小和橡皮擦大小
switch(type){
case STROKE_PEN:
m_penSize = size;
break;
case STROKE_ERASER:
m_eraserSize = size;
break;
}
}
public static void setStrokeColor(int color){ //设置画笔颜色
m_strokeColor = color;
}
public static int getStrokeSize(){ //得到画笔的大小
return m_penSize;
}
public static int getEraser(){ //得到橡皮擦的大小
return m_eraserSize;
}
public static int getStrokeColor(){ //得到画笔的大小
return m_strokeColor;
}
////////////////////////////////////////////////////////////
public void clearAllStrokes(){ //清空设置
if (m_canClear){
// 清空撤销栈
m_undoStack.clearAll();
// 设置当前的bitmap对象为空
if (null != m_tempForeBitmap){
m_tempForeBitmap.recycle();
m_tempForeBitmap = null;
}
// Create a new fore bitmap and set to canvas.
createStrokeBitmap(m_canvasWidth, m_canvasHeight);
invalidate();
m_isDirty = true;
m_canClear = false;
}
}
///////////////////////bitmap/////////////////////
/*保存时对当前绘图板的图片进行快照*/
public Bitmap getCanvasSnapshot(){
setDrawingCacheEnabled(true);
buildDrawingCache(true);
Bitmap bmp = getDrawingCache(true);
if (null == bmp){
android.util.Log.d("leehong2", "getCanvasSnapshot getDrawingCache == null");
}
return BitmapUtil.duplicateBitmap(bmp);
}
/*打开图像文件时,设置当前视图为foreBitmap*/
public void setForeBitmap(Bitmap foreBitmap){
if (foreBitmap != m_foreBitmap && null != foreBitmap){
// Recycle the bitmap.
if (null != m_foreBitmap){
m_foreBitmap.recycle();
}
// Here create a new fore bitmap to avoid crashing when set bitmap to canvas.
m_foreBitmap = BitmapUtil.duplicateBitmap(foreBitmap);
if (null != m_foreBitmap && null != m_canvas){
m_canvas.setBitmap(m_foreBitmap);
}
invalidate();
}
}
public Bitmap getForeBitmap(){
return m_bkBitmap;
}
public void setBkBitmap(Bitmap bmp){ //设置背景bitmap
if (m_bkBitmap != bmp){
//m_bkBitmap = bmp;
m_bkBitmap = BitmapUtil.duplicateBitmap(bmp);
invalidate();
}
}
public Bitmap getBkBitmap(){
return m_bkBitmap;
}
protected void createStrokeBitmap(int w, int h){
m_canvasWidth = w;
m_canvasHeight = h;
Bitmap bitmap = Bitmap.createBitmap(m_canvasWidth, m_canvasHeight, Bitmap.Config.ARGB_8888);
if (null != bitmap){
m_foreBitmap = bitmap;
// Set the fore bitmap to m_canvas to be as canvas of strokes.
m_canvas.setBitmap(m_foreBitmap);
}
}
protected void setTempForeBitmap(Bitmap tempForeBitmap){
if (null != tempForeBitmap){
if (null != m_foreBitmap){
m_foreBitmap.recycle();
}
m_foreBitmap = BitmapCtl.duplicateBitmap(tempForeBitmap);
if (null != m_foreBitmap && null != m_canvas) {
m_canvas.setBitmap(m_foreBitmap);
invalidate();
}
}
}
protected void setCanvasSize(int width, int height)
{//设置画布大小
if (width > 0 && height > 0){
if (m_canvasWidth != width || m_canvasHeight != height){
m_canvasWidth = width;
m_canvasHeight = height;
createStrokeBitmap(m_canvasWidth, m_canvasHeight);
}
}
}
//初始化数据 调用
protected void initialize(){
m_canvas = new Canvas();//实例画布用于整个绘图操作
m_bitmapPaint = new Paint(Paint.ANTI_ALIAS_FLAG); //实例
- 1
- 2
- 3
- 4
- 5
- 6
前往页