仿QQ圖片選取器--Android,

來源:互聯網
上載者:User

仿QQ圖片選取器--Android,

   當做一款APP,需要選擇本地圖片時,首先考慮的無疑是系統相簿,但是Android手機五花八門,再者手機像素的提升,大圖無法返回等異常因數,導致適配機型比較困難,、QQ都相繼的在自己的APP裡整合了圖片選擇功能,放棄了系統提供的圖片選取器,這裡仿造QQ做了一個本地圖片選取器,PS:之前有人說"仿"寫成“防”了,今兒特意注意了下,求不錯。

  先上一張,無圖無真相啊~~~

  實現的效果大概是這樣的:

  1.單選:跳轉到本地圖片選擇檔案夾,選擇檔案夾後,進入到該檔案夾下的所有圖片,選擇某張圖片後,返回改圖片地址資訊

  2.多選:跳轉到圖片檔案夾,選擇一個檔案夾,選擇圖片,點擊右上方的小圓圈,選中該圖,點擊圖片其他地區,查看大圖,點擊預覽,查看已選圖片,可以跨檔案夾選擇圖片。

 

為了達到這效果,需要做幾件事:

  1.讀取本地所有 有圖片的檔案夾:

    這裡用ContentResolver讀取媒體檔案

 String[] columns = {MediaStore.Images.Media._ID, MediaStore.Images.Thumbnails.DATA, MediaStore.Images.Media.DATA, MediaStore.Images.Media.BUCKET_ID,                        MediaStore.Images.Media.BUCKET_DISPLAY_NAME, "COUNT(1) AS count"}; String selection = "0==0) GROUP BY (" + MediaStore.Images.Media.BUCKET_ID; String sortOrder = MediaStore.Images.Media.DATE_MODIFIED; Cursor cursor = contentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, selection, null, sortOrder);

這是一個簡單的SQL查詢語句,按檔案夾分組,並返迴文件夾片數。

 2.讀取指定檔案夾下所有圖片:

  當選擇某一目錄時,需要讀取該目錄下所有圖片了。

 String[] columns = new String[]{MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA};/*查詢檔案路徑包含上面指定的檔案夾路徑的圖片--這樣才能保證查詢到的檔案屬於當前檔案夾下*/ String whereclause = MediaStore.Images.ImageColumns.DATA + " like'" + folderPath + "/%'"; Log.i("queryGalleryPicture", "galleryPath:" + folderPath); Cursor corsor = c.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, whereclause, null, null);

   這裡的查詢語句是根據檔案名稱字來過濾的,只要圖片路徑包含檔案夾路徑的,則為該檔案夾下的圖片

  3.UI互動

   首先在展示所有包含圖片的檔案夾時,非同步載入有圖片的檔案夾,讀取成功後列表展示,這裡用的RecyclerView展示列表資訊,點擊某一目錄時,在讀取改目錄下的圖片,在圖片展示頁裡,需要注意的是,每次點擊判斷當前點擊圖片是否已在挑選清單中,若在,刪除,不在,添加。這裡圖片載入用了開源架構ImageLoader

                 if (mSelectlist.contains(imageBean)) { //點擊的item為已選過的圖片時,刪除                     mSelectlist.remove(imageBean);                     subSelectPosition();                 } else { //不在挑選清單裡,添加                     if (mSelectlist.size() >= maxCount) {                         Toast.makeText(mContext, mContext.getResources().getString(R.string.publish_select_photo_max, maxCount), Toast.LENGTH_SHORT).show();                         return;                     }                     mSelectlist.add(imageBean);                     imageBean.selectPosition = mSelectlist.size();                 }                 //通知點擊項發生了改變                 notifyItemChanged(position);

  同時沒刪除一張圖片,圖片上的序號相應的作改變,然後通知改變項更新UI。

 

  不同Activity跳轉時,因為要傳遞圖片列表List,list裡是自訂實體類,剛開始考慮過用intent傳遞,但是intent傳遞後,通過list.get(positon).contains比較是否同一對象時,始終是不同對象,大家可以去驗證下。所以這裡定義了一個觀察者的類,去儲存選擇的圖片和檔案夾下的所有圖片,同時查看大圖時,若選擇了一張或者取消選擇了一張圖,通過觀察者通知更新即可

    /**     * 通知圖片選擇已改變     */    public void updateImageSelectChanged () {        setChanged();        notifyObservers(imgSelectObj);    }

 

好了,有了以上的,就可以使用我們的圖片選取器了:

單選時,在需要的地方調用:

   /*單選,參數對應的是context, 回調*/        FolderListActivity.startSelectSingleImgActivity(this, 2);

多選時:

/*參數對應context, 回調code, 傳入的圖片List, 可選的最大張數*/        FolderListActivity.startFolderListActivity(this, 1, null, 9);

最後Activity的onActivityResult中接收返回的圖片資料:

 List<ImageFolderBean> list = (List<ImageFolderBean>) data.getSerializableExtra("list");

 

源碼:

 https://github.com/JarekWang/photoselect

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.