您好,登錄后才能下訂單哦!
今天小編給大家分享一下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 { /*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); } }
以上就是“Android怎么實現手寫板功能”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。