Android实现手写板和涂鸦功能

article/2025/7/2 4:03:56

下面仿一个Android手写板和涂鸦的功能,直接上代码:

write_pad.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:greendroid="http://schemas.android.com/apk/res/com.cyrilmottier.android.gdcatalog"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" ><FrameLayoutandroid:id="@+id/tablet_view"android:layout_width="fill_parent"android:layout_height="300dp" ></FrameLayout><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:background="@android:drawable/bottom_bar"android:paddingTop="4dp" ><Buttonandroid:id="@+id/write_pad_ok"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="确定" /><Buttonandroid:id="@+id/write_pad_clear"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="清除" /><Buttonandroid:id="@+id/write_pad_cancel"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="取消" /></LinearLayout></LinearLayout>

这个是手写板的主要布局文件,能够手写的部分是一个FrameLayout。下面有确定、清除和取消按钮,用来保存和擦除签名。

主要代码逻辑如下:

MainActivity.java

package com.jackie.handwriting;import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.TextView;public class MainActivity extends Activity {private ImageView mIVSign;private TextView mTVSign;private Bitmap mSignBitmap;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mIVSign = (ImageView) findViewById(R.id.iv_sign);mTVSign = (TextView) findViewById(R.id.tv_sign);mTVSign.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View view) {WritePadDialog mWritePadDialog = new WritePadDialog(MainActivity.this, new WriteDialogListener() {@Overridepublic void onPaintDone(Object object) {mSignBitmap = (Bitmap) object;createSignFile();mIVSign.setImageBitmap(mSignBitmap);mTVSign.setVisibility(View.GONE);}});mWritePadDialog.show();}});}//创建签名文件private void createSignFile() {ByteArrayOutputStream baos = null;FileOutputStream fos = null;String path = null;  File file = null;try {  path = Environment.getExternalStorageDirectory() + File.separator + System.currentTimeMillis() + ".jpg"; file = new File(path);fos = new FileOutputStream(file);baos = new ByteArrayOutputStream();//如果设置成Bitmap.compress(CompressFormat.JPEG, 100, fos) 图片的背景都是黑色的mSignBitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);  byte[] b = baos.toByteArray();  if (b != null) {  fos.write(b); }  } catch (IOException e) {  e.printStackTrace();  } finally {  try {  if (fos != null) {fos.close();}if (baos != null) {baos.close();}} catch (IOException e) {  e.printStackTrace();  }  }  }
}

PaintView.java

package com.jackie.handwriting;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.view.MotionEvent;
import android.view.View;public class PaintView extends View {private Paint mPaint;private Path mPath;private Bitmap mBitmap;private Canvas mCanvas;private int screenWidth, screenHeight;private float currentX, currentY;public PaintView(Context context, int screenWidth, int screenHeight) {super(context);this.screenWidth = screenWidth;this.screenHeight = screenHeight;init();}private void init() {mPaint = new Paint();mPaint.setAntiAlias(true); // 去除锯齿mPaint.setStrokeWidth(5);mPaint.setStyle(Paint.Style.STROKE);mPaint.setColor(Color.BLACK);mPath = new Path();mBitmap = Bitmap.createBitmap(screenWidth, screenHeight, Config.ARGB_8888);mCanvas = new Canvas(mBitmap);
//		mCanvas.drawColor(Color.WHITE);}@Overrideprotected void onDraw(Canvas canvas) {canvas.drawBitmap(mBitmap, 0, 0, null);canvas.drawPath(mPath, mPaint);}@Overridepublic boolean onTouchEvent(MotionEvent event) {float x = event.getX();float y = event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:currentX = x;currentY = y;mPath.moveTo(currentX, currentY);break;case MotionEvent.ACTION_MOVE:currentX = x;currentY = y;mPath.quadTo(currentX, currentY, x, y); // 画线break;case MotionEvent.ACTION_UP:mCanvas.drawPath(mPath, mPaint);break;}invalidate();return true;}public Bitmap getPaintBitmap() {return resizeImage(mBitmap, 320, 480);}public Path getPath() {return mPath;}// 缩放public static Bitmap resizeImage(Bitmap bitmap, int width, int height) {int originWidth = bitmap.getWidth();int originHeight = bitmap.getHeight();float scaleWidth = ((float) width) / originWidth;float scaleHeight = ((float) height) / originHeight;Matrix matrix = new Matrix();matrix.postScale(scaleWidth, scaleHeight);Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, originWidth,originHeight, matrix, true);return resizedBitmap;}//清除画板public void clear() {if (mCanvas != null) {mPath.reset();mCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);invalidate();}}
}

WritePadDialog.java

package com.jackie.handwriting;import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.Toast;public class WritePadDialog extends Dialog {private Context mContext;private WriteDialogListener mWriteDialogListener;private PaintView mPaintView;private FrameLayout mFrameLayout;private Button mBtnOK, mBtnClear, mBtnCancel;public WritePadDialog(Context context,WriteDialogListener writeDialogListener) {super(context);this.mContext = context;this.mWriteDialogListener = writeDialogListener;}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE); //无标题setContentView(R.layout.write_pad);mFrameLayout = (FrameLayout) findViewById(R.id.tablet_view);// 获取屏幕尺寸DisplayMetrics mDisplayMetrics = new DisplayMetrics();getWindow().getWindowManager().getDefaultDisplay().getMetrics(mDisplayMetrics);int screenWidth = mDisplayMetrics.widthPixels;int screenHeight = mDisplayMetrics.heightPixels;mPaintView = new PaintView(mContext, screenWidth, screenHeight);mFrameLayout.addView(mPaintView);mPaintView.requestFocus();mBtnOK = (Button) findViewById(R.id.write_pad_ok);mBtnOK.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (mPaintView.getPath().isEmpty()) {Toast.makeText(mContext, "请写下你的大名", Toast.LENGTH_SHORT).show();return;}mWriteDialogListener.onPaintDone(mPaintView.getPaintBitmap());dismiss();}});mBtnClear = (Button) findViewById(R.id.write_pad_clear);mBtnClear.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mPaintView.clear();}});mBtnCancel = (Button) findViewById(R.id.write_pad_cancel);mBtnCancel.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {cancel();}});}
}

