public void clear() {
if (mCanvas != null) {
isTouched = false;
mPaint.setColor(mPenColor);
mCanvas.drawColor(mBackColor, PorterDuff.Mode.CLEAR);
mPaint.setColor(mPenColor);
invalidate();
}
}
public void save(String path, boolean clearBlank, int blank) throws IOException {
if (TextUtils.isEmpty(path)) {
return;
}
mSavePath = path;
Bitmap bitmap = cacheBitmap;
if (clearBlank) {
bitmap = clearBlank(bitmap, blank);
}
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos);
byte[] buffer = bos.toByteArray();
if (buffer != null) {
File file = new File(path);
if (file.exists()) {
file.delete();
}
OutputStream os = new FileOutputStream(file);
os.write(buffer);
os.close();
bos.close();
}
}
public Bitmap getBitmap() {
setDrawingCacheEnabled(true);
buildDrawingCache();
Bitmap bitmap = getDrawingCache();
setDrawingCacheEnabled(false);
return bitmap;
}
public String getSavePath() {
return mSavePath;
}
private Bitmap clearBlank(Bitmap bmp, int blank) {
int height = bmp.getHeight();
int width = bmp.getWidth();
int top = 0, left = 0, right = 0, bottom = 0;
int[] pixs = new int[width];
boolean isStop;
for (int i = 0; i < height; i++) {
bmp.getPixels(pixs, 0, width, 0, i, width, 1);
isStop = false;
for (int pix :
pixs) {
if (pix != mBackColor) {
top = i;
isStop = true;
break;
}
}
if (isStop) {
break;
}
}
for (int i = height - 1; i >= 0; i--) {
bmp.getPixels(pixs, 0, width, 0, i, width, 1);
isStop = false;
for (int pix :
pixs) {
if (pix != mBackColor) {
bottom = i;
isStop = true;
break;
}
}
if (isStop) {
break;
}
}
pixs = new int[height];
for (int x = 0; x < width; x++) {
bmp.getPixels(pixs, 0, 1, x, 0, 1, height);
isStop = false;
for (int pix : pixs) {
if (pix != mBackColor) {
left = x;
isStop = true;
break;
}
}
if (isStop) {
break;
}
}
for (int x = width - 1; x > 0; x--) {
bmp.getPixels(pixs, 0, 1, x, 0, 1, height);
isStop = false;
for (int pix : pixs) {
if (pix != mBackColor) {
right = x;
isStop = true;
break;
}
}
if (isStop) {
break;
}
}
if (blank < 0) {
blank = 0;
}
left = left - blank > 0 ? left - blank : 0;
top = top - blank > 0 ? top - blank : 0;
right = right + blank > width - 1 ? width - 1 : right + blank;
bottom = bottom + blank > height - 1 ? height - 1 : bottom + blank;
return Bitmap.createBitmap(bmp, left, top, right - left, bottom - top);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
cacheBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(cacheBitmap);
mCanvas.drawColor(mBackColor);
isTouched = false;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(cacheBitmap, 0, 0, mPaint);
canvas.drawPath(mPath, mPaint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mPenX = event.getX();
mPenY = event.getY();
mPath.moveTo(mPenX, mPenY);
return true;
case MotionEvent.ACTION_MOVE:
isTouched = true;
float x = event.getX();
float y = event.getY();
float preX = mPenX;
float preY = mPenY;
float dx = Math.abs(x - preX);
float dy = Math.abs(y - preY);
if (dx >= 3 || dy >= 3) {
float cx = (x + preX) / 2;
float cy = (y + preY) / 2;
mPath.quadTo(preX, preY, cx, cy);
mPenX = x;
mPenY = y;
}
invalidate();
break;
case MotionEvent.ACTION_UP:
mCanvas.drawPath(mPath, mPaint);
mPath.reset();
break;
default:
break;
}
return super.onTouchEvent(event);
}