随笔 - 657,  文章 - 0,  评论 - 116,  阅读 - 153万

场景

实现手写签名并获取签名照片

 

 

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

1、新建空白项目,修改其页面布局

 

 

2、布局文件activity_main.xml代码

复制代码
<?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="#FFFFFF" />

    <FrameLayout
        android:id="@+id/fl_view"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:background="@color/teal_200" />
    <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>
复制代码

 

3、修改MainActivity代码

复制代码
package com.badao.handwrittensignature;

import androidx.appcompat.app.AppCompatActivity;
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.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.Toast;


public class MainActivity extends AppCompatActivity {

    private ImageView imageSign;
    private SignatureView mView;

    @Override public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        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 Path getPath() {
            return 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.BLUE);
                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;
        }
    }
}
复制代码

 

posted on   霸道流氓  阅读(1052)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示