您的位置:首页 > 其它

手写签名

2016-09-06 15:44 197 查看
新建一个接口

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); // 设置生效,全屏填充<
f5be
/span>
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>


亲测可用,所以不放资源包
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  手写签名