English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Quando si crea un'app, quando si deve selezionare un'immagine locale, il primo pensiero è ovviamente la galleria del sistema, ma i telefoni Android sono molto vari, e con l'aumento della risoluzione dei pixel, problemi come l'immagine di grandi dimensioni che non può tornare e altri fattori eccezionali rendono difficile l'adattamento ai modelli di telefono, WeChat e QQ hanno integrato la funzione di selezione delle immagini nei propri APP, abbandonando il selettore di immagini fornito dal sistema, qui ho imitato QQ per fare un selettore di immagini locale, PS: qualcuno ha detto che "imitare" è stato scritto come "difendere", oggi ho prestato attenzione e chiedo di non farlo male.
Prima di tutto, ecco una immagine di esempio, senza immagini non c'è verità! ~~~
L'effetto realizzato è più o meno così:
1. Seleziona un elemento: vai alla cartella di selezione delle immagini locali, seleziona la cartella e entra in tutte le immagini nella cartella, seleziona un'immagine e torna all'indirizzo dell'immagine selezionata.
2. Seleziona più elementi: vai alla cartella delle immagini, seleziona una cartella, seleziona un'immagine, clicca sul cerchio piccolo nell'angolo in alto a destra, seleziona l'immagine, clicca su un'altra area dell'immagine, visualizza l'anteprima, visualizza le immagini selezionate, puoi selezionare immagini da cartelle diverse.
Per ottenere questo effetto, è necessario fare alcune cose:
1. Leggi tutte le cartelle locali con immagini:
Here we use ContentResolver to read media files
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);
This is a simple SQL query statement, groups by folder, and returns the number of images in the folder.
2. Read all images in the specified folder:
When selecting a directory, it is necessary to read all the images in that directory.
String[] columns = new String[]{MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA}; /*Query the images whose file path contains the specified folder path above--this ensures that the files queried belong to the current folder*/ 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);
La query di ricerca qui è basata sul nome del file per filtrare, tutte le immagini il cui percorso contiene il percorso della cartella sono considerate immagini della cartella
3.Interazione UI
Prima di visualizzare tutte le cartelle contenenti immagini, si carica asincronamente le cartelle con immagini, viene visualizzata la lista dopo il successo della lettura, qui viene utilizzato RecyclerView per visualizzare le informazioni della lista. Quando si clicca su un目录, si legge il contenuto delle immagini di quel 目录, nell'interfaccia di visualizzazione delle immagini, è necessario notare che ogni volta che si clicca su un'immagine, si verifica se l'immagine è già nell'elenco di selezione. Se è presente, si elimina; se non è presente, si aggiunge. Qui viene utilizzato il framework open-source ImageLoader per la caricamento delle immagini
if (mSelectlist.contains(imageBean)) { // Se l'elemento cliccato è un'immagine già selezionata, elimina mSelectlist.remove(imageBean); subSelectPosition(); } else { // Non è nell'elenco di selezione, aggiungi 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(); } // Notifica che l'elemento cliccato è cambiato notifyItemChanged(position);
Inoltre, se si elimina un'immagine, il numero di sequenza dell'immagine cambia corrispondentemente e si notifica l'aggiornamento dell'interfaccia utente.
Quando si passa da un'Activity all'altra, poiché è necessario trasmettere l'elenco delle immagini List, l'elenco contiene oggetti di classi entità personalizzate. All'inizio ho considerato di utilizzare intent per trasmettere, ma dopo aver trasmesso l'elenco, quando si confronta se l'oggetto è lo stesso tramite list.get(positon).contains, è sempre diverso. Puoi verificare questo. Pertanto, qui ho definito una classe osservatore per salvare tutte le immagini selezionate e le immagini nella cartella, e quando si visualizza una grande immagine, se si seleziona o annulla la selezione di un'immagine, si può aggiornare tramite l'osservatore. Inoltre, se si elimina un'immagine, il numero di sequenza dell'immagine cambia corrispondentemente e si notifica l'aggiornamento dell'interfaccia utente.
/** * Notifica che la selezione dell'immagine è cambiata */ public void updateImageSelectChanged () { setChanged(); notifyObservers(imgSelectObj); }
Bene, con il tutto sopra, puoi utilizzare il nostro Image Selector:
In caso di selezione singola, chiamare dove necessario:
/*Scelta singola, i parametri corrispondono a context, callback*/ FolderListActivity.startSelectSingleImgActivity(this, 2); In caso di selezione multipla: /*I parametri corrispondono a context, codice di callback, lista delle immagini trasmesse, numero massimo opzionale di immagini*/ FolderListActivity.startFolderListActivity(this, 1, null, 9);
Infine, ricevi i dati delle immagini restituiti in onActivityResult dell'Activity:
List<ImageFolderBean> list = (List<ImageFolderBean>) data.getSerializableExtra("list");
Indirizzo di download del codice sorgente:
https://github.com/JarekWang/photoselect
La seguente è l'intera descrizione dell'imitazione di QQ Image Selector per Android che l'editor ha introdotto agli utenti, sperando che sia utile a tutti!
Dichiarazione: il contenuto di questo articolo è stato raccolto da Internet, il diritto d'autore è dell'autore originale, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, il sito web non detiene i diritti di proprietà, non è stato elaborato manualmente e non assume responsabilità legali correlate. Se trovi contenuti sospetti di violazione del copyright, ti preghiamo di inviare una e-mail a notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare, fornendo prove pertinenti. Una volta verificata, il sito web eliminerà immediatamente il contenuto sospetto di violazione del copyright.