2013-04-01 17 views
7

Ho applicato con successo la libreria Universal Image Loader (versione 1.8.3) alla mia app e sto tentando di ridimensionare l'immagine prima di visualizzarla nell'elemento gridview (perché a volte l'immagine è troppo grande per memorizzarla nella cache.)Come posso ridimensionare un'immagine prima di visualizzarla in una vista con Android Universal Image Loader?

Ecco che cosa sto provando:

... 
BitmapFactory.Options resizeOptions = new BitmapFactory.Options(); 
resizeOptions.inSampleSize = 3; // decrease size 3 times 
resizeOptions.inScaled = true; 

options = new DisplayImageOptions.Builder() 
.showStubImage(R.drawable.blank) 
.showImageForEmptyUri(R.drawable.no_image) 
.cacheInMemory() 
.cacheOnDisc() 
.decodingOptions(resizeOptions) 
.build(); 
... 

Questo codice non fa immagine 3 volte più piccola per qualche motivo.

Qualcuno ha un modo migliore per ridimensionare un'immagine esattamente della densità specificata?

+0

Novoda ImageLoader farà miniature automatiche e la cache su più livelli per voi :-) https://github.com/novoda/ImageLoader – Blundell

risposta

22

docs Leggi Java attentamente:

Options.inSampleSize di opzioni in arrivo non saranno prese in considerazione. La libreria calcola la dimensione del campione più appropriata in base alle opzioni imageScaleType(...).

Anche prendere in ImageSizeUtil.defineTargetSizeForView(ImageView imageView, int maxImageWidth, int maxImageHeight) che definisce dimensioni di destinazione per un'immagine:

formato è definito dai parametri di visualizzazione di destinazione, i parametri di configurazione o dimensioni del display del dispositivo. Dimensioni algoritmo di calcolo:

  1. Prendi l'attuale disegnato getWidth() e getHeight() della vista. Se la vista non è ancora stata disegnata, vai al punto 2.
  2. Ottieni layout_width e layout_height. Se entrambi non hanno un valore esatto, andare al passaggio 3.
  3. Get maxWidth e maxHeight. Se entrambi non sono impostati, andare al passaggio 4.
  4. Ottieni maxImageWidth param (maxImageWidthForMemoryCache) e maxImageHeight param (maxImageHeightForMemoryCache). Se entrambi non sono impostati (uguale a 0), passare al punto 5.
  5. Ottieni dimensioni dello schermo del dispositivo.

definisce UIL risultano formato bitmap secondo imageScaleType e targetSize (e scaleType ImageView s').

+0

The imageScaleType e defineTargetSizeForView sono metodi per la visualizzazione delle immagini, ma ho bisogno di una soluzione per ridimensionare l'immagine prima di metterla nella cache. Ad esempio, ho una vista a griglia con 2 colonne (ogni elemento della griglia è una vista quadrata con imageview 120dip lato interno) e ho due varianti di immagine su un server web, 120x80 px e 640x480 px. L'immagine piccola è troppo piccola per la visualizzazione delle immagini delle app ma, di conseguenza, la cache della cache è molto buona. Se utilizzo immagini di grandi dimensioni, imageview sembra perfetto ma lib non può mettere le immagini nella cache e sempre ri-scaricarle durante lo scrolling di griglia. –

+0

@ user1328818 "Se utilizzo immagini di grandi dimensioni, imageview sembra perfetto ma lib non può mettere le immagini nella cache ..." Che cosa significa? – NOSTRA

+0

ok, lasciami le periphrases, se uso piccole immagini (120x80), la tua libreria li memorizza molto bene e scorre nella mia vista della griglia I che le immagini ottengono dalla cache dopo aver recuperato dal web. Ma se usi immagini grandi (640x480) la tua libreria non le memorizza nella cache e le immagini si caricano ogni volta che scorro la vista della griglia. –

2

È possibile impostare l'altezza di visualizzazione e in xml. L'immagine si adatterà esattamente all'altezza e alla larghezza menzionate. L'immagine scaricata si adatta all'altezza e alla larghezza menzionate nel tuo xml.

Puoi anche dare un'occhiata al problema che è simile al tuo.

https://github.com/nostra13/Android-Universal-Image-Loader/issues/183

+0

Non sono sicuro che mi hai ragione ...comunque grazie per il consiglio –

14

Basta provare questo:

options = new DisplayImageOptions.Builder() 
.showStubImage(R.drawable.blank) 
.showImageForEmptyUri(R.drawable.no_image) 
.cacheInMemory() 
.cacheOnDisc() 
.decodingOptions(resizeOptions) 
.postProcessor(new BitmapProcessor() { 
    @Override 
    public Bitmap process(Bitmap bmp) { 
     return Bitmap.createScaledBitmap(bmp, 300, 300, false); 
    } 
}) 
.build();