2013-01-21 18 views
15

Sto costruendo una galleria molto semplice su Android, mostra l'ultima immagine sulla cartella della fotocamera e l'utente può scorrere a sinistra per vedere la precedente.Android come fare la diapositiva delle immagini?

Ho completato un'implementazione utilizzando un viewpager e un pagerAdapter utilizzando sampleSize per ridimensionare le immagini. Il mio problema è che l'implementazione non è efficiente come l'app gallery di default, ogni volta che si fa scorrere un'immagine si deve attendere circa 200 ms per il successivo da caricare. Quindi sostanzialmente la mia idea su come implementarla non sta funzionando.

Come posso farlo in modo efficiente e, se possibile, con un'implementazione che consenta di ingrandire e rimpicciolire in seguito?


Questo sembra essere molto promettente, ma non so come implementarlo con i file invece di drawable http://www.androidviews.net/2012/11/photoview/


EDIT:

Sono riuscito a migliorare la velocità un po 'utilizzando photoview (un viewpager compromesso), tuttavia richiede troppo per convertire i percorsi di file in bitmap o drawable.

ho provato questi due metodi suggeriti da dilix e iDroid Explorer:

// Method A 
Drawable d = Drawable.createFromPath(imagePath); 
imageView.setImageDrawable(d); 

// Method B 
Bitmap myBitmap = BitmapFactory.decodeFile(imagePath); 
imageView.setImageBitmap(myBitmap); 

Ma entrambi produrre errori Bitmap too large to be uploaded into a texture. Ho bisogno di ottenere l'immagine per imageView il più velocemente possibile e in qualche modo ignorare questo errore e forse otterrò una velocità decente. In questo momento sto ridimensionando le immagini e convertendole in un drawable ma non è molto efficiente.

+0

È possibile utilizzare Galleria http://developer.android.com/reference/android/widget/Gallery.html –

+0

Dovete sapere che il ritardo si stanno notando è a causa del polling dei file! Quindi, se noti che androidviews.net è molto veloce, ricorda che sta usando drawable e non file di immagini! –

risposta

3

controllare questo sito impressionante: http://www.androidviews.net/ e forse questo è ciò che si vuole: http://www.androidviews.net/2012/11/photoview/

Ha pagina di scorrimento, zoom e panoramica di cui hai bisogno ho usato nel mio progetto con alcune modifiche e pigro il caricamento delle immagini . Funziona esattamente come necessario.

+1

L'ho appena testato, funziona benissimo. Ma ho esaminato il codice e non vedo alcun modo per implementarlo con i file di immagine anziché con i drawable. Inizierò a verificare se riesco a combinarlo con la mia implementazione ma non penso che funzionerà. – lisovaccaro

+0

Sto usando l'implementazione di photoview combinata con 'imageView.setImageDrawable (GetDrawable (imagePath, 150, 150));' per convertire i percorsi dei file della scheda SD in drawable. Tuttavia è ancora abbastanza inefficiente. Forse c'è un modo per view.setImage con un percorso file? (Nessuna conversione richiesta) – lisovaccaro

+0

Questo mi ha portato sulla strada giusta. Devo capire come caricare le immagini pigre e magari cambiare l'animazione di viewpager se è possibile – lisovaccaro

1

1)

This looks promising but I don't know how to implement it with files instead of drawables http://www.androidviews.net/2012/11/photoview/

Dovete memorizzare non elenco di drawable in te adattatore, ma i collegamenti ai file sulla scheda SD e poi caricarlo.

2) Ma posso immaginare che il file anziché i drawable non sarà così efficiente perché per caricare i file devi analizzarli dalla scheda SD.

Penso che si possa risparmiare tempo caricando più immagini contemporaneamente nella memoria (compresse) e quando si esegue lo swype su un'altra immagine si avrà già l'immagine e la memoria e mentre si esegue lo swyping è possibile iniziare a caricare altre immagini in memoria.

In caso di apertura della galleria non è possibile caricare le immagini e caricarle dopo quasi essersi fermati.

