简单易懂 签字板

今天项目有需求弄一个签字板,看了网上很多大神做了很多优化操作(就搜到了几个类关联操作的,想着就简便实现),所以就自己写了一个简简单单自定义类 ,再次记录一下


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.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

import java.util.ArrayList;
import java.util.List;

public class SignPlateView extends View {

    private Paint mPaint;
    private Path mPath;
    private Bitmap mBitmap=null;
    private Canvas mCanvas;

    private List<Path> mPathList=new ArrayList<>();

    private float downX;
    private float downY;
    private int width;
    private int height;

    public SignPlateView(Context context) {
        this(context,null);
    }

    public SignPlateView(Context context, AttributeSet attrs) {
        this(context,attrs,0);
    }

    public SignPlateView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        for (Path mPath:mPathList){
            canvas.drawPath(mPath,mPaint);
        }

    }


    public Bitmap getBitmap() {
        if (mCanvas!=null){
            for (Path mPath:mPathList){
                mCanvas.drawPath(mPath,mPaint);
            }
        }
        return mBitmap;
    }



    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        width=w;
        height=h;
        mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        mCanvas=new Canvas(mBitmap);
    }

    private void init(){
        mPaint=new Paint();
        mPaint.setColor(Color.parseColor("#000000"));
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeWidth(5);
        mPaint.setAntiAlias(true);

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                downX=event.getX();
                downY=event.getY();
                mPath=new Path();
                mPath.moveTo(event.getX(),event.getY());
                mPathList.add(mPath);
            break;

            case MotionEvent.ACTION_MOVE:
                mPath.quadTo(downX,downY,(downX+event.getX())/2,(downY+event.getY())/2);
                downX=event.getX();
                downY=event.getY();
            break;

        }
        invalidate();
        return true;
    }


    public boolean checkIsWrite(){

        if (mBitmap==null){
            return false;
        }

        return true;
    }

//撤销
    public void revoke(){
        if (mPathList.size()>0){
            mPathList.remove(mPathList.size()-1);
            mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
            mCanvas=new Canvas(mBitmap);
            invalidate();
        }
    }

//清除
    public void clear(){
        mPathList.clear();
        mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        mCanvas=new Canvas(mBitmap);
        invalidate();
    }

    public void onDestroy() {
        mBitmap.recycle();
    }
}

亲测可用 !!!

点赞