手写签名
来源:互联网 发布:windows 7旗舰版64 编辑:程序博客网 时间:2024/04/28 23:07
新建一个接口
public interface DialogListener { public void refreshActivity(Object object); }
主Activity
public class HandwritingActivity extends Activity { /** Called when the activity is first created. */ private Bitmap mSignBitmap; private String signPath; private ImageView ivSign; private TextView tvSign; @Override public 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 OnClickListener() { @Override public void onClick(View v) { WritePadDialog writeTabletDialog = new WritePadDialog( HandwritingActivity.this,R.style.SignBoardDialog, new DialogListener() { public 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);*/ Bitmap zoombm = getCompressBitmap(signPath); //ivSign.setImageBitmap(mSignBitmap); ivSign.setImageBitmap(zoombm); 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() + ".png"; baos = new ByteArrayOutputStream(); mSignBitmap.compress(Bitmap.CompressFormat.PNG, 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; } /** * 根据图片路径获取图片的压缩图 * @param filePath * @return */ public Bitmap getCompressBitmap(String filePath){ BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; // 获取这个图片的宽和高 Bitmap bitmap = BitmapFactory.decodeFile(filePath, options); //此时返回bm为空 if(bitmap == null){ } //计算缩放比 int simpleSize = (int)(options.outHeight / (float)200); if (simpleSize <= 0) simpleSize = 1; options.inSampleSize = simpleSize; options.inJustDecodeBounds = false; //重新读入图片,注意这次要把options.inJustDecodeBounds 设为 false哦 bitmap=BitmapFactory.decodeFile(filePath,options); int w = bitmap.getWidth(); int h = bitmap.getHeight(); System.out.println(w+" "+h); return bitmap; }}
工具类
public class WritePadDialog extends Dialog { Context context; LayoutParams p; DialogListener dialogListener; public WritePadDialog(Context context) { super(context); this.context = context; } public WritePadDialog(Context context, int themeResId) { super(context, themeResId); this.context = context; } public WritePadDialog(Context context,DialogListener dialogListener) { super(context); this.context = context; this.dialogListener = dialogListener; } public WritePadDialog(Context context, int themeResId, DialogListener dialogListener) { super(context,themeResId); 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; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); requestWindowFeature(Window.FEATURE_PROGRESS); setContentView(R.layout.write_pad); WindowManager wm = (WindowManager) getContext() .getSystemService(Context.WINDOW_SERVICE); int width = wm.getDefaultDisplay().getWidth(); int height = wm.getDefaultDisplay().getHeight(); p = getWindow().getAttributes(); // 获取对话框当前的参数值 // p.height = (int)(height* 0.4); //高度设置为屏幕的0.4 // p.width = (int) (width * 0.6); //宽度设置为屏幕的0.6 int statusBarHeight = getStatusBarHeight(context); p.height = (int)(height - statusBarHeight + 0.5); //减去系统的宽高 p.width = (int)(width + 0.5); 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() { @Override public void onClick(View v) { mView.clear(); } }); Button btnOk = (Button) findViewById(R.id.tablet_ok); btnOk.setOnClickListener(new View.OnClickListener() { @Override public 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() { @Override public void onClick(View v) { cancel(); } }); } /** * 获取通知栏的高度 * @param context * @return */ public int getStatusBarHeight(Context context){ int result = 0; int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = context.getResources().getDimensionPixelSize(resourceId); } return result; } /** * 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(10); 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); //设置背景为白色,不然点击缩略图查看的时候是全黑色 //cacheCanvas.drawColor(R.color.transparent); } public void clear() { if (cacheCanvas != null) { paint.setColor(BACKGROUND_COLOR); cacheCanvas.drawPaint(paint); paint.setColor(Color.BLACK); cacheCanvas.drawColor(Color.WHITE); invalidate(); } } @Override protected void onDraw(Canvas canvas) { // canvas.drawColor(BRUSH_COLOR); 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; } }}
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:background="@drawable/all_bg" android:orientation="vertical" > <ImageView android:id="@+id/iv_sign" android:layout_marginTop="50dp" android:layout_width="100dp" android:layout_height="100dp" /> <TextView android:id="@+id/tv_sign" android:layout_marginTop="50dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:text="点此签名" /></LinearLayout>
write_pad.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FFFFFF" android:orientation="vertical" > <FrameLayout android:id="@+id/tablet_view" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" > </FrameLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" > <Button android:id="@+id/tablet_ok" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="确定" /> <Button android:id="@+id/tablet_clear" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="清除" /> <Button android:id="@+id/tablet_cancel" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="取消" /> </LinearLayout></LinearLayout>
亲测可用,所以不放资源包
0 0
- 手写签名
- 保存手写签名
- 手势(手写)签名
- 手写电子签名板
- Android 手写签名 Demo
- Android自定义手写签名
- Android电子手写签名
- canvas手写签名
- jSignature手写签名插件
- android 电子签名 手写签名 功能实现
- flex实现手写在线签名
- flex实现手写在线签名
- Android 手写签名和裁剪
- 平滑的手写签名View
- 贝塞尔曲线实现手写签名
- 手写签名插件—jSignature
- WORD2003电子签名插件(支持手写、签章)
- Winform开发中手写签名的实现
- PAT|1064. Complete Binary Search Tree
- Java微信二次开发之13-图文消息的推送接收
- P1120 小木棍 [数据加强版]
- Android自定义控件:动画类(十四)----实现ListView Item进入动画
- android:scaleType属性
- 手写签名
- 基础备忘:对象的传值与返回
- eclipse java 项目导出jar包,使用fatjar 插件安装及使用
- beyond compare 显示比较结果对话框
- linux内核支持usb驱动,usb转串口设备,u盘
- 正式学习java的第3天
- Android自定义标题TitleView
- 关于环境变量 C++ include搜索路径,lib库搜索路径
- Java微信二次开发之14-自定义菜单及菜单响应事件的推送