仿QQ圖片選擇器--Android

来源:http://www.cnblogs.com/jarek/archive/2016/09/14/5873005.html
-Advertisement-
Play Games

當做一款APP,需要選擇本地圖片時,首先考慮的無疑是系統相冊,但是Android手機五花八門,再者手機像素的提升,大圖無法返回等異常因數,導致適配機型比較困難,微信、QQ都相繼的在自己的APP里集成了圖片選擇功能,放棄了系統提供的圖片選擇器,這裡仿造QQ做了一個本地圖片選擇器,PS:之前有人說"仿" ...


   當做一款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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 回調函數 在javascript中,當一個函數A作為另外一個函數B的其中一個參數時,則稱A函數為回調函數,即A可以在函數B的運行周期內執行(開始,中間,結束)。 舉例來說,有一個函數用於生成node. 又有一個findNodes函數聲明用於查找所有節點,然後通過callback回調進行執行代碼。 關 ...
  • 1、DIV+CSS定義及優勢 Div+css 是什麼? Div+css 是一種目前比較流行的網頁佈局技術 Div 來存放需要顯示的數據(文字,圖表..) , css 就是用來指定怎樣顯示, 從而做到數據和顯示相互的效果 Div+css 優勢 採用DIV+CSS模式的網站具有以下優勢: 表現和內容相分 ...
  • 很久前的某一天,一位大神問我,你知道ES6相對於ES5有什麼改進嗎? 我一臉懵逼的反問,那個啥,啥是ES5、ES6啊。 不得不承認與大神之間的差距,回來深思了這個問題,結合以前的知識,算是有了點眉目。 JavaScript一種直譯式腳本語言,是一種動態類型、弱類型、基於原型的語言,我們知道javas ...
  • 可見上邊的樣式可實現半透明的遮罩層,我們只需將一個div標簽放置在我們的body中,如下: 在需要遮罩的時候,我們只需將mask變成可見的即可: ...
  • 2、日期類型數值轉換 3、漂亮的隨機代碼 4、合併數組 5、用0補全位數 6、交換值 7、刪除數組元素 8、獲取最大值和最小值 9、拷貝數組 10、日常中true、false判斷 11、獲取今天的0點:0分:0秒和23點:59分:59秒 ...
  • 看CSS3時發現了一個nth-of-type選擇器,發現平時基本沒見過用,就研究了一下,w3c是這樣說明的: :nth-of-type(n) 選擇器匹配屬於父元素的特定類型的第 N 個子元素的每個元素. 看起來和nth-child很像 :nth-child(n) 選擇器匹配屬於其父元素的第 N 個子 ...
  • 原作:Getting started with jQuery Mobile —— Matthew David 翻譯:filod 譯文:http://blog.filod.net/jquerymobile-2/295.html 轉載聲明:請註明原作、翻譯以及譯文鏈接。 你每天都會對著它講話,和它玩游戲 ...
  • 之前看到一篇文章介紹到App之間的五種通信方式,它分別有URL Scheme,Keychain,UIPastedboard,UIDocumentInteractionController以及利用socket進行本地通信。前面4種都有用到過,也相對比較簡單,幾行代碼的事。對於最後一種之前一直沒用到過( ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...