在设置ImageView的scaleType时,有时常常搞不清fitCenter和centerInside的区别,网上资料说的也很模糊,今天就从底层源码看看这俩类型的区别。
查看ImageView的代码,发现有这样的一个ScaleType数组,里面存放了我们所有的可设置的type枚举。
private static final ScaleType[] sScaleTypeArray = {
ScaleType.MATRIX,
ScaleType.FIT_XY,
ScaleType.FIT_START,
ScaleType.FIT_CENTER,
ScaleType.FIT_END,
ScaleType.CENTER,
ScaleType.CENTER_CROP,
ScaleType.CENTER_INSIDE
};
centerInside
搜索ScaleType.CENTER_INSIDE,找到使用枚举处的方法。为了便于理解,我将其他类型的代码都注释掉了,只留下我们要分析的代码。
ImageView.java
private void configureBounds() {
if (mDrawable == null || !mHaveFrame) {
return;
}
final int dwidth = mDrawableWidth; //图片的宽度
final int dheight = mDrawableHeight; //图片的高度
final int vwidth = getWidth() - mPaddingLeft - mPaddingRight; //view的宽度
final int vheight = getHeight() - mPaddingTop - mPaddingBottom; //view的高度
...
if (dwidth <= 0 || dheight <= 0 || ScaleType.FIT_XY == mScaleType) {
...
} else {
// We need to do the scaling ourself, so have the drawable
// use its native size.
mDrawable.setBounds(0, 0, dwidth, dheight);
if (ScaleType.MATRIX == mScaleType) {
...
} else if (fits) {
...