GIF压缩有问题,运行很顺滑!!!

1.自定义View——支持设置画笔颜色,画笔宽度,画板颜色,清除画板,检查是否有签名,保存画板图片(复制粘贴可直接使用)

/*** Created by YyyyQ on 2020/3/5.

* 电子签名*/

public class SignatureView extendsView {privateContext context;//X轴起点

private floatx;//Y轴起点

private floaty;//画笔

private final Paint paint = newPaint();//路径

private final Path path = newPath();//画布

privateCanvas canvas;//生成的图片

privateBitmap bitmap;//画笔的宽度

private int paintWidth = 10;//签名颜色

private int paintColor =Color.BLACK;//背景颜色

private int backgroundColor =Color.WHITE;//是否已经签名

private boolean isTouched = false;//签名开始与结束

public interfaceTouch {void OnTouch(booleanisTouch);

}privateTouch touch;publicSignatureView(Context context) {super(context);

init(context);

}publicSignatureView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);

init(context);

}public SignatureView(Context context, @Nullable AttributeSet attrs, intdefStyleAttr) {super(context, attrs, defStyleAttr);

init(context);

}private voidinit(Context context) {this.context =context;//抗锯齿

paint.setAntiAlias(true);//样式

paint.setStyle(Paint.Style.STROKE);//画笔颜色

paint.setColor(paintColor);//画笔宽度

paint.setStrokeWidth(paintWidth);

}

@Overrideprotected void onSizeChanged(int w, int h, int oldw, intoldh) {super.onSizeChanged(w, h, oldw, oldh);//创建于view大小一致的bitmap

bitmap =Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);

canvas= newCanvas(bitmap);

canvas.drawColor(backgroundColor);

isTouched= false;

}

@Overridepublic booleanonTouchEvent(MotionEvent event) {if (touch != null) touch.OnTouch(true);switch(event.getAction()) {//手指按下

caseMotionEvent.ACTION_DOWN:

touchDwon(event);break;//手指移动

caseMotionEvent.ACTION_MOVE:

isTouched= true;if (touch != null) touch.OnTouch(false);

touchMove(event);break;//手指抬起

caseMotionEvent.ACTION_UP:

canvas.drawPath(path, paint);

path.reset();break;

}//更新绘制

invalidate();return true;

}

@Overrideprotected voidonDraw(Canvas canvas) {super.onDraw(canvas);//画此次笔画之前的签名

canvas.drawBitmap(bitmap, 0, 0, paint);//通过画布绘制多点形成的图形

canvas.drawPath(path, paint);

}//手指按下的方法

private voidtouchDwon(MotionEvent event) {//重置绘制路径

path.reset();float downX =event.getX();float downY =event.getY();

x=downX;

y=downY;//绘制起点

path.moveTo(downX, downY);

}//手指滑动的方法

private voidtouchMove(MotionEvent event) {//当前的x,y坐标点

final float moveX =event.getX();final float moveY =event.getY();//之前的x,y坐标点

final float previousX =x;final float previousY =y;//获取绝对值

final float dx = Math.abs(moveX -previousX);final float dy = Math.abs(moveY -previousY);if (dx >= 3 || dy >= 3) {float cX = (moveX + previousX) / 2;float cY = (moveY + previousY) / 2;

path.quadTo(previousX, previousY, cX, cY);

x=moveX;

y=moveY;

}

}/*** 设置画笔颜色

*

*@parampaintColor*/

public void setPaintColor(intpaintColor) {this.paintColor =paintColor;

paint.setColor(paintColor);

}/*** 设置画笔宽度

*

*@parampaintWidth*/

public void setPaintWidth(intpaintWidth) {this.paintWidth =paintWidth;

paint.setStrokeWidth(paintWidth);

}/*** 设置画板颜色

*

*@paramcanvasColor*/

public void setCanvasColor(intcanvasColor) {this.backgroundColor =canvasColor;

}/*** 清除画板*/

public voidclear() {if (canvas != null) {

isTouched= false;//更新画板

paint.setColor(paintColor);

paint.setStrokeWidth(paintWidth);

canvas.drawColor(backgroundColor, PorterDuff.Mode.CLEAR);

invalidate();

}

}/*** 获取画板的Bitmap

*

*@return

*/