WriteDilogListener.java

package com.jackie.handwriting;/*** 监听手写板对话框* @author chengcj1* */
public interface WriteDialogListener {public void onPaintDone(Object object);
}

效果如下:







http://chatgpt.dhexx.cn/article/GTW10EUr.shtml

相关文章

电子签名软件有哪些?10大电子签名平台盘点

目录 一、电子签名软件有哪些 1.e签宝&#xff1a;国内签名领域老大哥 2.上上签&#xff1a;开创SaaS电子签极简模式 3.法大大&#xff1a;数智化签约管理平台 4.数字认证&#xff1a;中国电子认证第一股 5.契约锁&#xff1a;主攻中大型客户无缝集成各类系统 6.安心签&…

Android 电子签名

完成一个小功能。 参考&#xff1a;https://www.jianshu.com/p/c4f017603413 主要的绘制的代码来自于上面的dalao&#xff0c;效果还不错。 看起来笔迹还是挺柔顺的。 一开始&#xff0c;在画图以后不知道怎么把笔迹保存下来&#xff0c;View中的onDraw方法中自带canvas&…

Android 电子签名,手写签名案列实现方法,并上传网页显示(base64)!

最近说项目可能会用到一个电子签名&#xff0c;不需要识别的那种&#xff0c;只是一个单纯手写签名&#xff0c;然后以base64的格式提供给前端web页面。其实挺简单的&#xff0c;自定义一个手写view就上线了。Android 电子签名&#xff0c;手写签名案列实现方法&#xff01; 先…

vue中用canvas实现移动端手写板、电子签名功能

html部分&#xff1a; js部分&#xff1a; css部分&#xff1a;

web前端 原生js签名板(电子签名)写字板 canvas 截图

移动端在开发的时候&#xff0c;可能会涉及到手写签名(电子签名)那些&#xff0c;在前端的思路是使用canvas 来签名&#xff0c;导出成图片进行保存。 仅供参考和学习。 vue版本: https://blog.csdn.net/qq_33270001/article/details/102855964 注意:在移动端使用的时候, 写…

手写板签字php,手写板,签字版

