Android电子签名

项目需要所以进行研究,本人自定义view刚起步,不对的地方请轻喷。先看效果图:这里写图片描述
实现过程:
1、继承view,构造方法中进行初始化paint及path

    public ElectronicSign(Context context) {
        super(context);
        init();
    }
public ElectronicSign(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    init();
}

public ElectronicSign(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init();
}

private void init() {
    gesturePaint = new Paint();
    gesturePaint.setAntiAlias(true);
    gesturePaint.setStyle(Paint.Style.STROKE);
    gesturePaint.setStrokeWidth(defaultPaintWidth);
    gesturePaint.setColor(Color.BLACK);
    gesturePath = new Path();
}  

2、目的就是记录为了手写的轨迹,所以要监听touch事件的按下和移动事件

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            touchDown(event);
            break;
        case MotionEvent.ACTION_MOVE:
            touchMove(event);
            break;
    }
    return true;
}

在手指按下的时候记录按下的坐标,将path移动到该坐标作为起始坐标

private void touchDown(MotionEvent event) {
    startX = event.getX();
    startY = event.getY();
    gesturePath.moveTo(startX, startY);
}

在手指移动的时候则获取移动到的坐标,然后根据path的quadTo得到平滑的贝赛尔曲线,记录此时的坐标作为下次的起始坐标

private void touchMove(MotionEvent event) {
        float x = event.getX();
        float y = event.getY();
        if (Math.abs(x - startX) > 10 || Math.abs(y - startY) > 10) {//降低功耗
            float controalX = (x + startX) / 2;
            float controalY = (y + startY) / 2;
            gesturePath.quadTo(startX, startY, controalX, controalY);
            startX = x;
            startY = y;
            invalidate();
        }
    }

其中if (Math.abs(x - startX) > 10 || Math.abs(y - startY) > 10) 判断主要是为了降低功耗,如果手指移动的距离太小,那么就不生成贝赛尔曲线,也不进行重绘,此处数值可自行调整也可不进行判断
调用了invalidate()后便会清除自定义view中ui显示的内容,然后调用onDraw()

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawPath(gesturePath, gesturePaint);
    }

onDraw()中很简单,就是在画布中用画笔将path经过的路径绘制出来,此时界面上就会显示刚手写的部分了。核心部分完成了,那么将手写的部分保存成一张图片就可以了。

public Bitmap save() {
        Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);//会将canvas上绘制的内容保存到bitmap中
        canvas.drawPath(gesturePath, gesturePaint);
        return bitmap;
    }

先生成一张空的bitmap,然后new出一个新的canvas对象,将bitmap作为构造参数传入,那么在canvas上绘制成任何内容都会保存到bitmap对象当中,此时只要在该canvas上通过drawPath用刚才手势移动所用的path绘制一遍就可以了,绘制的内容也就保存到bitmap对象了。得到该bitmap对象便可以进行显示或者通过io流作为图片保存到sd上了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值