È il problema principale: consumo di memoria e prestazioni.

UPDATE

Credo che meglio di esplorare questo da soli sarà esplorare codice esistente di google galleria: https://github.com/CyanogenMod/android_packages_apps_Gallery

Come ho controllato - loro archivio di cache (quasi come ho già detto sul caricamento multiplo bitmap) e memorizza solo immagini ridimensionate - sembra essere efficiente.

+0

Forse ho frainteso il tuo primo punto, ho un elenco di file nel mio adattatore ma devo convertirli in drawable dato che non conosco altro modo per aggiungerli a una vista immagine. Faccio qualcosa di simile a questo ('imageView. setImageDrawable (GetDrawable (imagePath, 150, 150)); '). C'è un modo per visualizzare l'immagine senza fare questa conversione? Probabilmente si risparmiano molte risorse – lisovaccaro

+0

Puoi caricare bitmap (compresso e puoi caricare per esempio 3 in una volta - corrente, precedente e successiva) e caricare questa bitmap nella vista in questo modo: http://stackoverflow.com/questions/4181774/show-image-view-from-file-path-in-android – dilix

+0

Ho appena provato l'implementazione dall'altra domanda ma ho ricevuto l'errore: 'Bitmap troppo grande per essere caricato in una trama (2560x1920, max = 2048x2048) 'sembra vicino però. Questo è legato alla compressione? Non so come caricarli compressi, sai come aggirare questo errore? – lisovaccaro

1

Vedere la documentazione ufficiale per un ottimo esempio che vi guiderà attraverso l'uso di bitmap con un viewpager in modo efficiente. Dovresti usare una cache delle immagini che sono già state caricate e le immagini dovrebbero essere caricate al di fuori del thread dell'interfaccia utente. Devi anche ridimensionare l'immagine alla dimensione minima necessaria per il tuo display (in genere due potenze: nota che l'immagine non si adatta sempre a ciò che gli chiedi!) ViewPager carica anche le immagini in background per prepararsi diapositiva successiva, che è impostato con il metodo setOffScreenPageLimit (il valore predefinito è generalmente buona, penso che sia 2.)

https://developer.android.com/training/displaying-bitmaps/index.html

+0

All'inizio pensavo che l'esempio fosse orribile ma che consentisse uno scorrimento veloce. Tuttavia, per iniziare è sempre necessario. Vedrò se posso implementarlo – lisovaccaro

+0

Ho cercato di caricare i file di immagini in modo dinamico ma sembra impossibile averli dentro imageUrls che è definitivo e statico. Si prega di verificare quello che ho provato forse è possibile capire una soluzione: http://pastebin.com/raw.php?i=LDAwU7Mx – lisovaccaro

+0

Intendevi chiamare routeList, imageList? Quindi dato che imageUrls è una variabile finale, puoi assegnarla solo una volta. Puoi usare 'public final static String [] imageUrls = imageList.toArray (new String [imageList.size()])' – ndw

1

io non sono sicuro se hai soluzione corretta o meno. Ma se si vuole continuare con la propria implementazione con il tuo link dato poi:

http://www.androidviews.net/2012/11/photoview/ //this link is given in your question 

E si può vedere this SO per come convertire il percorso del file per drawable. Ora, puoi disegnare il tuo file specificato e implementarlo sul link che hai fornito.

Penso che il collegamento funzionerà bene.

Sentitevi liberi di commenti.

+0

Ho appena provato la tua idea (sia il percorso del file in bitmap che il filepath in Drawable) ma entrambi restituiscono lo stesso errore: 'W/OpenGLRenderer (20913): Bitmap troppo grande per essere caricato in una trama' – lisovaccaro

+0

Nel punto in cui sto usando photoview combinato con una funzione che ridimensiona la bitmap prima di usarla ma non penso che la funzione sia molto efficiente, Ho bisogno di ottenere più rapidamente il file sul imageview – lisovaccaro

+0

l'immagine proviene da Internet? –

Problemi correlati