浅谈Android手写画板(个性签名)示例及遇到的一些问题
来源:互联网 发布:经典的迷宫生成算法 编辑:程序博客网 时间:2024/05/22 02:29
下面我们来写一个自定义可以触控屏幕绘制线条的View;
package com.signaturedemo.view;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Path;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;public class SignatureView extends View { private Paint mPaint = new Paint(); private Path mPath = new Path(); public SignatureView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); // TODO Auto-generated constructor stub init(); } public SignatureView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub init(); } public SignatureView(Context context) { super(context); // TODO Auto-generated constructor stub init(); } private void init() { mPaint.setAntiAlias(true); mPaint.setColor(Color.BLACK); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeJoin(Paint.Join.ROUND); mPaint.setStrokeWidth(5f); } @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub canvas.drawPath(mPath, mPaint); } private float cur_x, cur_y; @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub float eventX = event.getX(); float eventY = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: cur_x = eventX; cur_y = eventY; mPath.moveTo(eventX, eventY); return true; case MotionEvent.ACTION_MOVE: case MotionEvent.ACTION_UP: myDraw(event); //减锯齿描绘 mPath.quadTo(cur_x, cur_y, eventX, eventY); cur_x = eventX; cur_y = eventY; break; default: return false; } invalidate(); return true; } /** * 绘图时减锯齿操作 * @param event */ private void myDraw(MotionEvent event) { int historySize = event.getHistorySize(); for(int i=0; i<historySize; i++) { float historicalX = event.getHistoricalX(i); float historicalY = event.getHistoricalY(i); mPath.quadTo(cur_x, cur_y, historicalX, historicalY); } } /** * 清除描绘 */ public void clear() { mPath.reset(); invalidate(); }}
上面就完成了一个自定义画板的View,然后在布xml文件中引用View即可;
<com.signaturedemo.view.SignatureView android:id="@+id/view_signature" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white" />
接下来可能我们就想要保存写好的个性签名图片,重点就来了!这就涉及到如何讲一个View视图生成一个图片对象(Bitmap)呢?一般有两种方法:
第一种
/*** view_signature为我们要保存成图片的View*/ view_signature.setDrawingCacheEnabled(true); view_signature.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); view_signature.layout(0, 0, view_signature.getMeasuredWidth(), view_signature.getMeasuredHeight()); view_signature.buildDrawingCache(); Bitmap bmp = view_signature.getDrawingCache();
这种方法我用了,不知是哪里的问题,得到的Bitmap对象为null,按照网上查找的方法就是这样写的。还是得到null,有知道的涉及到的望告知一下;
第二种, 这种就是我现在用的,可以很方便的把View视图转成Bitmap对象了。贴代码
Bitmap bmp = Bitmap.createBitmap(view_signature.getMeasuredWidth(), view_signature.getMeasuredHeight(), Config.ARGB_8888); view_signature.draw(new Canvas(bmp));
大功告成了一半,那接下来就要存入本地咯。
/** * 保存签名文件图片 * @param bmp Bitmap图片对象 * @param path 保存的路径 */ public void creatBitmapFile(Bitmap bmp, String path) { try { File file = new File(mPath); //定义好mPath存的路径 if(!file.exists()) { //判断文件夹是否存在,不存在则创建 file.mkdir(); } file = new File(path); if(!file.exists()) { file.createNewFile(); } FileOutputStream fileOut = new FileOutputStream(file); bmp.compress(Bitmap.CompressFormat.PNG, 100, fileOut); fileOut.flush(); fileOut.close(); updatePhotos(file); //更新图库 Toast.makeText(this, R.string.msg_save_succ, Toast.LENGTH_SHORT).show(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); Log.e("creatBitmapFile", e.getMessage()); } catch (IOException e) { // TODO Auto-generated catch block Log.e("creatBitmapFile", e.getMessage()); e.printStackTrace(); } finally { } } /** * 打开图库 */ private void scanPicture() { Intent it_gallery = new Intent(); it_gallery.addCategory(Intent.CATEGORY_OPENABLE); it_gallery.setType("image/*"); startActivity(it_gallery); } /** * 发送广播,图库更新照片 * @param file 新增的图片 */ private void updatePhotos(File file) { Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); Uri uri = Uri.fromFile(file); intent.setData(uri); sendBroadcast(intent); }
好了,成功保存签名的View视图文件。AndroidManifest.xml别忘了加上读写sd卡的权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
大功终告成,附个效果截图吧
1 0
- 浅谈Android手写画板(个性签名)示例及遇到的一些问题
- android 手写签名、画板(自定义视图)的使用
- 【android开发】手写签名系统的设计与实现之实现手写画板(三)
- 【android开发】手写签名系统的设计与实现之实现手写画板(三)
- 手写画板android
- 画板子时遇到的问题及经验总结(1)
- QQ个性签名的一些收藏
- Android 打签名包遇到的问题
- 安装Android遇到的一些问题及总结
- 初探Android Studio及遇到的一些问题和解决
- Android - 安装及配置遇到的一些问题
- android开发中遇到的一些问题及解决方案
- android 超简单的手写签名Demo
- 【Android】使用 Eclipse 给 APK 签名时遇到的两个问题及解决办法
- 喜欢的个性签名
- android遇到的一些问题
- Android 手写签名 Demo
- Android自定义手写签名
- 一起写RPC框架(十)RPC服务提供端二--服务的编织和注册
- 动作传感器的组成及使用方法
- C++11 并发指南四(<future> 详解一 std::promise 介绍)
- HBase学习之HBase的RowKey设计原则
- HDU 5874 - Friends ans Enemis
- 浅谈Android手写画板(个性签名)示例及遇到的一些问题
- [verilog读书笔记]8.任务和函数
- Java线程总结(四):ThreadLocal实现线程范围的共享变量
- 计算几何之凸包(三) {旋转卡壳初步}
- MFC创建线程,消息通信修改
- 手机浏览器使用html5的datepicker,页面渲染完后value不显示的问题。
- 欢迎使用CSDN-markdown编辑器
- C++11 并发指南四(<future> 详解二 std::packaged_task 介绍)
- 好用的mate-date查看工具