web-dev-qa-db-ja.com

Androidでグライドを使用して背景画像を相対レイアウトに設定します

Glideを使用してこれを行うにはどうすればよいですか? cacheイメージをもう一度使用したいです。前もって感謝します。

28
nuhkoca

このようなRelativeLayoutで画像をロードできます。背景に画像を設定するハードな部分を示しています。

4.Xより前のGlideバージョンの場合

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);
        }
    }
});

キャッシングについては、このページを参照してください: キャッシングとキャッシュの無効化

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

このクラスには、さまざまなシナリオでGlideによって自動的に処理される特定のメソッドがあるため、それを実現する最良の方法は、独自のViewTarget実装で機能すると思います。

ViewGroupの抽象的な実装(LinearLayout、RelativeLayoutなど)。

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

}

特定の実装(この場合は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));
    }

}

で動作します。

Glide.with(this.getApplicationContext())
                .load(R.drawable.your_image)
                .asBitmap()
                .into(new LinearLayoutTarget(this.getApplicationContext(), (LinearLayout) yourLinearLayoutInstanceHere));

または、ビットマップなしでさらに簡単に作業できます。

特定の実装。

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);
    }

}

で動作します。

Glide.with(this.getApplicationContext())
                .load(R.drawable.your_image)
                .into(new LinearLayoutTarget((LinearLayout) yourLinearLayoutInstanceHere));
8
Dani

現在、バージョンGlideバージョン4.9.0では、相対レイアウトの背景を次のように設定できます。

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

(SimpleTargetクラスは廃止予定なので、CustomTargetクラスを使用して画像を読み込む)

このようなRelativeLayoutで画像をロードできます。背景に画像を設定するハードな部分を示しています。

4.Xより前のGlideバージョン(非推奨なし)

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

皆さんありがとう。あなたの答えはすべて私を助けてくれました。また、Glideの公式ドキュメントで役立つソリューションを見つけます。 Glide App Moduleを一般的に使用するために切り替えました。

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

0
nuhkoca