2013-06-04 2 views
2

J'utilise la bibliothèque Android-Universal-Image-Loader pour charger/mettre en cache des images distantes, et j'ai creusé à travers la source pendant un bon moment pour trouver un moyen de récupérer l'image originale taille (largeur et hauteur) pour mon ImageLoadingListener.Universal Image Loader obtenir la taille de l'image originale

L'exemple de code ci-dessous est juste pour vous donner une idée de ce que j'essaie de faire.

protected class ViaImageLoadingListener implements ImageLoadingListener { 
    final SelectableImageView selectableImageView ; 


    protected ViaImageLoadingListener(SelectableImageView selectableImageView) { 
     this.selectableImageView = selectableImageView; 
    } 

    @Override 
    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { 

      selectableImageView.setImageBitmap(loadedImage); 
      // loadedImage.getWeight() will not return the original 
      // dimensions of the image if it has been scaled down 
      selectableImageView.setOriginalImageSize(width, height); 
      selectableImageView.invalidate(); 


    } 

J'ai essayé étendre la classe ImageDecoder et la classe ImageLoader pour trouver un rond-point moyen de relier le décodeur (dont je peux obtenir la taille de l'image originale dans la méthode #prepareDecodingOptions) à mon ImageLoadingListener personnalisé. Mais l'objet de configuration est privé et les champs (y compris le décodeur) sont inaccessibles des sous-classes (et se sent comme une manière trop hacky de résoudre le problème de toute façon). Est-ce que j'ai négligé un simple moyen "intégré" d'obtenir la taille de l'image d'origine sans perdre l'avantage de la mise à l'échelle/gestion de la mémoire de l'UIL?

Répondre

3

Il est impossible de passer la taille de l'image d'origine de ImageDecoder à l'écouteur via les paramètres.

Je pense que la solution pour vous est la suivante. Étendre BaseImageDecoder et créer la carte en elle pour garder les tailles d'image:

Map<String, ImageSize> urlToSizeMap = new ConcurrentHashMap<String, ImageSize>();

Puis outrepasser defineImageSizeAndRotation(...):

protected ImageFileInfo defineImageSizeAndRotation(InputStream imageStream, String imageUri) throws IOException { 
    ImageFileInfo info = super.defineImageSizeAndRotation(imageStream, imageUri); 
    urlToSizeMap.put(imageUri, info.imageSize); // Remember original image size for image URI 
    return info; 
} 

Note: info.imageSize ne compilera pas parce que imageSize n'est pas visible. Je vais le corriger dans la prochaine version (1.8.5) mais vous pouvez utiliser la réflexion pour le moment.

Mettez ce décodeur en configuration et gardez la référence à ce décodeur n'importe où (ou vous pouvez rendre urlToSizeMap statique pour accéder à partir de l'écouteur).

Puis dans votre écouteur:

@Override 
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { 
     selectableImageView.setImageBitmap(loadedImage); 

     ImageSize imageSize = decoder.urlToSizeMap.get(imageUri); 
     selectableImageView.setOriginalImageSize(imageSize.getWidth(), imageSize.getHeight()); 
     selectableImageView.invalidate(); 
} 
+0

IMAGESIZE et exif sont encore protégées, pas publiques et je suis à l'aide 1.8.6. Et pourquoi créer un nouvel instacne d'ImageFileInfo au retour, qu'est-ce qui pourrait ne pas fonctionner si retourner l'info? – xmen

+0

Il semble que je me trompe. Je publierai v1.8.7-SNAPSHOT avec les changements nécessaires bientôt. – NOSTRA

0

Il semble que vous n'avez pas à mettre en œuvre propre ImageLoadingListener si vous voulez obtenir la taille originale de l'image chargée. J'utilise la méthode loadImage et il semble que bitmap reçu ait des tailles d'origine. v1.8.6 UIL

loader.loadImage(pin_url, option, new SimpleImageLoadingListener() { 
     @Override 
     public void onLoadingFailed(String imageUri, View view, 
            FailReason failReason) { 
      showErrorLayout(); 
     } 

     @Override 
     public void onLoadingComplete(String imageUri, View view, 
             Bitmap loadedImage) { 

      // width - device width 
      // height - OpenGl maxTextureSize 
      if (width < loadedImage.getWidth() || height < loadedImage.getHeight()) { 
       // handle scaling 
      } 

      iv.setImageBitmap(loadedImage); 


     } 
    }); 
Questions connexes