安卓自定義手寫簽字介面~~~SignatureView
阿新 • • 發佈:2020-12-22
不整虛的,直接上程式碼
public class SignatureView extends View {
private Context context;
//X軸起點
private float x;
//Y軸起點
private float y;
//畫筆
private final Paint paint = new Paint();
//路徑
private final Path path = new Path();
//畫布
private Canvas canvas;
//生成的圖片
private Bitmap bitmap;
//畫筆的寬度
private int paintWidth = 10;
//簽名顏色
private int paintColor = Color.BLACK;
//背景顏色
private int backgroundColor = Color.WHITE;
//是否已經簽名
private boolean isTouched = false;
//簽名開始與結束
public interface Touch {
void OnTouch(boolean isTouch);
}
private Touch touch;
public SignatureView(Context context) {
super(context);
init(context);
}
public SignatureView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init(context);
}
public SignatureView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context) {
this.context = context;
//抗鋸齒
paint.setAntiAlias(true);
//樣式
paint.setStyle(Paint.Style.STROKE);
//畫筆顏色
paint.setColor(paintColor);
//畫筆寬度
paint.setStrokeWidth(paintWidth);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
//創建於view大小一致的bitmap
bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
canvas = new Canvas(bitmap);
canvas.drawColor(backgroundColor);
isTouched = false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (touch != null) touch.OnTouch(true);
switch (event.getAction()) {
//手指按下
case MotionEvent.ACTION_DOWN:
touchDwon(event);
break;
//手指移動
case MotionEvent.ACTION_MOVE:
isTouched = true;
if (touch != null) touch.OnTouch(false);
touchMove(event);
break;
//手指抬起
case MotionEvent.ACTION_UP:
canvas.drawPath(path, paint);
path.reset();
break;
}
// 更新繪製
invalidate();
return true;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//畫此次筆畫之前的簽名
canvas.drawBitmap(bitmap, 0, 0, paint);
// 通過畫布繪製多點形成的圖形
canvas.drawPath(path, paint);
}
//手指按下的方法
private void touchDwon(MotionEvent event) {
//重置繪製路徑
path.reset();
float downX = event.getX();
float downY = event.getY();
x = downX;
y = downY;
//繪製起點
path.moveTo(downX, downY);
}
//手指滑動的方法
private void touchMove(MotionEvent event) {
//當前的x,y座標點
final float moveX = event.getX();
final float moveY = event.getY();
//之前的x,y座標點
final float previousX = x;
final float previousY = y;
//獲取絕對值
final float dx = Math.abs(moveX - previousX);
final float dy = Math.abs(moveY - previousY);
if (dx >= 3 || dy >= 3) {
float cX = (moveX + previousX) / 2;
float cY = (moveY + previousY) / 2;
path.quadTo(previousX, previousY, cX, cY);
x = moveX;
y = moveY;
}
}
/**
* 設定畫筆顏色
*
* @param paintColor
*/
public void setPaintColor(int paintColor) {
this.paintColor = paintColor;
paint.setColor(paintColor);
}
/**
* 設定畫筆寬度
*
* @param paintWidth
*/
public void setPaintWidth(int paintWidth) {
this.paintWidth = paintWidth;
paint.setStrokeWidth(paintWidth);
}
/**
* 設定畫板顏色
*
* @param canvasColor
*/
public void setCanvasColor(int canvasColor) {
this.backgroundColor = canvasColor;
}
/**
* 清除畫板
*/
public void clear() {
if (canvas != null) {
isTouched = false;
//更新畫板
paint.setColor(paintColor);
paint.setStrokeWidth(paintWidth);
canvas.drawColor(backgroundColor, PorterDuff.Mode.CLEAR);
invalidate();
}
}
/**
* 獲取畫板的Bitmap
*
* @return
*/
public Bitmap getBitmap() {
setDrawingCacheEnabled(true);
buildDrawingCache();
Bitmap bitmap = getDrawingCache();
setDrawingCacheEnabled(false);
return bitmap;
}
/**
* 是否有簽名
*
* @return
*/
public Boolean getSigstatus() {
return isTouched;
}
/**
* 儲存畫板
*
* @param path 儲存到路徑
*/
@SuppressLint("WrongThread")
public Boolean save(String path) throws IOException {
Bitmap bitmap = this.bitmap;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos);
byte[] buffer = bos.toByteArray();
if (buffer != null) {
File file = new File(path);
if (file.exists()) {
file.delete();
}
OutputStream outputStream = new FileOutputStream(file);
outputStream.write(buffer);
outputStream.close();
return true;
} else {
return false;
}
}
public Bitmap returnBitmap() {
return this.bitmap;
}
}
效果圖