1、自定义类
public class SignBoard extends View {
private Paint mPaint;
private Path mPath;
private float mPreX, mPreY;
public SignBoard(Context context) {
this(context, null);
}
public SignBoard(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public SignBoard(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context) {
mPaint = new Paint();
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setColor(Color.BLACK);
mPaint.setStrokeWidth(5);
mPaint.setAntiAlias(true);
mPath = new Path();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.WHITE);
canvas.drawPath(mPath, mPaint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mPath.moveTo(event.getX(), event.getY());
mPreX = event.getX();
mPreY = event.getY();
return true;
case MotionEvent.ACTION_MOVE:
float endX = (mPreX + event.getX()) / 2;
float endY = (mPreY + event.getY()) / 2;
mPath.quadTo(mPreX, mPreY, endX, endY);
mPreX = event.getX();
mPreY = event.getY();
invalidate();
break;
}
return super.onTouchEvent(event);
}
/**
* 保存
*
* @return
*/
public String saveFile() {
// 控制图片质量
if (mPath.isEmpty()) {
return null;
}
int quality = 50;
long currentTime = System.currentTimeMillis();
// File file = new File(FileUtil.getUploadImgPath() + currentTime + ".jpg");
File file = new File(FileUtil.getAlbumStorageDir("draw"), currentTime+".jpg");
String mFilePath = file.getAbsolutePath();
LogUtil.d("mFilePath:" + mFilePath);
try {
FileOutputStream out = new FileOutputStream(mFilePath);
Bitmap b = getChartBitmap();
boolean compress = b.compress(Bitmap.CompressFormat.JPEG, quality, out);
LogUtil.d("compress:" + compress);
out.flush();
out.close();
} catch (IOException e) {
LogUtil.d("IOException"+e.getMessage());
e.printStackTrace();
}
return mFilePath;
}
/**
* 清除
*/
public void clearBoard() {
mPath.reset();
invalidate();
}
public Bitmap getChartBitmap() {
// 创建一个bitmap 根据我们自定义view的大小
Bitmap returnedBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.RGB_565);
// 绑定canvas
Canvas canvas = new Canvas(returnedBitmap);
// 获取视图的背景
Drawable bgDrawable = getBackground();
if (bgDrawable != null)
// 如果有就绘制
bgDrawable.draw(canvas);
else
// 没有就绘制白色
canvas.drawColor(Color.WHITE);
// 绘制
draw(canvas);
return returnedBitmap;
}
}
2、FileUtil
public class FileUtil {
public static File getAlbumStorageDir(String albumName) {
File file = new File(Environment.getExternalStorageDirectory(), albumName);
if (!file.mkdirs()) {
Log.e("SignaturePad", "Directory not created");
}
return file;
}
}
3、xml
<com.x.common.widget.SignBoard
android:id="@+id/signboard"
android:layout_width="match_parent"
android:layout_height="match_parent" />
4、使用
String img = mSignBoard.saveFile();
if (TextUtils.isEmpty(img)) {
ToastUtil.showShortToast("请签名");
return;
}
File file = new File(img);
ApiUtil.getApi().upLoadImg(RxParamUtil.get("img", file))
.compose(RxUtil.io_main(lifeSubject))
.subscribe(new BaseObserver<String>(context) {
@Override
public void receiveResult(String result) {
file.delete();
mSignImg = result;
}
});
5、清除签名
mSignBoard.clearBoard();