Android实现手写板功能

本文实例为大家分享了android实现手写板功能的具体代码,供大家参考,具体内容如下

自定义个一个手写板的重点:

笔画为一次down-move-up的集合

撤销笔画并非一次path的动作撤销 应该也是一次down-move -up的撤销

为了更好的笔画需要使用贝塞尔曲线来完成

效果如下:

截图中清楚 的意思是清除 !

具体代码如下:

package com.kyli.base.view;
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 androidx.annotation.nullable;
import java.util.arraylist;
import java.util.list;
/**
 * 绘制画板
 */
public class signboradview extends view {
    /*4个像素点*/
    private int beierthreshold = 4;
    private float x = 0;
    private float y = 0;
    /*画笔*/
    private paint mpaint;
    /*宽度*/
    private int strokewidth = 10;
    /*yanbse*/
    private int color = color.black;
    /*当前笔画*/
    private path path;
    private int state = state.clear;
    private interface state {
        /*画板可以使用了*/
        int start = 0;
        /*停止使用画板*/
        int stop = 1;
        /*清空画板*/
        int clear = 2;
    }
    private list<everypenpath> everypenpaths = new arraylist<>();
    /*每一个笔画*/
    private static class everypenpath {
        public path path;
    }
    public signboradview(context context) {
        super(context);
    }
    public signboradview(context context, @nullable attributeset attrs) {
        super(context, attrs);
    }
    public signboradview(context context, @nullable attributeset attrs, int defstyleattr) {
        super(context, attrs, defstyleattr);
    }
    private void initpaint() {
        if (mpaint == null) {
            mpaint = new paint();
            mpaint.setstrokewidth(strokewidth);
            mpaint.setcolor(color);
            mpaint.setstyle(paint.style.stroke);
            mpaint.setantialias(true);
            mpaint.setflags(paint.anti_alias_flag);
        }
    }
    public void start() {
        state = state.start;
        initpaint();
    }
    /*停止使用*/
    public void stop() {
        state = state.stop;
    }
    /*清空画板*/
    public void clear() {
        state = state.clear;
        for (int i = everypenpaths.size() - 1; i >= 0; i--) {
            everypenpath everypenpath = everypenpaths.get(i);
            everypenpath.path.reset();
            everypenpath.path.close();
            everypenpath.path = null;
        }
        everypenpaths.clear();
        invalidate();
    }
    public void back() {
        int count = everypenpaths.size();
        if (count < 1)
            return;
        everypenpath everypenpath = everypenpaths.get(count - 1);
        everypenpath.path.reset();
        everypenpath.path.close();
        everypenpath.path = null;
        everypenpaths.remove(count - 1);
        invalidate();
    }
    @override
    protected void ondraw(canvas canvas) {
        super.ondraw(canvas);
        if (state == state.start) {
            /*先绘制完整笔画*/
            for (everypenpath e : everypenpaths) {
                canvas.drawpath(e.path, mpaint);
            }
            //当前进行中的  path!=null
            if (path != null) {
                canvas.drawpath(path, mpaint);
            }
        }
    }
    @override
    public boolean ontouchevent(motionevent event) {
        if (state == state.start) {
            if (event.getaction() == motionevent.action_up) {
                actionup(event);
                invalidate();
                return true;
            }
            if (event.getaction() == motionevent.action_move) {
                actionmove(event);
                invalidate();
                return true;
            }
            if (event.getaction() == motionevent.action_down) {
                actiondown(event);
                invalidate();
                return true;
            }
        }
        return super.ontouchevent(event);
    }
    private void actionup(motionevent event) {
        actionmove(event);
        /*构成一个笔画*/
        everypenpath everypenpath = new everypenpath();
        everypenpath.path = path;
        everypenpaths.add(everypenpath);
        //将当前画笔置位null;
        path = null;
    }
    /**/
    private void actionmove(motionevent event) {
        /*每次移动去绘制贝塞尔曲线*/
        float cx = event.getx();
        float cy = event.gety();
        float dx = math.abs(cx - x);//变化量
        float dy = math.abs(cy - y);
        if (dx >= beierthreshold || dy >= beierthreshold) {
            float rx = x + (cx - x) / 2;
            float ry = y + (cy - y) / 2;
            path.quadto(rx, ry, cx, cy);
            //下次的x 域y 将重新计算
            x = cx;
            y = cy;
        }
    }
    /*开始时*/
    private void actiondown(motionevent event) {
        path = new path();
        x = event.getx();
        y = event.gety();
        path.moveto(x, y);
    }
    public void setbeierthreshold(int beierthreshold) {
        this.beierthreshold = beierthreshold;
    }
    public void setstrokewidth(int strokewidth) {
        this.strokewidth = strokewidth;
    }
    public void setcolor(int color) {
        this.color = color;
    }
    public bitmap getresult(int bgcolor) {
        if (everypenpaths.size() == 0)
            return null;
        bitmap bitmap = bitmap.createbitmap(getwidth(), getheight(), bitmap.config.argb_8888);
        canvas canvas = new canvas(bitmap);
        canvas.drawcolor(bgcolor);
        for (int i = 0; i < everypenpaths.size(); i++) {
            if (mpaint == null) {
                initpaint();
            }
            canvas.drawpath(everypenpaths.get(i).path, mpaint);
        }
        return bitmap;
    }
    public bitmap getresult() {
        return getresult(color.white);
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

(0)
上一篇 2022年7月1日
下一篇 2022年7月1日

相关推荐