Android 手写签名和裁剪
来源:互联网 发布:python rsa 私钥加密 编辑:程序博客网 时间:2024/05/17 04:54
效果图:
主要代码:
import android.annotation.SuppressLint;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Matrix;import android.graphics.Paint;import android.graphics.Path;import android.graphics.Point;import android.util.AttributeSet;import android.util.DisplayMetrics;import android.view.MotionEvent;import android.view.View;import android.view.WindowManager;@SuppressLint("ClickableViewAccessibility")public class SignView extends View {private Canvas mCanvas;private Paint mPaint;private Path mPath;private Bitmap mBitmap;private Paint mBitmapPaint;private int mX;private int mY;private int mScreenWidth;private int mScreenHeight;private Matrix matrix;private Point mPoint;private int maxX;private int maxY;private int minY;private int minX;private int pading=20;private boolean isCaculater;public SignView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);// TODO Auto-generated constructor stubinitScreen(context);init();}public SignView(Context context, AttributeSet attrs) {this(context, attrs, 0);// TODO Auto-generated constructor stub}public SignView(Context context) {this(context, null);// TODO Auto-generated constructor stub}private void initScreen(Context context) {// TODO Auto-generated method stubWindowManager manager=(WindowManager) context.getSystemService(Context.WINDOW_SERVICE);DisplayMetrics outMetrics=new DisplayMetrics();manager.getDefaultDisplay().getMetrics(outMetrics);mScreenWidth=outMetrics.widthPixels;mScreenHeight=outMetrics.heightPixels;}private void init() {// TODO Auto-generated method stubmBitmap = Bitmap.createBitmap(mScreenWidth, mScreenHeight, Bitmap.Config.ARGB_8888);mCanvas = new Canvas(mBitmap);mPath = new Path();mBitmapPaint = new Paint(Paint.DITHER_FLAG);mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setDither(true); mPaint.setColor(Color.parseColor("#404040")); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeJoin(Paint.Join.ROUND); mPaint.setStrokeCap(Paint.Cap.ROUND); mPaint.setStrokeWidth(10); matrix=new Matrix();mPoint=new Point();}@Overrideprotected void onDraw(Canvas canvas) {// TODO Auto-generated method stubsuper.onDraw(canvas);canvas.drawBitmap(mBitmap, matrix, mBitmapPaint);canvas.drawPath(mPath, mPaint);}@Overridepublic boolean onTouchEvent(MotionEvent event) {// TODO Auto-generated method stubint x = (int) event.getX();int y = (int) event.getY();mPoint.x=x;mPoint.y=y;switch (event.getAction()) {case MotionEvent.ACTION_DOWN:if(!isCaculater){isCaculater=true;maxX=x;maxY=y;minX=x;minY=y;}else{caculater(mPoint);}startDraw(x, y);invalidate();break;case MotionEvent.ACTION_MOVE:caculater(mPoint);moveDraw(x, y);invalidate();break;case MotionEvent.ACTION_UP:upDraw();invalidate();break;}return true;}private void upDraw() {// TODO Auto-generated method stubmPath.lineTo(mX, mY);mCanvas.drawPath(mPath, mPaint);mPath.reset();}private void moveDraw(int x, int y) {// TODO Auto-generated method stubint dx = Math.abs(x - mX);int dy = Math.abs(y - mY);if (dx >= 2 || dy >= 2) {mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);// 二次方贝塞尔曲线mX = x;mY = y;}}private void startDraw(int x, int y) {// TODO Auto-generated method stubmPath.reset();mPath.moveTo(x, y);mX = x;mY = y;}/** * 得到指定宽高的手绘图(绘制区域) * @param width * @param height * @return */public Bitmap getSignBitmap(int width,int height){Bitmap retBitmap = Bitmap.createBitmap(mBitmap, minX-pading,minY-pading, maxX-minX+pading, maxY-minY+pading, matrix, true);retBitmap=zoomImg(retBitmap, width, height);return retBitmap;}public void caculater(Point b){maxX=compareMaxX(b);maxY=compareMaxY(b);minX=compareMinX(b);minY=compareMinY(b);}public int compareMaxX(Point b){return maxX>b.x?maxX:b.x;}public int compareMaxY(Point b){return maxY>b.y?maxY:b.y;}public int compareMinX(Point b){return minX<b.x?minX:b.x;}public int compareMinY(Point b){return minY<b.y?minY:b.y;}/** * 处理图片 * @param bm 所要转换的bitmap * @param newWidth新的宽 * @param newHeight新的高 * @return 指定宽高的bitmap */ public Bitmap zoomImg(Bitmap bm, int newWidth ,int newHeight){ // 获得图片的宽高 int width = bm.getWidth(); int height = bm.getHeight(); // 计算缩放比例 float scaleWidth = ((float) newWidth) / width; float scaleHeight = ((float) newHeight) / height; // 取得想要缩放的matrix参数 Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleHeight); // 得到新的图片 www.2cto.comBitmap newbm = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true); return newbm; } }
这个代码还可以优化,可自定义属性传入属性值,画布宽高如果不用屏幕宽高,那么ontouch的边界检测需要加判断,这里相关代码就不提供了
0 0
- Android 手写签名和裁剪
- Android 手写签名 Demo
- Android自定义手写签名
- Android电子手写签名
- android 电子签名 手写签名 功能实现
- 手写签名
- android 超简单的手写签名Demo
- [Android实例] 手写签名,画笔颜色选择器
- Android 自定义View(手写签名)
- Android拍照和裁剪
- Android移动开发-Android屏幕手写签名的实现
- 【Android】手写优化-更为平滑的签名效果实现
- Android环境下使用cordova从事手写签名代码
- android 手写签名、画板(自定义视图)的使用
- 请问Android手写签名咋个实现了?
- Android自定义View实现手写签名的功能
- 【android开发】手写签名系统的设计与实现之实现手写画板(三)
- 【android开发】手写签名系统的设计与实现之实现手写画板(三)
- Reverse Linked List
- map/reduce执行流程
- TextView显示插入的图片
- 字典转模型需要注意的问题,以及第三方框架来处理字典转模型
- IOS菜鸟的所感所思(七)——获取网络图片并添加
- Android 手写签名和裁剪
- 排序算法代码汇总
- js中arguments的用法
- 面试题22:栈的压入弹出序列
- Eclipse配置Android开发环境
- 【PS后期】PS合成中如何协调不同素材颜色
- TextView图文混排,显示添加的图片,三种常用方法,亲测
- 2015.5.31 第二周状态
- [数学学习2]映射