只实现了画板的绘制,画板的清除,画板的撤销(返回上一步)、保存文件。
因使用SurfaceView保存的图片一片黑,重新使用View来绘制,可保存图片。如果可以保存SurfaceView为文件的方法,麻烦告知一下
代码:
package com.cxmscb.cxm.newtest;
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.os.Environment;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Toast;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
/**
* Created by cxm on 2016/10/12.
*/
public class DrawBoard extends View implements View.OnTouchListener {
private Paint paint = new Paint();
private Path path = new Path();
//存储笔画
private ArrayList<Path> paths = new ArrayList<Path>();
/**
* 保存上一次绘制的终点横坐标
*/
private float pX;
/**
* 保存上一次绘制的终点纵坐标
*/
private float pY;
public DrawBoard(Context context, AttributeSet attrs) {
super(context, attrs);
setOnTouchListener(this);
paint.setAntiAlias(true);
paint.setDither(true);
paint.setColor(Color.BLACK);
paint.setStrokeWidth(4.0f);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);// 设置外边缘
paint.setStrokeCap(Paint.Cap.SQUARE);// 形状
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.WHITE);
for (int i = 0; i < paths.size(); i++) {
canvas.drawPath(paths.get(i), paint);
}
}
//清除画板
public void clear() {
for (int i = 0; i < paths.size(); i++) {
paths.get(i).reset();
}
paths.clear();
invalidate();
}
//撤销,返回上一步
public void goBack() {
if (paths.size() >= 1) {
path = paths.get(paths.size() - 1);
path.reset();
paths.remove(paths.size() - 1);
}
invalidate();
}
// 最好在子线程中调用
public void save(String filePath) throws IOException {
this.setDrawingCacheEnabled(true);
//截图
Bitmap bitmap = this.getDrawingCache();
if (bitmap != null) {
//保存
saveBitmapForSdCard(bitmap,filePath);
Toast.makeText(getContext(), "保存成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getContext(), "截图失败", Toast.LENGTH_SHORT).show();
}
}
private void saveBitmapForSdCard(Bitmap bitmap,String filePath) {
//创建file对象
File f = new File(filePath);
//创建
if(f.exists()){
f.delete();
}
FileOutputStream fOut = null;
try {
fOut = new FileOutputStream(f);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//原封不动的保存在内存卡上
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
try {
fOut.flush();
} catch (IOException e) {
e.printStackTrace();
}
try {
fOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
path = new Path();
paths.add(path);
path.moveTo(event.getX(), event.getY());
pX = event.getX();
pY = event.getY();
invalidate();
break;
case MotionEvent.ACTION_MOVE:
path.quadTo(pX,pY,event.getX(), event.getY());
//quadTo比lineTo更润滑
pX = event.getX();
pY = event.getY();
invalidate();
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}
}