这篇文章本来想在一个月前就发布的,最近一直忙于国家电网手持终端的应用开发,所以没抽出时间来写。周末到了,终于可以闲下来整理整理。话不多说,直奔主题。

Android 提供了很多丰富、实用而且很有特色的功能。比如,语音识别、手写签名等等。本篇就为你介绍如何在android上进行个性化的手写签名。

首先大致说说需求:这是一个追求时尚、张扬个性的时代,我们希望在签名的地方,签名的是自己手写出来的很有个性的艺术字,而非根据手势识别出来的标准字体。

设计思路如下,在画板上进行签名(其实就是绘制图片),完成后保存为图片。然后将图片按照一定的比率进行缩放并显示在指定的位置。

这里给出一个实例,实例只是一个简单的例子,如有需要可以进行必要的扩展。这里我们需要一个Listener、一个Dialog、一个Activity这个三个java类。两个layout XML文件。

Listener很简单,主要是对手写板对话框的一个监听。

public interface DialogListener {public void refreshActivity(Object object);}

接着是画板的Dialog

package cn.handwriting;import android.app.Dialog;
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.Path;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager.LayoutParams;
import android.widget.Button;
import android.widget.FrameLayout;public class WritePadDialog extends Dialog {Context context;LayoutParams p ;DialogListener dialogListener;public WritePadDialog(Context context,DialogListener dialogListener) {super(context);this.context = context;this.dialogListener = dialogListener;}static final int BACKGROUND_COLOR = Color.WHITE;static final int BRUSH_COLOR = Color.BLACK;PaintView mView;/** The index of the current color to use. */int mColorIndex;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);requestWindowFeature(Window.FEATURE_PROGRESS);setContentView(R.layout.write_pad);p = getWindow().getAttributes();  //获取对话框当前的参数值   p.height = 320;//(int) (d.getHeight() * 0.4);   //高度设置为屏幕的0.4 p.width = 480;//(int) (d.getWidth() * 0.6);    //宽度设置为屏幕的0.6          getWindow().setAttributes(p);     //设置生效mView = new PaintView(context);FrameLayout frameLayout = (FrameLayout) findViewById(R.id.tablet_view);frameLayout.addView(mView);mView.requestFocus();Button btnClear = (Button) findViewById(R.id.tablet_clear);btnClear.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mView.clear();}});Button btnOk = (Button) findViewById(R.id.tablet_ok);btnOk.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {try {dialogListener.refreshActivity(mView.getCachebBitmap());WritePadDialog.this.dismiss();} catch (Exception e) {e.printStackTrace();}}});Button btnCancel = (Button)findViewById(R.id.tablet_cancel);btnCancel.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {cancel();}});}/*** This view implements the drawing canvas.* * It handles all of the input events and drawing functions.*/class PaintView extends View {private Paint paint;private Canvas cacheCanvas;private Bitmap cachebBitmap;private Path path;public Bitmap getCachebBitmap() {return cachebBitmap;}public PaintView(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(p.width, (int)(p.height*0.8), Config.ARGB_8888);         cacheCanvas = new Canvas(cachebBitmap);cacheCanvas.drawColor(Color.WHITE);}public void clear() {if (cacheCanvas != null) {paint.setColor(BACKGROUND_COLOR);cacheCanvas.drawPaint(paint);paint.setColor(Color.BLACK);cacheCanvas.drawColor(Color.WHITE);invalidate();          }}@Overrideprotected void onDraw(Canvas canvas) {// canvas.drawColor(BRUSH_COLOR);canvas.drawBitmap(cachebBitmap, 0, 0, null);canvas.drawPath(path, paint);}@Overrideprotected 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;@Overridepublic 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;}}}

Activity是程序的入口,这个必不可少。

package cn.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 HandwritingActivity extends Activity {/** Called when the activity is first created. */private Bitmap mSignBitmap;private String signPath;private ImageView ivSign;private TextView tvSign;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);setTitle("欢迎使用手写签名");ivSign =(ImageView)findViewById(R.id.iv_sign);tvSign = (TextView)findViewById(R.id.tv_sign);      ivSign.setOnClickListener(signListener);tvSign.setOnClickListener(signListener);}private OnClickListener signListener = new View.OnClickListener() {@Overridepublic void onClick(View v) {WritePadDialog writeTabletDialog = new WritePadDialog(HandwritingActivity.this, new DialogListener() {@Overridepublic void refreshActivity(Object object) {                         mSignBitmap = (Bitmap) object;signPath = createFile();/*BitmapFactory.Options options = new BitmapFactory.Options();options.inSampleSize = 15;options.inTempStorage = new byte[5 * 1024];Bitmap zoombm = BitmapFactory.decodeFile(signPath, options);*/                                                       ivSign.setImageBitmap(mSignBitmap);tvSign.setVisibility(View.GONE);}});writeTabletDialog.show();}};/*** 创建手写签名文件* * @return*/private String createFile() {ByteArrayOutputStream baos = null;String _path = null;try {String sign_dir = Environment.getExternalStorageDirectory() + File.separator;         _path = sign_dir + System.currentTimeMillis() + ".jpg";baos = new ByteArrayOutputStream();mSignBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);byte[] photoBytes = baos.toByteArray();if (photoBytes != null) {new FileOutputStream(new File(_path)).write(photoBytes);}} catch (IOException e) {e.printStackTrace();} finally {try {if (baos != null)baos.close();} catch (IOException e) {e.printStackTrace();}}return _path;}
}