publicBitmap getBitmap() {

setDrawingCacheEnabled(true);

buildDrawingCache();

Bitmap bitmap=getDrawingCache();

setDrawingCacheEnabled(false);returnbitmap;

}/*** 是否有签名

*

*@return

*/

publicBoolean getSigstatus() {returnisTouched;

}/*** 保存画板

*

*@parampath 保存到路径*/@SuppressLint("WrongThread")public Boolean save(String path) throwsIOException {

Bitmap bitmap= this.bitmap;

ByteArrayOutputStream bos= newByteArrayOutputStream();

bitmap.compress(Bitmap.CompressFormat.PNG,100, bos);byte[] buffer =bos.toByteArray();if (buffer != null) {

File file= newFile(path);if(file.exists()) {

file.delete();

}

OutputStream outputStream= newFileOutputStream(file);

outputStream.write(buffer);

outputStream.close();return true;

}else{return false;

}

}

}

2.xml布局引用自定义View(注意包名)

android:id="@+id/signature"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:background="#fff" />

android:layout_width="match_parent"android:layout_height="50dp"android:layout_margin="20dp"android:orientation="horizontal">

android:id="@+id/clear"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:text="清除" />

android:id="@+id/isSignature"android:layout_width="0dp"android:layout_height="match_parent"android:layout_marginLeft="10dp"android:layout_weight="1"android:gravity="center"android:text="是否签名" />

android:id="@+id/save"android:layout_width="0dp"android:layout_height="match_parent"android:layout_marginLeft="10dp"android:layout_weight="1"android:gravity="center"android:text="保存" />

3.Activity调用

/**

* Created by YyyyQ on 2020/3/9.

*/

public class SignatureActivity extends AppCompatActivity {

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_signature);

SignatureView signatureView = findViewById(R.id.signature);

//设置画笔颜色(可以不设置--默认画笔宽度10,画笔颜色黑,背景颜色白)

signatureView.setPaintColor(Color.BLACK);

signatureView.setPaintWidth(20);

signatureView.setCanvasColor(Color.WHITE);

//清除

Button clear = findViewById(R.id.clear);

clear.setOnClickListener(view -> {

signatureView.clear();

//设置画笔颜色(可以不设置--默认画笔宽度10,画笔颜色黑,背景颜色白)

signatureView.setPaintColor(Color.BLACK);

signatureView.setPaintWidth(20);

signatureView.setCanvasColor(Color.WHITE);

});

//是否含有签名

Button isSignature = findViewById(R.id.isSignature);

isSignature.setOnClickListener(view -> {

if (signatureView.getSigstatus()) {

Toast.makeText(SignatureActivity.this, "有签名", Toast.LENGTH_SHORT).show();

} else {

Toast.makeText(SignatureActivity.this, "无签名", Toast.LENGTH_SHORT).show();

}

});

//保存

Button save = findViewById(R.id.save);

save.setOnClickListener(view -> {

try {

if (signatureView.save("/sdcard/YyyyQ.png")) {

Toast.makeText(SignatureActivity.this, "保存成功", Toast.LENGTH_SHORT).show();

} else {

Toast.makeText(SignatureActivity.this, "保存失败", Toast.LENGTH_SHORT).show();

}

} catch (IOException e) {

e.printStackTrace();

}

});

}

}

