android 简单实现手写签名功能

代码简单,就不发demo了,直接贴代码

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: 签名类
 * 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);
    });
  }

  /**
   * 自定义签名控件
   */
  class SignatureView extends View {

    //画笔
    private Paint paint;

    //画布
    private Canvas cacheCanvas;

    //位图
    private Bitmap cachebBitmap;

    //图片保存路径
    private Path path;

    //位图缓存
    public Bitmap getCachebBitmap() {
      return cachebBitmap;
    }

    public SignatureView(Context context) {
      super(context);
      init();
    }

    /**
     * 初始化
     */
    private void init() {
      //设置画笔
      paint = new Paint();
      paint.setAntiAlias(true);
      paint.setStrokeWidth(3);
      paint.setStyle(Paint.Style.STROKE);
      paint.setColor(Color.BLACK);
      path = new Path();

      //创建位图
      cachebBitmap = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888);

      //用自定义位图构建画布
      cacheCanvas = new Canvas(cachebBitmap);
      //设置画布为白色
      cacheCanvas.drawColor(Color.WHITE);
    }

    /**
     * 清除画板,重置画笔
     */
    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;
    }
  }
}

 

 

布局文件:

<?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="确定"
        />
    <Button
        android:id="@+id/btn_clear"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="清除"
        />
  </LinearLayout>
</LinearLayout>
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值