手写签名

来源:互联网 发布: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