android项目 之 记事本(15) ----- 保存手写及绘图

时间:2021-02-03 06:53:57

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020

之前,忘了写如何将手写和绘图保存,现在补上。

首先看如何保存绘图,先看效果图:

android项目 之 记事本(15) ----- 保存手写及绘图android项目 之 记事本(15) ----- 保存手写及绘图

          因为记事本的绘图功能主要用到了画布,而在构建画布时,指定了Bitmap,也就是说在画布上的所画的东西都被保存在了Bitmap中,因此,我们只要保存该Bitmap,就可以将我们的所绘制的图形以图片的形式保存,主要代码如下:

/* 
* 保存所绘图形
* 返回绘图文件的存储路径
* */
public String saveBitmap(){
//获得系统当前时间,并以该时间作为文件名
SimpleDateFormat formatter = new SimpleDateFormat ("yyyyMMddHHmmss");
Date curDate = new Date(System.currentTimeMillis());//获取当前时间
String str = formatter.format(curDate);
String paintPath = "";
str = str + "paint.png";
File dir = new File("/sdcard/notes/");
File file = new File("/sdcard/notes/",str);
if (!dir.exists()) {
dir.mkdir();
}
else{
if(file.exists()){
file.delete();
}
}

try {
FileOutputStream out = new FileOutputStream(file);
mBitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
out.flush();
out.close();
//保存绘图文件路径
paintPath = "/sdcard/notes/" + str;


} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return paintPath;
}


        这里的mBitmap就是保存画布内容的,我们将其存储在SD卡的指定目录下,并以时间作为文件名,最后返回存储该绘图文件的路径,用于将其存储到数据库中。

 

        再看,如何保存手写:

android项目 之 记事本(15) ----- 保存手写及绘图android项目 之 记事本(15) ----- 保存手写及绘图

        和保存绘图一样,这里同样是以图片的形式保存在SD卡的指定目录下,但是这里有个问题,手写Activity用的是帧式布局,下层是自定义的EditText,上层同样是自定的View,用于绘图,而我们的手写最终是保存在自定义的EditText中的,当然可以用文本的形式保存手写内容,但这里为了简单起见,以及为了保存手写的颜色大小等属性,故以图片的形式保存。

       因为自定义的EditText说到底还是View,所以这里就需要将View转换成图片,代码如下:

 //将view转换成图片
et_handwrite.setDrawingCacheEnabled(true);
Bitmap cutHandwriteBitmap = Bitmap.createBitmap(et_handwrite.getDrawingCache());
et_handwrite.setDrawingCacheEnabled(false);

        这样,我们就将手写的内容保存在了Bitmap中,之后,我们就可以用保存绘图的方法将其保存,如下:

  ......

class ClickEvent implements OnClickListener{

@Override
public void onClick(View v) {
if(v == btn_save){

//得到调用该Activity的Intent对象
Intent intent = getIntent();
Bundle b = new Bundle();
String path = saveBitmap();
b.putString("handwritePath", path);
intent.putExtras(b);
setResult(RESULT_OK, intent);
HandWriteActivity.this.finish();

}
else if(v == btn_back){
HandWriteActivity.this.finish();
}
}

}

......

//保存手写文件
public String saveBitmap(){
//获得系统当前时间,并以该时间作为文件名
SimpleDateFormat formatter = new SimpleDateFormat ("yyyyMMddHHmmss");
Date curDate = new Date(System.currentTimeMillis());//获取当前时间
String str = formatter.format(curDate);
String paintPath = "";
str = str + "write.png";
File dir = new File("/sdcard/notes/");
File file = new File("/sdcard/notes/",str);
if (!dir.exists()) {
dir.mkdir();
}
else{
if(file.exists()){
file.delete();
}
}

//将view转换成图片
et_handwrite.setDrawingCacheEnabled(true);
Bitmap cutHandwriteBitmap = Bitmap.createBitmap(et_handwrite.getDrawingCache());
et_handwrite.setDrawingCacheEnabled(false);
try {
//保存绘图文件路径
paintPath = "/sdcard/notes/" + str;
FileOutputStream out = new FileOutputStream(file);
cutHandwriteBitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
out.close();

} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return paintPath;
}

           至此,我们就实现了将记事本中添加的图片及手写文件保存在指定目录,并以当前时间作为文件名,这里保存文件的函数返回的是图片的路径,这是为了将记事本中的内容存储到数据库中时,只将绘图及手写的存储路径保存,而不是将整个绘图或手写保存在数据库中,这些内容,之前已有介绍,不再赘述。