import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import java.util.concurrent.Executors;
public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable {
private SurfaceHolder mSurfaceHolder;
private Canvas mCanvas;
private boolean mIsDrawing;
// 画笔
private Paint mPaint;
// 路径
private Path mPath;
// 上次的坐标
private float mLastX, mLastY;
private boolean mIsWait = true;
public MySurfaceView(Context context) {
this(context, null);
}
public MySurfaceView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MySurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
/**
* 初始化
*/
private void init() {
// 获取 SurfaceHolder对象
mSurfaceHolder = getHolder();
//注册 SurfaceHolder
mSurfaceHolder.addCallback(this);
// 设置可以获取焦点
setFocusable(true);
// 设置触摸可以获取焦点
setFocusableInTouchMode(true);
// 保持屏幕常亮
this.setKeepScreenOn(true);
// 初始化画笔
mPaint = new Paint();
mPaint.setStrokeWidth(50);
mPaint.setColor(Color.BLACK);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setAntiAlias(true);
// 初始化路径
mPath = new Path();
}
// SurfaceView 创建时调用
@Override
public void surfaceCreated(SurfaceHolder holder) {
mIsDrawing = true;
// 通过线程池来执行
Executors.newCachedThreadPool().execute(this);
}
// SurfaceView 改变时调用
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
// SurfaceView 销毁时调用
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mIsDrawing = false;
}
@Override
public void run() {
drawing();
synchronized (MySurfaceView.this) {
while (mIsDrawing) {
if (mIsWait) {
try {
MySurfaceView.this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
drawing();
}
}
}
private void drawing() {
try {
// 获取Canvas 画布
mCanvas = mSurfaceHolder.lockCanvas();
// 下面进行内容的绘制
mCanvas.drawColor(Color.WHITE);
mCanvas.drawPath(mPath, mPaint);
} finally {
if (mCanvas != null) {
mSurfaceHolder.unlockCanvasAndPost(mCanvas);
}
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// 获取当前触摸事件的坐标
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
synchronized (MySurfaceView.this) {
mIsWait = false;
MySurfaceView.this.notify();
}
// 按下
mLastX = x;
mLastY = y;
mPath.moveTo(mLastX, mLastY);
break;
case MotionEvent.ACTION_MOVE:
// 移动
float dx = Math.abs(x - mLastX);
float dy = Math.abs(y - mLastY);
if (dx >= 3 || dy >= 3) {
mPath.quadTo(mLastX, mLastY, (mLastX + x) / 2, (mLastY + y) / 2);
}
mLastX = x;
mLastY = y;
break;
case MotionEvent.ACTION_UP:
// 抬起
mIsWait = true;
break;
}
return true;
}
}
需要保存功能,用view截图