本文实例为大家分享了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); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。