前两天去超市逛东西,问老板娘这个东西多少钱,那个东西多少钱,但是一两分钟后就搞混了,当时就想,我不是写了一个todo的吗,可以再拍照放上去,这样就有对比啦!
于是兴冲冲地赶回家,把功能给实现了,虽然这功能到处都有,但是自己实现出来的就是不一样啊,界面丑点也是自己的孩子啊,而且这孩子会长大啊,可以继续完善的嘛。
由上面两张图可以看到:
1)在屏幕上方专门挖出了两块地来放两个Image
2)在右下角放了两个button,一个是挑选图片,一个是直接打开照相机照相,然后返回的图片就会放到这两个Image上面。
3)那么在后台肯定要先利用一张表来存放图片跟任务的关联的,在保存任务的时候,顺便把图片的路径也保存进去。
我们先来看看数据库的表的简单设计吧:
Task 表:
task_image_link 表:
可以看到,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来的)。