Implementation of Handwritten Signature by android

  • 2021-11-13 18:26:26
  • OfStack

In this paper, we share the specific code of android handwritten signature display for your reference. The specific contents are as follows

If the code is simple, you will not send demo, and paste the code directly


package com.xx;
 
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.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import com.xx.R;
 
/**
 * Description:  Signature class 
 * Copyright:  Copyright (c)2018
 * Company:   
 * author:   Corwin
 * version:   1.0
 * date:    2018/9/5 18:32
 * Modification History:
 * Date     Author   Version   Description
 * ------------------------------------------------------------------
 * 2018/9/5  Corwin   1.0     1.0 Version
 */
public class SignatureActivity extends AppCompatActivity {
 
 private ImageView imageSign;
 private SignatureView mView;
 
 @Override public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_signature);
 
  imageSign = findViewById(R.id.iv_sign);
  FrameLayout frameLayout = findViewById(R.id.fl_view);
 
  mView = new SignatureView(this);
  frameLayout.addView(mView);
  mView.requestFocus();
 
  Button btnClear = findViewById(R.id.btn_clear);
  btnClear.setOnClickListener((v) -> {
    mView.clear();
  });
 
  Button btnOk = findViewById(R.id.btn_ok);
  btnOk.setOnClickListener((v) -> {
    Bitmap imageBitmap = mView.getCachebBitmap();
    imageSign.setImageBitmap(imageBitmap);
  });
 }
 
 /**
  *  Custom Signature Control 
  */
 class SignatureView extends View {
 
  // Paintbrush 
  private Paint paint;
 
  // Canvas 
  private Canvas cacheCanvas;
 
  // Bitmap 
  private Bitmap cachebBitmap;
 
  // Picture save path 
  private Path path;
 
  // Bitmap cache 
  public Bitmap getCachebBitmap() {
   return cachebBitmap;
  }
 
  public SignatureView(Context context) {
   super(context);
   init();
  }
 
  /**
   *  Initialization 
   */
  private void init() {
   // Set brush 
   paint = new Paint();
   paint.setAntiAlias(true);
   paint.setStrokeWidth(3);
   paint.setStyle(Paint.Style.STROKE);
   paint.setColor(Color.BLACK);
   path = new Path();
 
   // Create a bitmap 
   cachebBitmap = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888);
 
   // Build canvas with custom bitmap 
   cacheCanvas = new Canvas(cachebBitmap);
   // Set the canvas to white 
   cacheCanvas.drawColor(Color.WHITE);
  }
 
  /**
   *  Clear the drawing board and reset the brush 
   */
  public void clear() {
   if (cacheCanvas != null) {
    paint.setColor(Color.WHITE);
    cacheCanvas.drawPaint(paint);
    paint.setColor(Color.BLACK);
    cacheCanvas.drawColor(Color.WHITE);
    invalidate();
   }
  }
 
  @Override protected void onDraw(Canvas canvas) {
   canvas.drawBitmap(cachebBitmap, 0, 0, null);
   canvas.drawPath(path, paint);
  }
 
  @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) {
 
   int curW = cachebBitmap != null ? cachebBitmap.getWidth() : 0;
   int curH = cachebBitmap != null ? cachebBitmap.getHeight() : 0;
   if (curW >= w && curH >= h) {
    return;
   }
 
   if (curW < w) curW = w;
   if (curH < h) curH = h;
   Bitmap newBitmap = Bitmap.createBitmap(curW, curH, Bitmap.Config.ARGB_8888);
   Canvas newCanvas = new Canvas();
   newCanvas.setBitmap(newBitmap);
   if (cachebBitmap != null) {
    newCanvas.drawBitmap(cachebBitmap, 0, 0, null);
   }
   cachebBitmap = newBitmap;
   cacheCanvas = newCanvas;
  }
  private float cur_x, cur_y;
  @Override public boolean onTouchEvent(MotionEvent event) {
   float x = event.getX();
   float y = event.getY();
   switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN: {
     cur_x = x;
     cur_y = y;
     path.moveTo(cur_x, cur_y);
     break;
    }
    case MotionEvent.ACTION_MOVE: {
     path.quadTo(cur_x, cur_y, x, y);
     cur_x = x;
     cur_y = y;
     break;
    }
    case MotionEvent.ACTION_UP: {
     cacheCanvas.drawPath(path, paint);
     path.reset();
     break;
    }
   }
   invalidate();
   return true;
  }
 }
}

Layout file:


<?xml version="1.0"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical"
  >
 <ImageView
   android:id="@+id/iv_sign"
   android:layout_width="match_parent"
   android:layout_height="0dp"
   android:layout_gravity="center"
   android:layout_marginBottom="3dp"
   android:layout_weight="1"
   android:background="@color/white"
   />
 <FrameLayout
   android:id="@+id/fl_view"
   android:layout_width="match_parent"
   android:layout_height="0dp"
   android:layout_weight="1"
   android:background="@color/white"
   />
 <LinearLayout
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:background="@android:drawable/bottom_bar"
   android:paddingTop="3dp"
   >
  <Button
    android:id="@+id/btn_ok"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:text=" Determine "
    />
  <Button
    android:id="@+id/btn_clear"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:text=" Clear "
    />
 </LinearLayout>
</LinearLayout>

Related articles: