Android学习小Demo(10)ToDoList的加强版

前两天去超市逛东西,问老板娘这个东西多少钱,那个东西多少钱,但是一两分钟后就搞混了,当时就想,我不是写了一个todo的吗,可以再拍照放上去,这样就有对比啦!

于是兴冲冲地赶回家,把功能给实现了,虽然这功能到处都有,但是自己实现出来的就是不一样啊,界面丑点也是自己的孩子啊,而且这孩子会长大啊,可以继续完善的嘛。

Android学习小Demo(10)ToDoList的加强版        Android学习小Demo(10)ToDoList的加强版

由上面两张图可以看到:

1)在屏幕上方专门挖出了两块地来放两个Image

2)在右下角放了两个button,一个是挑选图片,一个是直接打开照相机照相,然后返回的图片就会放到这两个Image上面。

3)那么在后台肯定要先利用一张表来存放图片跟任务的关联的,在保存任务的时候,顺便把图片的路径也保存进去。

我们先来看看数据库的表的简单设计吧:

Task 表:

Android学习小Demo(10)ToDoList的加强版

task_image_link 表:

Android学习小Demo(10)ToDoList的加强版

可以看到,task_image_link表是以task表的_id为外键的,存储图片的路径。

下面再来看代码:

1)调用系统的相机和选择图库来挑选图片:

1.1)定义两个请求的request_code:

	public static final int REQUEST_FOR_CAMERA = 1;
	public static final int REQUEST_FOR_GALLERY = 2;
1.2)点击“照相”按钮时调用系统相机

	private void startCamera(){
		Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
		tempPhotoFileName = Helper.getPhotoFileName();
		File file = new File(tempPhotoFileName);
		if(file.exists()){
			file.delete();
		}
		Uri uri = Uri.fromFile(file);
		intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
		startActivityForResult(intent, REQUEST_FOR_CAMERA);
	}
在这里,要首先保存一个文件到我们指定的路径,在这里我为了方便,是直接存到照相机的文件夹下面的:

	public static String getPhotoFileName() {
		SimpleDateFormat dateFormat = new SimpleDateFormat(
				"yyyyMMdd_HHmmss", Locale.getDefault());
		Date date = new Date();
		return Environment.getExternalStorageDirectory().getPath() + "/DCIM/100ANDRO/Todo_" + dateFormat.format(date) + ".jpg";
	}
上文中 Environment.getExternalStorageDirectory().getPath() 返回的路径就是"mnt/sdcard/"。

1.3)调用图库

	private void startGallery(){
		Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
		intent.setType("image/*");
		startActivityForResult(intent, REQUEST_FOR_GALLERY);
	}
其实我们可以看到,不管是调用照相机还是调用图库,都是发送一个Intent,里面包含了一些Action,而Android框架会根据Intent的匹配原则去找到相对应的应用的。

而且我们开启应用的是startActivityForResult这个应用,那么我们就要在Activity中实现一个OnActivityResult的方法来获得返回的状态跟数据,如下:

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data){		
		if (requestCode == REQUEST_FOR_CAMERA) {
			if(resultCode == RESULT_OK){
				isPhotoTaken = true;			
				if (thumbnails[0] == 0) {
					photoFileNames[0] = tempPhotoFileName;
					Bitmap bitmap = BitmapReader.readBigBitmapFromFile(tempPhotoFileName, REQ_WIDTH);
					ibPhoto1.setImageBitmap(bitmap);
					ibPhoto1.invalidate();
					thumbnails[0] = 1;
				} else if (thumbnails[1] == 0) {
					photoFileNames[1] = tempPhotoFileName;
					Bitmap bitmap = BitmapReader.readBigBitmapFromFile(tempPhotoFileName, REQ_WIDTH);
					ibPhoto2.setImageBitmap(bitmap);
					ibPhoto2.invalidate();
					thumbnails[1] = 1;
				}
			}
		} else if (requestCode == REQUEST_FOR_GALLERY) {
			if(resultCode == RESULT_OK){
				isPhotoTaken = true;			
				ContentResolver resolver = getContentResolver();
				Uri uri = data.getData();
				tempPhotoFileName = Helper.getImagePath(resolver, uri);
				Log.v(TAG, "Gallery->ImagePath:" + tempPhotoFileName);
				try {
					Bitmap photo = MediaStore.Images.Media.getBitmap(resolver, uri);
					Bitmap bitmap = Helper.zoomBitmap(photo, REQ_WIDTH, REQ_WIDTH);
					if (thumbnails[0] == 0) {						
						photoFileNames[0] = tempPhotoFileName;
						ibPhoto1.setImageBitmap(bitmap);
						ibPhoto1.invalidate();
						thumbnails[0] = 1;
					}else if (thumbnails[1] == 0) {
						photoFileNames[1] = tempPhotoFileName;
						ibPhoto2.setImageBitmap(bitmap);
						ibPhoto2.invalidate();
						thumbnails[1] = 1;
					}
				} catch (FileNotFoundException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		hideCamera();
	}

在这里为图简单,我就没有写得很规范了,因为我只让它保存两张图片就够了,所以就只是简单的判断第一张图片是不是已经有了,有的话就放到第二个View上显示,然后就把两个按钮都给隐藏了。

然后在上面有一个标志isPhotoTaken,表明这次是保存了图片的,那么在保存这个任务的时候,就要顺便把它对应的图片信息也保存到表上,在Save的时候如下:

if(isPhotoTaken){
	if(thumbnails[0] == 1){
		saveImageLink(taskId, photoFileNames[0]);
		if(thumbnails[1] == 1){
			saveImageLink(taskId, photoFileNames[1]);
		}
	}				
}
而saveImageLink代码如下:

	private void saveImageLink(String taskId, String imagePath){
		ContentValues imageLinkCV = new ContentValues();
		imageLinkCV.put(TableFields.TaskImageLinkFields.TASK_ID, taskId);
		imageLinkCV.put(TableFields.TaskImageLinkFields.IMAGE_PATH, imagePath);
		taskImageLinkManager.insert(imageLinkCV);
	}
	
这样我们就把信息给储存起来了。

到这里,在原来的基础上,这个功能就简单地实现了,哈哈,是可以满足我去比价看图的需求了。

如果真的要做的漂亮一点的话,其实在两个Image那里,大家可以把它实现成3D画廊的效果,然后点击每一个图片,可以打开大图来详细端详(其实我那里是ImageButton来的)。

Android学习小Demo(10)ToDoList的加强版,布布扣,bubuko.com

Android学习小Demo(10)ToDoList的加强版

上一篇:苹果SSL_goto漏洞简介


下一篇:android项目中values中几个文件的作用