java 手写签名_Android 自定义View手写签名并保存图片相关推荐

  1. android 画布实现签名,Android 自定义View手写签名并保存图片

    1.自定义View--支撑设置画笔色彩,画笔宽度,画板色彩,铲除画板,查看是否有签名,保存画板图片(仿制粘贴可直接使用) /***CreatedbyYyyyQon2020/3/5. *电子签名*/pu ...

  2. android 手写签批_Android自定义View——手写签批

    接到一个领导批示保留原笔迹的功能,类似于绘画板,用户打开后可以绘制,点击完成后以图片的形式保存在本地,并且显示绘制后图片,上传服务器,达到保留原笔迹的目的.可以运用于签字.审批等. 效果图: 手写签批 ...

  3. java电影票选座_Android自定义view实现电影票在线选座功能

    先看看电影票在线选座功能实现的效果图: 界面比较粗糙,主要看原理. 这个界面主要包括以下几部分 1.座位 2.左边的排数 3.左上方的缩略图 4.缩略图中的红色区域 5.手指移动时跟随移动 6.两个手 ...

  4. android 手写签批_Android自定义实现手写签名功能

    一.Android自定义View步骤 : 自定义属性: 选择和设置构造方法: 重写onMeasure()方法: 重写onDraw()方法: 重写onLayout()方法: 重写其他事件的方法(滑动监听 ...

  5. Android 将签名布局旋转90度,Android 自定义View手写签名

    Android 自定义View:手写签名 最近项目中有个新的需求,就是要实现用户手写签名,然后展示再上传到服务器.看到效果图后,先是面对百度编程搜了一下,很多实现方法,主要就是自定义View实现的,为 ...

  6. Android 自定义View手写签名

    Android 自定义View:手写签名 最近项目中有个新的需求,就是要实现用户手写签名,然后展示再上传到服务器.看到效果图后,先是面对百度编程搜了一下,很多实现方法,主要就是自定义View实现的,为 ...

  7. Android 自定义View 手写瀑布流组件FlowLayout

    目录 FlowLayout实现关键步骤: 1.创建一个view继承自ViewGroup 2.重写并实现onMeasure方法 3.重写并实现onLayout方法 纸上得来终觉浅,绝知此事要躬行. 动手 ...

  8. android 图片圆角 遮罩_Android 自定义View练手Demo(一)实现圆角遮罩效果

    Android 自定义View系列文章 Android自定义View实现圆角遮罩效果 一图胜千言,有一个遮罩就会凸显出重点区域 1-1.jpg 本文通过两种方式来实现这种效果,来达到自定义View练手 ...

  9. android java 圆角_Android自定义View实现带4圆角或者2圆角的效果

    1 问题 实现任意view经过自定义带4圆角或者2圆角的效果 2 原理 1) 实现view 4圆角 我们只需要把左边的图嵌入到右边里面去,最终显示左边的图就行. 2) 实现view上2圆角 我们只需要 ...

最新文章

  1. ARWU、THE、QS世界大学 排名前100名国(境)外高校名单
  2. hive常见问题及解决方法
  3. memory matlab,memory – 在MATLAB中处理大量结构
  4. 数据结构与算法之美02
  5. Moonlight已经可以下载,目前是0.6版
  6. php 表单 同步,Jquery点击按钮 异步和同步提交表单
  7. GNS3(eNSP)和VMWare搭建网络学习环境
  8. Python中str.format()字典及list传入详解
  9. DataTable转为JSON数据格式代码
  10. 五大优秀的数据库设计工具
  11. CSDM发布文章“请勿使用默认标题”
  12. jQuery实现表格冻结行和列
  13. 实例解析云计算的概念
  14. 8.4 大学生,不要再拿兴趣说事——《逆袭大学》连载
  15. IIS优化,支持10万并发
  16. python乘积函数_Python中的乘法函数
  17. 谈下我曾经做过的一个心理健康管理系统
  18. java 实现繁简字体转换(笨方法)
  19. Lab1实验过程及心得体会
  20. 数据库的几种重要作用

热门文章

  1. ajax 微信code获取_获取链接的参数,判断是否是微信打开,ajax获取数据
  2. 小白学python需要多久_小白学Python | 你还在说你入不了门吗
  3. 函数调用关系图如何画_程序是如何在 CPU 中运行的(二)
  4. Codeforces Round #719 (A-C)
  5. 模拟退火算法(代码可直接运行)
  6. Sqlite SQL格式化输入函数splite3_mprintf
  7. wireshark分析SIP协议——注册
  8. 关于关闭office 2010中的OSPPSVC服务的方法
  9. linux powerpc i2c驱动 之 i2c设备层的注册过程
  10. wpf 使子ui元素可视区域不超过父元素_对游戏UI设计的一点思考