Android圖片選擇器--仿QQ

来源: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:之前有人說"仿"寫成“防”了,今兒特意註意了下,求不錯。

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

仿QQ圖片選擇器--Android           仿QQ圖片選擇器--Android     防QQ圖片選擇器--Android

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

  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
更多相關文章
  • Cleave.js 有一個簡單的目的:幫助你自動格式輸入的文本內容。 這個想法是提供一個簡單的方法來格式化您的輸入數據以增加輸入欄位的可讀性。通過使用這個庫,您不需要編寫任何正則表達式來控制輸入文本的格式。然而,這並不意味著取代任何驗證或掩碼庫,你仍應在後端驗證數據。它支持信用卡號碼、電話號碼格式(... ...
  • 2016年9月7日,蘋果發佈iOS 10。2016年9月14日,全新的操作系統iOS 10將正式上線。 作為開發者,如何適配iOS10呢? 1.Notification(通知) 自從Notification被引入之後,蘋果就不斷的更新優化,但這些更新優化只是小打小鬧,直至現在iOS 10開始真正的進 ...
  • 本篇博客以微信為例,給微信脫殼。"砸殼"在iOS逆向工程中是經常做的一件事情,,因為從AppStore直接下載安裝的App是加殼的,其實就是經過加密的,這個“砸殼”的過程就是一個解密的過程。未砸殼的App是無法在Class-dump、Hopper等工具中使用的。所以我們要將App進行砸殼處理。在An ...
  • App Store: 天的故事 行距大果然看著舒服些 1. UI調整,細節優化 App Store: 天的故事 ...
  • 我們繼續之前的 Hypnosister 應用,當用戶開始觸摸的時候,圓形的顏色會改變。 首先,在 JXHypnosisView 頭文件中聲明一個屬性,用來表示圓形的顏色。 加入的三行代碼稱為 JXHypnosisView 的類擴展。類擴展中聲明一個顏色屬性。 在 JXHypnosisView 實現文 ...
  • 藉助View的OnTouchListener介面來監聽listView的滑動,通過比較與上次坐標的大小,判斷滑動方向,並通過滑動方向來判斷是否需顯示或者隱藏對應的佈局,並且帶有動畫效果。 1.自動顯示隱藏Toolbar 首先給listView增加一個HeaderView,避免第一個Item被Tool ...
  • 有段時間沒有認認真真研習過android了,android畢竟是我進這個軟體開發圈子接觸的第一門技術,android已經成了口頭禪之類的東西了.當初學習android的時候大都是草草了事浮於錶面,很多知識點沒有深入學習,導致現在基礎不是很牢靠.在遇到某些高度技術問題的時候思路容易斷,所以我決定用博客 ...
  • 感悟:ViewPager即模仿微信可以左右滑屏。。。 在src下建立4個Fragment ,分別標識Fragment 1,Fragment 2,Fragment 3,Fragment 4.併在AndroidManifest中申明且分別建立4個佈局文件View1,2 3 4.並引入到對應的Fragme ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...