点击按钮
WritePadDialog mWritePadDialog = new WritePadDialog(activity, new WritePadDialog.WriteDialogListener() {@Overridepublic void onPaintDone(Object object) {mSignBitmap = (Bitmap) object;createSignFile();}});mWritePadDialog.show();
画板对框
public class WritePadDialog extends Dialog {private Context mContext;private WriteDialogListener mWriteDialogListener;private PaintDrawingboard 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 = findViewById(R.id.tablet_view);// 获取屏幕尺寸DisplayMetrics mDisplayMetrics = new DisplayMetrics();getWindow().getWindowManager().getDefaultDisplay().getMetrics(mDisplayMetrics);int screenWidth = mDisplayMetrics.widthPixels;int screenHeight = mDisplayMetrics.heightPixels;mPaintView = new PaintDrawingboard(mContext, screenWidth, screenHeight);mFrameLayout.addView(mPaintView);mPaintView.requestFocus();mBtnOK = 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();}});}public interface WriteDialogListener {public void onPaintDone(Object object);}
}
画板功能
public class PaintDrawingboard extends View {private Paint mPaint;private Path mPath;private Bitmap mBitmap;private Canvas mCanvas;private int screenWidth, screenHeight;private float currentX, currentY;public PaintDrawingboard(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, Bitmap.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 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();}}
}
保存bitmap成手机图片
//创建签名文件private void createSignFile() {ByteArrayOutputStream baos = null;FileOutputStream fos = null;String path = null;File file = null;try {SimpleDateFormat simpleDateFormat = new SimpleDateFormat();simpleDateFormat.applyPattern("yyyy年MM月dd日 HH时mm分ss秒");path = Environment.getExternalStorageDirectory() + File.separator + simpleDateFormat.format(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();}}}
layout文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"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" /><TextViewandroid:id="@+id/divider2"android:layout_width="match_parent"android:layout_height="0.3dp"android:layout_below="@id/tv_pay_money_type"android:background="@color/colore9e9e9" /><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:background="@color/color_f6f6f6"><Buttonandroid:id="@+id/write_pad_ok"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:background="@color/white"android:text="确定" /><Buttonandroid:id="@+id/write_pad_clear"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:background="@color/white"android:text="清除" /></LinearLayout></LinearLayout>