1. 程式人生 > >完美解決glide+StaggeredGridLayoutManager 圖片載入大小不正常的問題

完美解決glide+StaggeredGridLayoutManager 圖片載入大小不正常的問題

先說下我的目標,公司要求每張圖片寬度是充滿item的,高度是根據圖片高度縮放的,所以要求用瀑布流實現,

但是我當我用SwipeToLoadLayout 做下拉重新整理的時候,發現每次載入圖片,大小都有可能不一樣,但是 首次載入的時候.

圖片顯示是正常的,我猜測,這個跟glide的圖片快取有關係,

但是當我設定 glie的skipMemoryCache(true),不讓他快取

還有DiskCacheStrategy.RESULT    dontransform 各種屬性全試了一遍,發現還是沒達到效果.那麼可以排除glide的

鍋,應該是recyclerview的圖片快取除了問題,如果有興趣的同學可以去研究下recyclerview的快取機制

下面我說下我研究一天的解決方案:

思路就是在第一次用glide 拿到圖片之後,就取bitmap的寬高,然後  按照寬高比獲取圖片高度,因為圖片寬度是定死的

我這個2列的瀑布流, 寬度就取螢幕一半.  然後  這個寬高 同時去改變  imageview的寬高和bitmap的寬高.這樣就能保證圖片不變形,而且,每次下拉重新整理的時候都不會改變其大小.

下面是我的關鍵程式碼,如果有疑問可以加我qq:385813241,雖然挺簡單,但是我相信有人需要

先說下圖片設定的屬性

<ImageView
android:id="@+id/work_image"
android:layout_width=
"match_parent" android:layout_height="wrap_content" android:scaleType="fitCenter" android:src="@drawable/ic_launcher" />

fitCenter 表示充滿view的寬度,高度按照原圖比例顯示

在Recyclerview的adapter裡面

 public void onBindViewHolder(final MyHolder holder, final int position) {


        //為了方便閱讀,我在這邊定義個變數
ImageView imageView;
//你要載入圖片的容器 Glide.with(act) .load("圖片url") .asBitmap() .into(new SimpleTarget<Bitmap>(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) { @Override public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) { //這個bitmap就是你圖片url載入得到的結果 //獲取bitmap資訊,可賦值給外部變數操作,也可在此時行操作。 LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) imageView.getLayoutParams();//獲取你要填充圖片的佈局的layoutParam layoutParams.height = (int) (((float) bitmap.getHeight()) / bitmap.getWidth() * ScreenUtils.getScreenWidth(act) / 2 ); //因為是2,所以寬度是螢幕的一半,高度是根據bitmap的高/*螢幕寬的一半 layoutParams.width = ScreenUtils.getScreenWidth(act) / 2;//這個是佈局的寬度 imageView.setLayoutParams(layoutParams);//容器的寬高設定好了 bitmap = zoomImg(bitmap, layoutParams.width, layoutParams.height); // 然後在改變一下bitmap的寬高 holder.workImage.setImageBitmap(bitmap); } }); } }
//改變bitmap尺寸的方法
public static Bitmap zoomImg(Bitmap bm, int newWidth, int newHeight) {
    // 獲得圖片的寬高
int width = bm.getWidth();
    int height = bm.getHeight();
// 計算縮放比例
float scaleWidth = ((float) newWidth) / width;
    float scaleHeight = ((float) newHeight) / height;
// 取得想要縮放的matrix引數
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
// 得到新的圖片
Bitmap newbm = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true);
    return newbm;
}
//獲取螢幕寬度的方法
public static int getScreenWidth(Context context)
{
   WindowManager wm = (WindowManager) context
         .getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics outMetrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(outMetrics);
   return outMetrics.widthPixels;
}