前兩天去超市逛東西,問老闆娘這個東西多少錢,那個東西多少錢,但是一兩分鐘後就搞混了,當時就想,我不是寫了一個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的方法來獲得返回的狀態跟資料,如下:
@Overrideprotected 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來的)。
沒有實現3D,但是實現了畫廊的效果,大家如果有興趣,可以看一下,原始碼也在那邊下載:
Android學習小Demo(10)ToDoList的改進版之ViewPager顯示多個圖片