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