android仿银行客户签名并且保存签名的截图文件,文件名为本地时间

来源:互联网 发布:手机做淘宝客怎么做 编辑:程序博客网 时间:2024/05/29 04:13
首先需要一个自定义view用来签字使用,可以修改颜色和画笔的粗细,可以擦拭重新画
package com.android.tcm.view;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.graphics.PorterDuff.Mode;import android.graphics.PorterDuffXfermode;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;public class SignView extends View {   private Paint paint;   private Canvas cacheCanvas;   private Bitmap cachebBitmap;   private Path path;   static final int BACKGROUND_COLOR = Color.WHITE;   static final int BRUSH_COLOR = Color.BLACK;   public SignView(Context context, AttributeSet attrs, int defStyleAttr) {      super(context, attrs, defStyleAttr);      // initView(context);      // TODO Auto-generated constructor stub   }   public SignView(Context context, AttributeSet attrs) {      super(context, attrs);      // initView(context);      // TODO Auto-generated constructor stub   }   public SignView(Context context) {      super(context);      // initView(context);      // TODO Auto-generated constructor stub   }   public void initView(Context context) {   }   @Override   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {      // TODO Auto-generated method stub      super.onMeasure(widthMeasureSpec, heightMeasureSpec);      paint = new Paint();      paint.setAntiAlias(true);      paint.setStrokeWidth(3);      paint.setStyle(Paint.Style.STROKE);      paint.setColor(Color.RED);      path = new Path();      cachebBitmap = Bitmap.createBitmap(            MeasureSpec.getSize(widthMeasureSpec),            MeasureSpec.getSize(heightMeasureSpec), Config.ARGB_8888);      cacheCanvas = new Canvas(cachebBitmap);      cacheCanvas.drawColor(Color.TRANSPARENT);   }   public Bitmap getCachebBitmap() {      return cachebBitmap;   }   public void clear() {      if (cacheCanvas != null) {         paint.setXfermode(new PorterDuffXfermode(Mode.CLEAR));         cacheCanvas.drawPaint(paint);           paint = new Paint();          paint.setAntiAlias(true);         paint.setStrokeWidth(3);         paint.setStyle(Paint.Style.STROKE);         paint.setColor(Color.RED);         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,            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: {         if(isListener!=null){            isListener.sign();         }         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;   }      public interface isSignListener{      void sign();   }      isSignListener isListener;      public void setIsListener(isSignListener isListener) {      this.isListener = isListener;   }}
布局代码如下
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent">    <RelativeLayout        android:id="@+id/rl"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:background="@color/white">        <FrameLayout            android:layout_width="match_parent"            android:layout_height="match_parent"            android:layout_marginBottom="40dp">            <com.android.tcm.view.SignView                android:id="@+id/signView"                android:layout_width="match_parent"                android:layout_height="match_parent" />        </FrameLayout>        <LinearLayout            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_alignParentBottom="true"            android:layout_centerHorizontal="true"            android:orientation="horizontal">            <TextView                android:id="@+id/tv_clear"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:gravity="center"                android:paddingBottom="15dp"                android:paddingTop="15dp"                android:text="擦除重签"                android:textSize="18sp" />            <TextView                android:id="@+id/tv_commit"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:layout_marginLeft="20dp"                android:gravity="center"                android:paddingBottom="15dp"                android:paddingTop="15dp"                android:text="确认"                android:textSize="18sp" />        </LinearLayout>    </RelativeLayout></RelativeLayout>
主函数代码,用于获取截图(id:rl)的,并且把文件保存到本地(文件夹TVC下文件命名为当前时间如20170713 10:31:31.jpg)
package com.android.tcm.activity;import android.graphics.Bitmap;import android.os.Bundle;import android.os.Environment;import android.view.View;import android.widget.RelativeLayout;import android.widget.TextView;import com.android.tcm.R;import com.android.tcm.view.SignView;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;/** * Created by sf. */public class SignActivity extends Activity {    private RelativeLayout rl;    private SignView mView;    private TextView commit, clear;    private Bitmap mSignBitmap;    private String signPath;    private long time;    private String fileName;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_sign);        initView();    }    public void initView() {        mView = (SignView) findViewById(R.id.signView);        commit = (TextView) findViewById(R.id.tv_commit);        clear = (TextView) findViewById(R.id.tv_clear);        rl= (RelativeLayout) findViewById(R.id.rl);        commit.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View arg0) {//                commit.getDrawingCache();//获取控件的截图//                saveSign(BitmapUtil.myShot(SignActivity.this));                rl.setDrawingCacheEnabled(true);                saveSign(rl.getDrawingCache());                rl.setDrawingCacheEnabled(false);            }        });        clear.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View arg0) {                mView.clear();            }        });    }    /**     * signPath是图片保存路径     *     * @param bit     */    public void saveSign(Bitmap bit) {        time = System.currentTimeMillis();        fileName = getDateTimeFromMillisecond(time);        mSignBitmap = bit;        signPath = createFile();    }    /**     * @return     */    private String createFile() {        ByteArrayOutputStream baos = null;        String _path = null;        try {            String sign_dir = Environment.getExternalStorageDirectory()                    .getPath() + "/" + "TCM" + "/";            File dir = new File(sign_dir);            if (!dir.exists()) {                dir.mkdirs();            }            _path = sign_dir + fileName + ".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;    }    @Override    protected void onDestroy() {        // TODO Auto-generated method stub        super.onDestroy();        if (mSignBitmap != null) {            mSignBitmap.recycle();        }    }    /**     * 将毫秒转化成固定格式的时间     * 时间格式: yyyy-MM-dd HH:mm:ss     *     * @param millisecond     * @return     */    public static String getDateTimeFromMillisecond(Long millisecond) {        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");        Date date = new Date(millisecond);        String dateStr = simpleDateFormat.format(date);        return dateStr;    }}