今天小编给大家分享一下Android怎么实现手写板功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
具体代码如下:
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 { private int beierThreshold = 4; private float x = 0; private float y = 0; private Paint mPaint; private int strokeWidth = 10; 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); }}
以上就是“Android怎么实现手写板功能”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。