web-dev-qa-db-ja.com

Androidグライドプレースホルダーのサイズ

Android Glideに問題があります。画像をすばやく交換しようとしていますが、すべてのプレースホルダーサイズになり、プレースホルダー画像のサイズが非常に小さくなっています。どうすればよいですか?

ロードされているかどうかを確認する必要があるかもしれませんが、方法がわかりません。

Glide.with(this)
    .load(quest.get(id).getImage())
    .placeholder(R.drawable.load)
    .fitCenter()
    .crossFade()
    .into(imageView);
11
TavoTevas

Glide GitHubページの this の問題によると、Glideのリクエストに次の行を追加することで修正できます。

  .dontAnimate()

それはあなたの完全な負荷線を作るでしょう:

  Glide.with(context)
            .load("http://lorempixel.com/150/150")
            .placeholder(R.drawable.no_image)
            .override(100, 100)
            .dontAnimate()
            .into(imageView);
15
Ashkan Ghodrat

私は以下のようにそれをします:

スケールタイプを最初にプレースホルダーの必要に応じて設定し、リスナーをアタッチして、画像のダウンロード後にダウンロードした画像の必要に応じてスケールタイプを再度変更するという考え方です。

//ivBuilderLogo = Target ImageView
//Set the scale type to as required by your place holder
//ScaleType.CENTER_INSIDE will maintain aspect ration and fit the placeholder inside the image view
holder.ivBuilderLogo.setScaleType(ImageView.ScaleType.CENTER_INSIDE); 

//AnimationDrawable is required when you are using transition drawables
//You can directly send resource id to glide if your placeholder is static
//However if you are using GIFs, it is better to create a transition drawable in xml 
//& use it as shown in this example
AnimationDrawable animationDrawable;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop)
     animationDrawable=(AnimationDrawable)context.getDrawable(R.drawable.anim_image_placeholder);
else
     animationDrawable=(AnimationDrawable)context.getResources().getDrawable(R.drawable.anim_image_placeholder);
animationDrawable.start();

Glide.with(context).load(logo_url)
                   .placeholder(animationDrawable)
                   .listener(new RequestListener<String, GlideDrawable>() {
                        @Override
                        public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource)
                        {
                           return false;
                        }

                        //This is invoked when your image is downloaded and is ready 
                        //to be loaded to the image view
                        @Override
                        public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource)
                        {   
                        //This is used to remove the placeholder image from your ImageView 
                        //and load the downloaded image with desired scale-type(FIT_XY in this case)
                        //Changing the scale type from 'CENTER_INSIDE' to 'FIT_XY' 
                        //will stretch the placeholder for a (very) short duration,
                        //till the downloaded image is loaded
                        //setImageResource(0) removes the placeholder from the image-view 
                        //before setting the scale type to FIT_XY and ensures that the UX 
                        //is not spoiled, even for a (very) short duration
                            holder.ivBuilderLogo.setImageResource(0);
                            holder.ivBuilderLogo.setScaleType(ImageView.ScaleType.FIT_XY);
                            return false;
                        }
                    })
                    .into( holder.ivBuilderLogo);

私のトランジションドローアブル(R.drawable.anim_image_placeholder):

(静止画像を使用する場合は不要)

<?xml version="1.0" encoding="utf-8"?>
<animation-list
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:oneshot="false">
    <item Android:drawable="@drawable/loading_frame1" Android:duration="100" />
    <!--<item Android:drawable="@drawable/loading_frame2" Android:duration="100" />-->
    <item Android:drawable="@drawable/loading_frame3" Android:duration="100" />
    <!--<item Android:drawable="@drawable/loading_frame4" Android:duration="100" />-->
    <item Android:drawable="@drawable/loading_frame5" Android:duration="100" />
    <!--<item Android:drawable="@drawable/loading_frame6" Android:duration="100" />-->
    <item Android:drawable="@drawable/loading_frame7" Android:duration="100" />
    <!--<item Android:drawable="@drawable/loading_frame8" Android:duration="100" />-->
    <item Android:drawable="@drawable/loading_frame9" Android:duration="100" />
    <!--<item Android:drawable="@drawable/loading_frame10" Android:duration="100" />-->
</animation-list>
2
Swas_99

この点で私がしたことは、override()を使用して画像サイズを強制することでした。グリッドビューがあり、各行に2つの画像が必要な場合は、次のようにして画面サイズをピクセル単位で見つけ、画像の正しい幅と高さを計算します。

    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    placeholderWidth = size.x / 2 ;
    placeholderHeight = size.x * 3 / 2 ; // based on the image's height to width ratio

各画像に必要な幅と高さが手元にあると、オーバーライドを簡単に使用できます。

    Glide.with(context)
            .load(url)
            .placeholder(R.drawable.loading)
            .override(placeholderWidth,placeholderHeight)                
            .into(viewHolder.imageViewHolder);
1
Shaahin Sh

問題を正しく理解している場合は、画像を読み込む必要がありますが、幅と高さはプレースホルダー画像よりも大きくする必要があります。問題を解決するには、まずGlideのドキュメントを読む必要があります。 xmlファイルにImageView定義が表示されませんが、幅と高さにwrap_content属性を使用していると思います。私が正しければ、あなたのボトルネックがあります。画像の読み込みが開始される前に、Glideは正確なImageViewの幅と高さを取得します。その後、ネットワークから画像をロードすると同時に、ImageView属性(幅または高さ)の1つに従って画像のサイズを変更します。そのため、読み込み後に小さな画像が表示されます。問題を解決するには、ImageViewの幅または高さを期待する値に設定するだけです。画像の反対側は、グライドロジックによって自動的に計算されます。

0
Alex Sarapin