J'ai le code suivant pour charger une image dans Picasso, en utilisant un dessin pour l'affichage de l'espace réservé pendant le téléchargement de l'image. Ce que je veux cependant, c’est une barre de défilement animée, de style barre de progression, qui s’anime autour pendant le chargement de l’image, comme dans la plupart des applications professionnelles. Picasso ne semble pas supporter cela, seulement des images statiques pouvant être dessinées. Y a-t-il un moyen de le faire fonctionner avec Picasso ou dois-je faire quelque chose de différent?
Picasso.with(context).load(url)
.placeholder(R.drawable.loading)
.error(R.drawable.image_download_error)
.into(view);
Comment avoir une image d'animation de progression de chargement en utilisant l'espace réservé Picasso:
J'ai facilement résolu ce problème en utilisant un objet xml à rotation animée.
Pas:
progress_image.png
/res/drawable/progress_animation.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:gravity="center">
<animated-rotate xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:drawable="@drawable/progress_image"
Android:pivotX="50%"
Android:pivotY="50%" />
</item>
</layer-list>
Picasso chargement:
Picasso.with( context )
.load( your_path )
.error( R.drawable.ic_error )
.placeholder( R.drawable.progress_animation )
.into( image_view );
J'ai implémenté le dialogue de progression jusqu'au téléchargement de l'image et sa très simple. Prenez votre ImageView dans une disposition relative et placez le chargeur de progression sur la même image. Appliquez le code ci-dessous et gérez uniquement la visibilité de la boîte de dialogue de progression.
holder.loader.setVisibility(View.VISIBLE);
holder.imageView.setVisibility(View.VISIBLE);
final ProgressBar progressView = holder.loader;
Picasso.with(context)
.load(image_url)
.transform(new RoundedTransformation(15, 0))
.fit()
.into(holder.imageView, new Callback() {
@Override
public void onSuccess() {
progressView.setVisibility(View.GONE);
}
@Override
public void onError() {
// TODO Auto-generated method stub
}
});
}
Prendre plaisir. :)
Picasso ne supporte malheureusement pas les espaces réservés.
Une façon de contourner ce problème consiste à placer votre ImageView dans un FrameLayout avec le dessin animé en dessous. Ainsi, lorsque Picasso charge l’image, il se charge par-dessus l’espace réservé animé, ce qui donne à l’utilisateur l’effet recherché.
Alternativement, vous pouvez charger l'image dans un Target . La barre de progression s'afficherait par défaut. Lorsque la méthode onBitmapLoaded est appelée, vous pouvez la masquer et afficher l'image. Vous pouvez voir une implémentation de base de ceci ici
Pour tous ceux qui essaient d'utiliser la technique de DBragion: Assurez-vous de disposer de la dernière version de Picasso, sinon elle ne tournera pas Le mien ne fonctionnait pas avant l'utilisation de la version 2.5.2.
compile 'com.squareup.picasso:picasso:2.5.2'
Je l'ai fait fonctionner de la manière suivante:
Créé un drawable (trouvé quelque part sur Internet) et le mettre dans le res/drawable:
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:fromDegrees="90"
Android:pivotX="50%"
Android:pivotY="50%"
Android:toDegrees="360">
<shape
Android:innerRadiusRatio="3"
Android:shape="ring"
Android:thicknessRatio="7.0">
<gradient
Android:angle="0"
Android:centerColor="#007DD6"
Android:endColor="#007DD6"
Android:startColor="#007DD6"
Android:type="sweep"
Android:useLevel="false" />
</shape>
Dans mon article pour l'élément ProgressBar ajouté à GridView:
<ProgressBar
Android:id="@+id/movie_item_spinner"
Android:layout_width="@dimen/poster_width"
Android:layout_height="@dimen/poster_height"
Android:progressDrawable="@drawable/circular_progress_bar"/>
Dans Adapter, Target Object ajouté avec les paramètres suivants, où poster et spinner sont des références à ImageView et ProgressBar:
// Cible pour afficher/masquer ProgressBar sur ImageView
final Target target = new Target() {
@Override
public void onPrepareLoad(Drawable drawable) {
poster.setBackgroundResource(R.color.white);
spinner.setVisibility(View.VISIBLE);
}
@Override
public void onBitmapLoaded(Bitmap photo, Picasso.LoadedFrom from) {
poster.setBackgroundDrawable(new BitmapDrawable(photo));
spinner.setVisibility(View.GONE);
}
@Override
public void onBitmapFailed(Drawable drawable) {
poster.setBackgroundResource(R.color.white);
}
};
Les résultats seront les mêmes que lors du chargement - le cercle tourne (désolé pour cette capture d'écran, mais les images apparaissent trop rapidement): ScreenShot
Dans ce link , Jake Wharton a déclaré:
Nan. Nous utilisons Android BitmapFactory pour tout le décodage d'image et il n'a pas de support GIF animé (malheureusement).
Alors tu ne peux pas
Ajoutez simplement un attribut de forme dans la réponse de DBragion comme ci-dessous et cela fonctionnera à merveille. Bonne codage.
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item>
<shape
Android:shape="rectangle">
<size
Android:width="200dp"
Android:height="200dp"/>
<solid
Android:color="#00FFFFFF"/>
</shape>
</item>
<item Android:gravity="center">
<animated-rotate xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:drawable="@drawable/spinner"
Android:pivotX="50%"
Android:pivotY="50%" />
</item>
</layer-list>
Vous pouvez aussi utiliser Glide:
Glide.with(activity).load(url)
.apply(RequestOptions.centerInsideTransform())
.placeholder(R.drawable.progress_animation)
.into(imageview);
J'ai trouvé réponse à cette question!
Voir: https://github.com/square/picasso/issues/427#issuecomment-26627625
En plus de la réponse de @DBragion, essayez ci-dessous.
Maintenant, nous pouvons fixer la hauteur et la largeur!
image_view.scaleType = ImageView.ScaleType.CENTER_INSIDE
picasso.load(your_path)
.fit()
.centerCrop()
.noFade()
.placeholder(R.drawable. progress_animation)
.into(image_view)
Je pense qu'il y a deux points clés.
utilisez noFade ()
définissez scaleType sur image_view sur "CENTER_INSIDE"
Il suffit d'utiliser Picasso PlaceHolder
Picasso.get()
.load(datas[position].artist?.image)
.placeholder(R.drawable.music_image)
.error(R.drawable.music_image)
.into(holder.cardViewImage)