package com.sh.yirisheng.yijiaren.yrsheng_yijiaren.widget;
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.graphics.PointF;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import java.util.ArrayList;
/**
* Created by Administrator on 2016/5/5.
*
* 手写绘图板
*/
public class DrawingboardSurface extends SurfaceView implements SurfaceHolder.Callback{
PointF cur = new PointF();
PointF old = new PointF();
Path path = new Path();
Paint paint;
Canvas bmpCanvas;
double MIN_DELTA = 3;
SurfaceHolder holder;
Bitmap bitmap;
boolean isStop = false;
public DrawingboardSurface(Context context) {
super(context);
init();
}
public DrawingboardSurface(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public DrawingboardSurface(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init(){
holder = getHolder();
holder.addCallback(this);
paint = new Paint();
paint.setColor(Color.parseColor("#000000"));
paint.setStyle(Paint.Style.STROKE);//必须设置
paint.setStrokeWidth(12);
paint.setAntiAlias(true);
}
/**重置
* */
public void reset(){
if(bmpCanvas != null){
bmpCanvas.drawColor(Color.WHITE);
}
path.reset();
invalidate();
}
public Bitmap getSign(){
return null;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
cur.set(event.getX(), event.getY());//获取当前坐标
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
old.set(event.getX(), event.getY());
path.reset();
path.moveTo(old.x, old.y);
copyToBp();
break;
case MotionEvent.ACTION_MOVE:
if (Math.abs(old.x-cur.x) < MIN_DELTA || Math.abs(old.y-cur.y) < MIN_DELTA){
path.quadTo(old.x, old.y, (cur.x+old.x)/2, (cur.y+old.y)/2);
}else{
path.lineTo(cur.x,cur.y);
}
old = cur;
copyToBp();
break;
case MotionEvent.ACTION_UP:
path.lineTo(cur.x,cur.y);
copyToBp();
path.reset();
break;
case MotionEvent.ACTION_CANCEL:
path.lineTo(cur.x,cur.y);
copyToBp();
path.reset();
break;
}
invalidate();
return true;
}
/**复制到绘图底版上
* */
private void copyToBp(){
bmpCanvas.drawPath(path, paint);
}
/**初始化绘图资源,启动线程
* */
@Override
public void surfaceCreated(SurfaceHolder holder) {
if (bitmap == null){
bitmap = Bitmap.createBitmap(getWidth(),getHeight(), Bitmap.Config.RGB_565);
}
bmpCanvas = new Canvas(bitmap);
bmpCanvas.drawColor(Color.WHITE);
new Thread(new DrawRunnable()).start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
/**停止线程,回收资源
* */
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
isStop = true;
if (bitmap != null){
bitmap.recycle();
bitmap = null;
}
}
/**绘图线程,
* */
class DrawRunnable implements Runnable{
@Override
public void run() {
long now = 0;
long elapse = 50;
now = System.currentTimeMillis();
try {
while (!isStop) {
if (System.currentTimeMillis() - now < elapse) {
continue;
}
Canvas canvas = holder.lockCanvas(null);
canvas.drawBitmap(bitmap, 0, 0, paint);
holder.unlockCanvasAndPost(canvas);
}
}catch (Exception e){//捕获可能因资源已回收导致的异常行为
e.printStackTrace();
}
}
}
}
绘图板 手写板
最新推荐文章于 2021-09-09 10:01:04 发布