web-dev-qa-db-fra.com

Définir l'image d'arrière-plan sur une disposition relative à l'aide de Glide dans Android

Comment puis-je le faire en utilisant Glide? Je veux cache image pour l'utiliser également une autre fois. Merci d'avance.

28
nuhkoca

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);
                }
            }
        });
50
Chintan Desai

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));
8
Dani

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) {

                        }
                    });
3
Yashwant Vadali

(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) {
            }

        });
0
DeePanShu

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.

https://medium.com/@nuhkocaa/manage-all-your-glides-in-a-single-class-with-glidemodule-on-Android-4856ee4983a1

0
nuhkoca