package com.js.photosdk.scrawl;
import com.js.photosdk.utils.FileUtils;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PointF;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.drawable.BitmapDrawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
public class DrawingBoardView extends View
{
/** 画板背景 **/
private Bitmap backgroundBitmap = null;
/** 绘画图层 **/
private Bitmap paintBitmap = null;
/** 绘画板 **/
private Canvas paintCanvas = null;
/** 手势监听 **/
private GestureDetector brushGestureDetector = null;
private BrushGestureListener brushGestureListener = null;
/** 绘画类型 **/
private DrawAttribute.DrawStatus mDrawStatus;
private int mBrushColor;
/** 上下文 **/
private Context context;
public DrawingBoardView(Context context, AttributeSet attributeSet)
{
super(context, attributeSet);
this.context = context;
brushGestureListener = new BrushGestureListener();
brushGestureDetector = new GestureDetector(context,
brushGestureListener);
}
@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
canvas.drawColor(Color.WHITE);
canvas.drawBitmap(backgroundBitmap, 0, 0, null);
canvas.drawBitmap(paintBitmap, 0, 0, null);
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
brushGestureDetector.onTouchEvent(event);
postInvalidate();
return true;
}
/**
* 设置绘制的背景图片 创建绘画画板Canvas
*
* @param bitmap
* 背景图片
*
*/
public void setBackgroundBitmap(Bitmap bitmap)
{
backgroundBitmap = bitmap;
paintBitmap = Bitmap.createBitmap(backgroundBitmap.getWidth(),
backgroundBitmap.getHeight(), Bitmap.Config.ARGB_8888);
paintCanvas = new Canvas(paintBitmap);
}
/**
* 设置绘画类型
*
* @param drawStatus
*
* 绘画类型
*
*/
public void setDrawStatus(DrawAttribute.DrawStatus drawStatus)
{
this.mDrawStatus = drawStatus;
}
/**
* 设置画笔颜色
*
* @param color
*
* 画笔颜色
*
*/
public void setPaintColor(int color)
{
this.mBrushColor = color;
}
/**
* 设置画笔
*
* @param drawStatus
* 绘画类型
*
* @param brushBitmap
* 画笔
*
* @param brushColor
* 画笔颜色
*
*/
public void setBrushBitmap(DrawAttribute.DrawStatus drawStatus,
Bitmap brushBitmap, int brushColor)
{
this.mDrawStatus = drawStatus;
this.mBrushColor = brushColor;
Bitmap tempBrush = null;
int brushDistance = 0;
Paint brushPaint = null;
switch (mDrawStatus)
{
case PEN_WATER :
brushDistance = 1;
tempBrush = casualStroke(brushBitmap, brushColor);
brushPaint = null;
break;
case PEN_CRAYON :
brushDistance = brushBitmap.getWidth() / 2;
tempBrush = casualStroke(brushBitmap, brushColor);
brushPaint = null;
break;
case PEN_COLOR_BIG :
tempBrush = casualStroke(brushBitmap, brushColor);
brushDistance = 2;
brushPaint = null;
break;
case PEN_ERASER :
brushPaint = new Paint();
brushPaint.setFilterBitmap(true);
brushPaint.setXfermode(new PorterDuffXfermode(
PorterDuff.Mode.DST_OUT));
tempBrush = brushBitmap;
brushDistance = brushBitmap.getWidth() / 4;
break;
default :
break;
}
brushGestureListener.setBrush(tempBrush, brushDistance, brushPaint);
}
/**
* 设置邮票数据
*
* @param drawStatus
* 绘画类型
*
* @param res
* 资源ID数组(大小为4)
*
* @param color
* 颜色
*
*/
public void setStampBitmaps(DrawAttribute.DrawStatus drawStatus, int[] res,
int color)
{
Bitmap[] brushBitmaps = new Bitmap[4];
brushBitmaps[0] = casualStroke(res[0], color);
brushBitmaps[1] = casualStroke(res[1], color);
brushBitmaps[2] = casualStroke(res[2], color);
brushBitmaps[3] = casualStroke(res[3], color);
brushGestureListener.setStampBrush(brushBitmaps);
this.mDrawStatus = drawStatus;
}
class BrushGestureListener extends GestureDetector.SimpleOnGestureListener
{
private Bitmap brushBitmap = null;
private int brushDistance;
/** 半个画刷宽度 **/
private int halfBrushBitmapWidth;
/** 画刷 **/
private Paint brushPaint = null;
/** 邮票 **/
private Bitmap[] stampBrushBitmaps = null;
/** 是否是邮票 **/
private boolean isStamp = false;
public BrushGestureListener()
{
super();
isStamp = false;
}
@Override
public boolean onDown(MotionEvent e)
{
switch (mDrawStatus)
{
case PEN_WATER :
case PEN_CRAYON :
case PEN_COLOR_BIG :
case PEN_ERASER :
{
isStamp = false;
break;
}
case PEN_STAMP :
{
isStamp = true;
break;
}
default :
isStamp = false;
break;
}
if (isStamp)
{
paintSingleStamp(e.getX(), e.getY());
} else
{
paintCanvas.drawBitmap(brushBitmap, e.getX()
- halfBrushBitmapWidth,
e.getY() - halfBrushBitmapWidth, brushPaint);
}
return true;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY)
{
if (isStamp)
{
//paintSingleStamp(e2.getX(), e2.getY());
} else
{
float beginX = e2.getX();
float beginY = e2.getY();
float distance = (float) Math.sqrt(distanceX * distanceX
+ distanceY * distanceY);
float x = distanceX / distance, x_ = 0;
float y = distanceY / distance, y_ = 0;
while (Math.abs(x_) <= Math.abs(distanceX)
&& Math.abs(y_) <= Math.abs(distanceY))
{
x_ += x * brushDistance;
y_ += y * brushDistance;
paintCanvas.save();
paintCanvas.rotate((float) (Math.random() * 10000), beginX
+ x_, beginY + y_);
paintCanvas.drawBitmap(brushBitmap, beginX + x_
- halfBrushBitmapWidth, beginY + y_
- halfBrushBitmapWidth, brushPaint);
paintCanvas.restore();
}
}
return true;
}
public void setBrush(Bitmap brushBitmap, int brushDistance,
Paint brushPaint)
{
this.brushBitmap = brushBitmap;
this.brushDistance = brushDistance;
this.halfBrushBitmapWidth = brushBitmap.getWidth() / 2;
this.brushPaint = brushPaint;
}
public void setStampBrush(Bitmap[] brushBitmaps)
{
this.stampBrushBitmaps = brushBitmaps;
halfBrushBitmapWidth = brushBitmaps[0].getWidth() / 2;
}
private void paintSingleStamp(float x, float y)
{
if (Math.random() > 0.1)
{
paintCanvas.drawBitmap(stampBrushBitmaps[0], x
- halfBrushBitmapWidth, y - halfBrushBitmapWidth, null);
}
for (int i = 1; i < stampBrushBitmaps.length; i++)
{
if (Math.random() > 0.3)
{
paintCanvas.drawBitmap(stampBrushBitmaps[i], x
- halfBrushBitmapWidth, y - halfBrushBitmapWidth,
null);
}
}
}
}
/**
* 将图片涂色
*
* @param mode
* 画笔
*
* @param color
* 画笔颜色
*
* @return 将画笔(图片)涂色
*
*/
private Bitmap casualStroke(Bitmap paintBit, int color)
{
Bitmap bitmap = paintBit.copy(Bitmap.Config.ARGB_8888, true);
Canvas canvas = new Canvas();
canvas.setBitmap(bitmap);
Paint paintUnder = new Paint();
paintUnder.setColor(color);
canvas.drawPaint(paintUnder);
Paint paint = new Paint();
paint.setFilterBitmap(true);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
canvas.drawBitmap(paintBit, 0, 0, paint);
paintBit.recycle();
return bitmap;
}
/**
* 将图片涂色
*
* @param drawableId
* 图片
*
* @param color
* 颜色
*
* @return
*/
private Bitmap casualStroke(int drawableId, int color)
{
Bitmap mode = ((BitmapDrawable) this.getResources().getDrawable(
drawableId)).getBitmap();
Bitmap bitmap = mode.copy(Bitmap.Config.ARGB_8888, true);
Canvas canvas = new Canvas();
canvas.setBitmap(bitmap);
Paint paintUnder = new Paint();
paintUnder.setColor(color);
canvas.drawPaint(paintUnder);
Paint paint = new Paint();
paint.setFilterBitmap(true);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
canvas.drawBitmap(mode, 0, 0, paint);
return bitmap;
}
/**
* 得到绘画图片
*
* @return
*/
public Bitmap getDrawBitmap()
{
Bitmap bitmap = Bitmap.createBitmap(backgroundBitmap.getWidth(),
backgroundBitmap.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
canvas.drawBitmap(backgroundBitmap, 0, 0, null);
canvas.drawBitmap(paintBitmap, 0, 0, null);
canvas.save();
return bitmap;
}
}