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

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

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

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


          因为记事本的绘图功能主要用到了画布,而在构建画布时,指定了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卡的指定目录下,并以时间作为文件名,最后返回存储该绘图文件的路径,用于将其存储到数据库中。

 

        再看,如何保存手写:


        和保存绘图一样,这里同样是以图片的形式保存在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;
	}

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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。