2016-10-05 11 views
1

私のRecyclerViewの中にImageViewに関するいくつかの問題があります。私は漫画のビューアを作成しており、非常に長い画像を読み込んでいます。私は私の画像を8部にスライスして、私のImageViewがそれらを処理できるようにしました。問題は、RecyclerViewに画像を読み込むときです。Glideが画像をロードしている間にRecyclerViewのImageViewに寸法を設定させるにはどうすればいいですか?

私はGlideを使用しており、Glideにセグメント化された部分がロードされている場合、かなりの遅延があります。これは画像キャッシングのために好ましいものであり、非常にうまく機能するが、望ましくない効果を残す。それは非常に速く起こっているので、私は実際の画像を表示することはできませんが、私はASCIIを使用して、それを表現することができます

例えば、ここで、起動時に私のRecyclerViewです:あなたがここに気づくことができたようグライドは、

---------------Segment1 
#......................... 
#......................... 
#......................... 
#......................... 
#......................... 
#......................... 
---------------Segment2 
---------------Segment3 
---------------Segment4 
#......................... 
#......................... 
#......................... 
#......................... 
#......................... 
#......................... 

Segment2とSegment3の読み込みがまだ完了しておらず、実際にはSegment1とSegment4が一緒にステッチされています。突然のSegment2とSegment3の全てが存在しなくなりましたが、それはあまりうまくありません。

これをScrollViewに置き、ImageViewを動的に追加しても、同じ効果があります。私は複数の画面サイズを扱う必要があるので、明らかな理由からImageViewの幅と高さに一定のpx/dipを割り当てることはできません。

マイImageViewセットアップは次のようになります。私はImageViewに基づいて一定のピクセル幅/高さを割り当てた場合

private void bindSegment(ComicViewHolder holder, int position) 
{ 
    File file = mSegments.get(position); 
    Point imageSize = Constants.getImageSize(file); 
    Point screenSize = Constants.getScreenSize(mContext); 

    ImageView imageView = holder.mImageViewComic; 

    Glide.with(imageView.getContext()) 
     .load(file.getAbsolutePath()) 
     .override(imageSize.x , imageSize.y) 
     .crossFade(0) 
     .into(imageView); 
} 

:私はこのImageViewに結合したときにここで

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <ImageView 
     android:id="@+id/imageview_comic" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:scaleType="fitXY" 
     android:adjustViewBounds="true"/> 

</LinearLayout> 

は私がやっているものですgetLayoutParams()経由で、私はそれを1つの電話ではなく、他の電話で動作させることができます。このようにサイズImageViewをハードコードできません。 Glide.overrideは期待どおりに機能していないようです。 ImageViewは、現在ロードされているセグメント間のギャップを埋めるように、ロード中のイメージのサイズに対する現在のディメンションベースを知るために必要です。

どのような考えですか?

答えて

1

この問題については、Glideライブラリのサポートはありません。私は何度も試してみました。しかし、ついに私は自分自身で解決策を導き出しました。画像を読み込むには、画像のURLとその他のメタデータを送信する必要があります。

解決策は、このメタデータを使用して、画像ビューに読み込まれる画像のサイズ(高さと幅)を送信する必要があることです。

画像が画像ビューに読み込まれる前に、これらの寸法が得られます。今度は、これらのディメンションを使用してイメージビューの高さと幅を拡大縮小し、プレースホルダを適用する必要があります。

最後に画像が読み込まれるときに、プレースホルダの代わりになります。

私はあなたのImageViewの=あなたのスクリーンの幅

DisplayMetrics metrics; 
    int width = 0, height = 0; 

metrics = new DisplayMetrics(); 

高さ= metrics.heightPixelsの幅を設定しようとしていると仮定しています。 width = metrics。widthPixels;今

、最後に

int heightOfImage = 0; 
int widthOfImage = 0; 

float scalingRatio = ((Float.parseFloat(heightOfImage)/Float.parseFloat(widthOfImage)); 

viewHolder.imageLoadingLayout.getLayoutParams().height = Math.round(scalingRatio*width); //imageLoadingLayout is your placeholder 

Glide.with(activity) 
      .load(imageURL) 
      .diskCacheStrategy(DiskCacheStrategy.NONE) 
      .skipMemoryCache(true) 
      .listener(new RequestListener<String, GlideDrawable>() { 
       @Override 
       public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { 
        return false; 
       } 
       @Override 
       public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { 
        viewHolder.imageLoadingLayout.setVisibility(View.GONE); 


        return false; 
       } 
      }) 
      .crossFade() 
      .override(1700, 1700) 
      .diskCacheStrategy(DiskCacheStrategy.ALL) 
      .into(imageView); 

} 

画像レイアウト

<ImageView 
    android:id="@+id/imageView" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:adjustViewBounds="true" 
    android:scaleType="fitCenter" 
/> 
+0

イエス・キリストが、これは働いていました。しかし、私のスケーリングされた画像は少し細長いですが、それほど効果的ではありません。 –

-1
newPostHolder.height = DeviceHight; 
int heightOfImage = data.getInt("image_height"); 
        if (heightOfImage > ((newPostHolder.height/100) * 80) || heightOfImage == newPostHolder.height) { 
         heightOfImage = ((newPostHolder.height/100) * 69); 
        } 

        newPostHolder.one_imageview.getLayoutParams().height = heightOfImage; 
関連する問題