金融类APP-手写签名ADD盖章功能实现

本文介绍了金融行业APP开发中手写签名及加盖公章功能的实现过程。通过自定义View监听用户触摸事件,利用贝塞尔曲线绘制平滑线条,并在绘制完成后保存为图片。最后展示了功能的运行效果和相关代码。
摘要由CSDN通过智能技术生成

前言:

之前换工作的时候,发现从事金融行业APP开发比较赚钱,为了钱,最近一直在学习,换工作之前在银行工作,虽然也算是金融行业但是却没有证券行业等的收益高,但在银行业务开发中金融行业也能够使用的其中之一就是,手写签名+公章功能的实现。

原理:

从业务逻辑上来说,就是我们提供一个可绘制的面板,让用户可以绘制,绘制完成后,进行写入文件保存或者加盖公章合成图片,然后上传后台,这里图片压缩处理逻辑省略。

绘制面板原理:

绘制面板自定义view的原理:在view中用监听OnTouch()事件,这里我把手当做鼠标来看,我们需要判断鼠标的抬起移动按下操作
1)没有绘制:没有进入OnTouch()监听,也就是鼠标[手]没有接触自定义view
2)什么时候绘制:
【1】手指点下屏幕时调用,使用画笔绘制起点
【2】手指在屏幕上滑动时调用,会记录之前和现在手势的位置,进行绘制,如果,之前位置和手势的位置相差大于3的时候,生成贝塞尔绘制曲线,为了看起来线条流畅,一般,贝塞尔曲线的操作点为起点和终点的一半,二次贝塞尔,实现平滑曲线;手势x, 手势Y为操作点,之前,贝塞尔曲线的操作点为起点和终点的一半xy为终点,我相信很多亲看到的算法都和小编说的一样哈。
【3】手指在屏幕上抬起的时候,绘制【2】操作得到的画笔中的内容
3)至于图片保存,就是比较常见的也是比较基础的bitmap or other object 写入File,可选择自己擅长的样式

绘制面板自定义view代码:

write_panel_layout.xml
代码如下:
package com.electronic.signature.view;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.support.annotation.ColorInt;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

/**
 * 绘制Path的View 用于签名
 *
 * @author fuqinming
 */
@SuppressLint("ClickableViewAccessibility")
public class LinePathView extends View {
   
    //标签
    private static final String TAG = LinePathView.class.getSimpleName();
    //activity对象
    private Context mContext;
    //笔画X坐标起点
    private float mX;
    //笔画Y坐标起点
    private float mY;
    //绘制画笔
    private final Paint mGesturePaint = new Paint();
    //保存路径
    private final Path mPath = new Path();
    //背景画布
    private Canvas cacheCanvas;
    //背景Bitmap缓存
    private Bitmap cachebBitmap;
    //是否已经手绘签名
    private boolean isTouched = false;
    //画笔粗细[画笔宽度]
    private int mPaintWidth = 10;
    //画笔颜色[前景色]
    private int mPenColor = Color.BLACK;
    //背景色[背景色]
    private int mBackColor = Color.TRANSPARENT;

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

    public LinePathView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public LinePathView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
    }

    public void init(Context context) {
        this.mContext = context;
        mGesturePaint.setAntiAlias(true);
        mGesturePaint.setStyle(Style.STROKE);
        mGesturePaint.setStrokeWidth(mPaintWidth);
        mGesturePaint.setColor(mPenColor);
    }


    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        cachebBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Config.ARGB_8888);
        cacheCanvas = new Canvas(cachebBitmap);
        cacheCanvas.drawColor(mBackColor);
        isTouched = false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                touchDown(event);
                break;
            case MotionEvent.ACTION_MOVE:
                isTouched = true;
                touchMove(event);
                break;
            case MotionEvent.ACTION_UP:
                cacheCanvas.drawPath(mPath, mGesturePaint);
                mPath.reset();
          
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值