1.建一个view .h文件复制以下代码 /** * 画布 */ interface SKGraphicView : UIView { CGPoint _start; CGPoint _move; CGMutablePathRef _path; NSMutableArray *_pathArray; CGFloat _lineWidth; UIColor *_color; } property (nonatomic,assign)CGFloat lineWidth;/**<…

前端手写电子签名板实现方案

前端手写电子签名板实现 作者&#xff1a; 很菜的小白在分享 时间&#xff1a;2022年12月29日 介绍 什么是电子签名 电子签名是指数据电文中以电子形式所含、所附用于识别签名人身份并表明签名人认可其中内容的数据。—— 百度百科 通俗点说其实就是通过在电子设备上进行类似纸…

sign-canvas 一个基于canvas开发,封装于Vue组件的通用手写签名板(电子签名板),支持pc端和移动端;

写在前面 : 在项目的开发过程中可能会涉及到手写签名(电子签名)那些&#xff0c;在前端的思路是使用canvas 来签名&#xff0c;导出成图片进行保存。 此轮子是继 https://blog.csdn.net/qq_33270001/article/details/81809535之后,用于vue项目中,为了方便自己与众人和复用而开…

无纸化手写电子签名是现今不可或缺的技术

说到手写电子签名&#xff0c;相信不少人都有所耳闻。在21世纪的今天&#xff0c;移动信息时代&#xff0c;在国家政策指引与倡导下&#xff0c;“无纸化”已成为一种趋势&#xff0c;手写电子签名技术正快速在各行各业推行&#xff0c;不仅节约了纸张资源&#xff0c;助力环境…

VB.net调用蒙恬Write2Go笔迹手写板进行电子签名

最近的项目需要用到手写电子签名的功能,挑来挑去最后选择了蒙恬Write2Go这款手写板设备,因为手写板上面直接就有一块电子油墨显示屏,所写即所得,还可以看到写的笔迹 安装完蒙恬的驱动及自带应用程序之后,经过测试发现,其工作原理是利用了windows剪切板作为中间桥梁来交换图片数…

uni-app - 电子签字板组件(签名专用写字画板,支持调整写字板 “横纵“ 方向,可调整线条粗细颜色等,Canvas 绘制非常丝滑流畅)完美兼容 H5 APP 小程序,最好用的画板签字教程插件源码

前言 网上的教程代码非常乱且都有 BUG 存在,非常难移植到自己的项目中,本文代码干净整洁注释详细。 本文实现了 全端兼容,签名专用的写字板组件,真机流畅丝滑且无 BUG, 您直接复制组件源码,按照详细示例+超详细的注释轻松几分钟完成, 如下图 真机测试,您还可以通过组件…

H5手写板电子签名开发

如图所示:前端实现H5canvas手写板电子签名:<!DOCTYPE html> <html lang"en"><head><meta charset"utf-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0, maximum-scale1.0, user-scala…

uniapp - 实现微信小程序电子签名板,横屏手写姓名签名专用写字画板(详细运行示例,一键复制开箱即用)

效果图 实现了在uniapp项目中,微信小程序平台流畅的写字签名板(也可以绘图)功能源码,复制粘贴,改改样式几分钟即可搞定! 支持自动横屏、持预览,真机运行测试非常流畅不卡顿。 基础模板 如下代码所示。 <template><view class=

Vue Canvas 实现电子签名 手写板

直接上代码 <template><section class"signature"><div class"signatureBox"><div class"canvasBox" ref"canvasHW"><canvas ref"canvasF" touchstarttouchStart touchmovetouchMove touchendt…

锁---一些锁学习

1、java锁之公平锁和非公平锁 公平锁 是指多个线程按照申请的顺序来获取&#xff0c;类似排队打饭&#xff0c;先来后到。 非公平锁 是指多个线程获取锁的顺序并不是按照申请锁的顺序&#xff0c;有可能后申请的线程比先申请的线程优先获取锁&#xff0c;在高并发的情况下&a…

C# 实现锁屏

首先&#xff0c;将窗体的FormBorderStyle设置为none&#xff0c;WindowState设为Maximized 让窗体占据整个页面。 form窗体代码&#xff1a; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using …

win11中睡眠唤醒后如何禁止锁屏界面及登录界面

第一步禁止锁屏界面 gpedit.msc 不显示锁屏-》已启用 第二步&#xff1a;不显示登陆框 netplwiz 经过以上设置以后&#xff0c;打开笔记本就可以直接显示桌面了。

办公计算机锁屏方法,电脑快速锁屏,办公室神技能,再也不怕别人看我的电脑了!...

原标题&#xff1a;电脑快速锁屏&#xff0c;办公室神技能&#xff0c;再也不怕别人看我的电脑了&#xff01; 现在快节奏的社会&#xff0c;电脑的更方面性能与功能是非常之大&#xff0c;我们对电脑的使用频率也越来越高&#xff0c;可见它对我们生活越来越重要。在我们平时使…

Android锁屏的解锁(九个点),使用画的方式,大致的步骤

这篇博客是全部代码(没有解释,纯代码): https://blog.csdn.net/weixin_44614751/article/details/103101104 效果: 第一步:添加背景 第二步:创建九个点 先读取每一个点的图片: creatDot 创建九个点: initNin

ubuntu 18.04取消自动锁屏功能

有时候几分钟不用Ubuntu&#xff0c;系统就自动锁屏了&#xff0c;这是一种安全措施&#xff0c;防止别人趁你不在时使用你的系统。但对于大部分人而言&#xff0c;这是没有必要的&#xff0c;尤其是Ubuntu虚拟机&#xff0c;里面没啥重要的东西&#xff0c;每次锁屏后需要重新…