对应的两个layout文件

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" ><ImageView android:id="@+id/iv_sign"android:layout_marginTop="50dp"android:layout_width="wrap_content"android:layout_height="wrap_content" android:layout_gravity="center"/><TextViewandroid:id="@+id/tv_sign"android:layout_marginTop="50dp"android:layout_below="@id/iv_sign"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:text="点此签名"/>
</LinearLayout>

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="0dp"android:layout_weight="1" android:background="@color/white"></FrameLayout><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:background="@android:drawable/bottom_bar"android:paddingTop="4dp" ><Buttonandroid:id="@+id/tablet_ok"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="确定" /><Buttonandroid:id="@+id/tablet_clear"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="清除" /><Buttonandroid:id="@+id/tablet_cancel"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="取消" /></LinearLayout></LinearLayout>

这里还有个样式的设置,所以在values下添加了一个colors.xml文件。具体参见样例。

Android 手写签名实例相关推荐

  1. Android手写签名 附带背景图设置

    android手写签名的demo网上其实有很多,但是大多没考虑到签名用在哪里的问题,所以就需要背景图设置,保存电子签名的时候  会连同背景图一起保存   这才达到了电子签名的效果,背景可以放置合同,请 ...

  2. Android手写签名功能(包含画米字格,人名和书写轨迹)

    本文主要介绍Android手写签名的功能实现,效果如下图 1.根据人名的个数绘制人的名称 这个逻辑分几个步骤:首先创建画笔,然后根据一个字,创建一个字的矩形框,然后根据矩形框获取到画这个字的宽高. / ...

  3. android 手写签名

    Android 手写签名是指使用手指在 Android 设备上绘制的签名.它通常用于数字签名或签署电子文件.可以通过使用手写输入 API 和触摸事件 API 来实现手写签名功能.这可以通过开发自定义视 ...

  4. Android手写签名

    手写签名自定义实现,看注释就行了 package com.zhuzi.taobamboo.user_defined; import android.content.Context; import an ...

  5. android签名图片不显示,android手写签名遇见bitmap黑屏和本地html插入签名图片

    项目需求 :Android 展示Html保单模版页面, 类似于这种界面 屏幕快照 2017-11-07 下午4.02.11.png 然后调用签名(其实就一个绘画的窗口),签上你的大名,点击确定.展示签 ...

  6. android手写签名android-signaturepad

    GitHub地址: GitHub - gcacace/android-signaturepad: A custom Android View for drawing smooth signatures ...

  7. java实现手写签名,Android实现手写签名

    本文实例为大家分享了Android手写签名的实现方法,产品要求用户可以在app上签协议..所以得弄个手写签名版,参考了一些资料自己写了个PaintView去继承View,实现签名功能. package ...

  8. Android中通过自定义签名控件实现手写签名

    场景 实现手写签名并获取签名照片 注: 博客: BADAO_LIUMANG_QIZHI的博客_霸道流氓气质_CSDN博客-C#,SpringBoot,架构之路领域博主 关注公众号 霸道的程序猿 获取编 ...

  9. android 画布实现签名,Android实现屏幕手写签名

    Android屏幕手写签名的原理就是把手机屏幕当作画板,把用户手指当作画笔,手指在屏幕上在屏幕上划来划去,屏幕就会显示手指的移动轨迹,就像画笔在画板上写字一样.实现手写签名需要结合绘图的路径工具Pat ...

最新文章

  1. php音频添加语音,PHP生成语音
  2. datatable 导入mysql 解决_将DataTable中的数据导入到数据库中
  3. step3 . day3 数据结构之线性表 单项循环链表和双向循环链表
  4. spring mvc+junit
  5. 中石油训练赛 - One-Way Conveyors(边双缩点+树上差分)
  6. alter table 加多个字段_Vue 组件设计 - table不需要封装
  7. 用python绘制彩色_使用Python/Matplotlib基于彩色地图绘制(极轴)色轮
  8. Unity 打包微信
  9. html 盒子 边距,css盒子-内外边距
  10. 神经网络(二)—— 神经元、Logistic回归模型
  11. 《数学之美》读书记录(一)
  12. 基于云服务创建弹性托管集群服务
  13. Dell居然用EMS给我寄发票
  14. 洛谷 - P3374 树状数组1
  15. cent os 安装
  16. ubuntu重新获取IP地址
  17. 新概念c语言教程答案,新概念编程C语言篇习题解答
  18. sql 每小时的温度平均值
  19. C语言中结构体的强制类型转换
  20. 中文文献计算机编目,维吾尔文献计算机编目

热门文章

  1. 电脑按键混乱,好像被锁定了Alt键
  2. 手游游戏盒子有什么作用和优势?
  3. 安卓手机如何压缩PDF文件大小
  4. linux删除目录命令_如何使用一个Linux命令删除多个子目录
  5. 群发邮件怎么发?outlook发邮件如何撤回?
  6. 有什么适合做填写的报表工具?
  7. 换行导致无法模拟SQL注入
  8. upper_bound和lower_bound的区别
  9. Latex 积分竖线的输入
  10. Map的有序和无序实现类,与Map的排序