Glide 4.x 使ImageView自適應顯示

對與ImageView的scaleType 非Matrix的居中顯示就不講解了,因爲很簡單。這裏主要實現android:scaleType="matrix"樣式的自適應。
原理:先獲取原畫的大小,然後獲取當前Image的佈局尺寸(需要是match_parent纔行),之後計算縮放比。

在使用該方法之前嘗試過RequestOptions的override方法,邏輯是在onResourceReady裏面獲取到縮放比,之後計算出縮放之後的高度和寬度並設置override。結果程序會報錯,因爲onResourceReady是異步的,在調用apply的時候override還是空的。

Glide.with(this).load(url).listener(new RequestListener<Drawable>() {
                @Override
                public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                    return false;
                }

                @Override
                public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                    //加載圖片適應窗口大小並且居中顯示
                    //設置Img的背景
                    mImg.setImageDrawable(resource);
                    
                    //獲取畫布的大小
                    int imageWidth = resource.getIntrinsicWidth();
                    int imageHeight = resource.getIntrinsicHeight();

                    //只有當xml layout 配置爲match_parent纔可以調用nw和nh獲取視圖的高度和寬度,否則不行
                    int nw = mImg.getWidth();
                    int nh = mImg.getHeight();
                    if(imageWidth > nw){

                        Matrix matrix = new Matrix();
                        //設置放大比例
                        float fScale = nw*1.0f/imageWidth;

                        //計算垂直的居中距離
                        float fTranslateY = 0;
                        imageHeight = (int)(fScale*imageHeight);
                        if(nh > 0 && nh > imageHeight){
                            fTranslateY = (nh - imageHeight)/2;
                        }

                        matrix.postScale(fScale,fScale);
                        matrix.postTranslate(0,fTranslateY);
                        mImg.setImageMatrix(matrix);
                    }
                    return true;
                   }
            }).into(mImg);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章