Comment puis-je le faire en utilisant Glide? Je veux cache
image pour l'utiliser également une autre fois. Merci d'avance.
Vous pouvez charger une image dans un RelativeLayout comme ceci. Je vous montre juste la partie difficile qui met une image en arrière-plan.
Pour la version Glide avant 4.X
Glide.with(this).load(imageViewPath).asBitmap().into(new SimpleTarget<Bitmap>(relLayoutWidth, relLayoutHeight) {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
Drawable drawable = new BitmapDrawable(context.getResources(), resource);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
yourRelativeLayout.setBackground(drawable);
}
}
});
Pour la mise en cache, reportez-vous à cette page: Caching and Cache Invalidation .
Mise à jour pour Gide v4:
GlideApp.with(this).load(R.drawable.backgroundimage).into(new SimpleTarget<Drawable>() {
@Override
public void onResourceReady(Drawable resource, Transition<? super Drawable> transition) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
yourRelativeLayout.setBackground(resource);
}
}
});
Je pense que la meilleure façon d'y parvenir fonctionne avec votre propre implémentation de ViewTarget, car cette classe a des méthodes spécifiques à gérer automatiquement par Glide dans différents scénarios.
L'implémentation abstraite de ViewGroup (LinearLayout, RelativeLayout, etc.).
public abstract class ViewGroupTarget<Z> extends ViewTarget<ViewGroup, Z> implements GlideAnimation.ViewAdapter {
public ViewGroupTarget(ViewGroup view) {
super(view);
}
/**
* Returns the current {@link Android.graphics.drawable.Drawable} being displayed in the view using
* {@link Android.widget.ImageView#getDrawable()}.
*/
@Override
public Drawable getCurrentDrawable() {
return view.getBackground();
}
/**
* Sets the given {@link Android.graphics.drawable.Drawable} on the view using
* {@link Android.widget.ImageView#setImageDrawable(Android.graphics.drawable.Drawable)}.
*
* @param drawable {@inheritDoc}
*/
@Override
public void setDrawable(Drawable drawable) {
view.setBackground(drawable);
}
/**
* Sets the given {@link Android.graphics.drawable.Drawable} on the view using
* {@link Android.widget.ImageView#setImageDrawable(Android.graphics.drawable.Drawable)}.
*
* @param placeholder {@inheritDoc}
*/
@Override
public void onLoadStarted(Drawable placeholder) {
view.setBackground(placeholder);
}
/**
* Sets the given {@link Android.graphics.drawable.Drawable} on the view using
* {@link Android.widget.ImageView#setImageDrawable(Android.graphics.drawable.Drawable)}.
*
* @param errorDrawable {@inheritDoc}
*/
@Override
public void onLoadFailed(Exception e, Drawable errorDrawable) {
view.setBackground(errorDrawable);
}
/**
* Sets the given {@link Android.graphics.drawable.Drawable} on the view using
* {@link Android.widget.ImageView#setImageDrawable(Android.graphics.drawable.Drawable)}.
*
* @param placeholder {@inheritDoc}
*/
@Override
public void onLoadCleared(Drawable placeholder) {
view.setBackground(placeholder);
}
@Override
public void onResourceReady(Z resource, GlideAnimation<? super Z> glideAnimation) {
this.setResource(resource);
}
protected abstract void setResource(Z resource);
}
L'implémentation spécifique, dans ce cas pour LinearLayout.
public class LinearLayoutTarget extends ViewGroupTarget<Bitmap> {
private Context context;
public LinearLayoutTarget(Context context, LinearLayout linearLayout) {
super(linearLayout);
this.context = context;
}
/**
* Sets the {@link Android.graphics.Bitmap} on the view using
* {@link Android.widget.ImageView#setImageBitmap(Android.graphics.Bitmap)}.
*
* @param resource The bitmap to display.
*/
@Override
protected void setResource(Bitmap resource) {
view.setBackground(new BitmapDrawable(context.getResources(), resource));
}
}
Travailler avec.
Glide.with(this.getApplicationContext())
.load(R.drawable.your_image)
.asBitmap()
.into(new LinearLayoutTarget(this.getApplicationContext(), (LinearLayout) yourLinearLayoutInstanceHere));
Ou encore plus simple de travailler sans Bitmap.
L'implémentation spécifique.
public class LinearLayoutTarget extends ViewGroupTarget<Drawable> {
public LinearLayoutTarget(LinearLayout linearLayout) {
super(linearLayout);
}
/**
* Sets the {@link Android.graphics.Bitmap} on the view using
* {@link Android.widget.ImageView#setImageBitmap(Android.graphics.Bitmap)}.
*
* @param resource The bitmap to display.
*/
@Override
protected void setResource(Drawable resource) {
view.setBackground(resource);
}
}
Travailler avec.
Glide.with(this.getApplicationContext())
.load(R.drawable.your_image)
.into(new LinearLayoutTarget((LinearLayout) yourLinearLayoutInstanceHere));
Actuellement, dans la version Glide version 4.9.0, vous pouvez définir un arrière-plan pour la disposition relative comme: -
Glide.with(MainActivity.this)
.load(IMAGE_URL)
.into(new CustomTarget<Drawable>() {
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
@Override
public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
mLinearLayout.setBackground(resource);
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
}
});
(la classe SimpleTarget est obsolète, donc en utilisant la classe CustomTarget pour charger l'image)
Vous pouvez charger une image dans un RelativeLayout comme ceci. Je vous montre juste la partie difficile qui met une image en arrière-plan.
Pour la version Glide avant 4.X (sans amortissement)
Glide.with(this).load(ServiceGenerator.BASE_URL + url).into(new CustomTarget<Drawable>() {
@Override
public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
yourRelativeLayout.setBackground(resource);
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
}
});
Merci a tous. Toutes vos réponses m'ont aidé. Je trouve également des solutions utiles avec la documentation officielle de Glide. J'ai basculé vers Glide App Module afin d'en avoir une utilisation courante.