一、设置后的效果图
imageview设置scaleType属性后不同值的效果
1、原图比imageview大设置后的效果
2、原图比imageview小设置后的效果
二、scaleType各值的含义
1、MATRIX
该模式下ImageView用户设置的比例缩放图片,经过MATRIX缩放后的图片将从ImageView的左上角开始绘制。如果缩放后的图片大于ImageView,那么多余的部分则剪裁掉,如果小于ImageView,则不作做任何处理。
2、CENTER
该模式按图片的原有的尺寸居中显示,
- 当dwidth>vwidth,dheight<vheight时,其实就是将图片左移和向下移动到ImageView的中央位置展示,展示图片的中间区域。
- 当dwidth<vwidth,dheight<vheight时,其实就是将图片向右和向上移动到ImageView的中央位置展示。
- 当dwidth>vwidth,dheight>vheight时,其实就是将图片向左和向上移动到ImageView的中央位置展示
- 当dheight>vheight,dwidth<vwidth,其实就是将图片向右和向上移动到ImageView的中央位置展示,展示图片中间内容。
3、CENTER_CROP
该模式按比例扩大图片的尺寸并居中显示,使得图片长(宽)等于或大于View的长(宽)。
- 如果dwidth/dheight>vwidth/vheight(图片的宽高比大于ImageView的宽高比),即vheight/dheight>vwidth/dwidth,也就是说ImageView和图片高度比小于ImageView和图片的宽度比,这时候取vheight/dheight的比例进行图片缩放,这样就能保证图片宽度在进行同等比例缩放的时候,图片宽度大于或等于ImageView的宽度,因为(vheight/dheight)* dwidth>vwidth。
同理,如果vwidth/dwidth>vheight/dheight时,取vwidth/dwidth作为图片的缩放比例,可以保证缩放完成后图片宽度等于ImageView的宽度,图片的高度大于或等于ImageView的高度,因为(vwidth/dwidth)*dheight>vheight。图片在缩放之后再进行CENTER操作即可。
vwidth/dwidth>vheight/dheight,图片先按照vwidth/dwidth进行缩放,缩放后的图片高度>=vheight,然后再进行向上移位。
vheight/dheight>vwidth/dwidth,图片先按照vheight/dheight进行缩放,缩放后的图片宽度>=vwidth,然后再进行想左移位。
4、CENTER_INSIDE
将图片的内容完整居中显示,通过按比例缩小或原图片的尺寸,使得图片长或者宽等于或小于ImageView的长或者宽,这种方式允许图片不塞满整个ImageView。如果图片宽度dwidth小于ImageView的宽度vwidth,且图片高度dheight小于ImageView高度vheight
CENTER_INSIDE和CENTER_CROP选择缩放比例的策略正好相反,CENTER_INSIDE始终选择较小的比例进行缩放,保证缩放后的一个边(宽或高)小于ImageView的宽或高。下图所示为vheight/dheight>vwidth/dwidth的场景,取vwidth/dwidth作为图片的缩放比例,保证了缩放后图片高度小于或等于ImageView的高度(vwidth/dwidth)dheight<=vheight。
vwidth/dwidth>vheight/dheight的场景,取vheight/dheight作为图片的缩放比例,保证了缩放后图片宽度小于或等于ImageView的宽度,(vheight/dheight)dwidth<=vwidth。
5、FIT_XY、FIT_CENTER、FIT_START、FIT_END
当ImageView设置了这四种ScaleType后,ImageView采用Matrit.ScaleToFit来进行图片的展示。
ScaleType.FIT_XY
FILL 图片宽度和高度有独立的缩放比例,保证图片能够塞满整个ImageView。这种场景下图片宽度的缩放比例为vwidth/dwidth,高度的缩放比例为vheight/dheight。
ScaleType.FIT_START
START 把图片按比例扩大/缩小到View的宽度或高度,显示在View的left和top位置(图片会完整显示)
ScaleType.FIT_CENTER
把图片按比例扩大/缩小到View的宽度或高度,居中显示(图片会完整显示)。
ScaleType.FIT_END
END把图片按比例扩大/缩小到View的宽度或高度,显示在View的right和bottom位置(图片会完整显示)。
scaletype
/**
* Options for scaling the bounds of an image to the bounds of this view.
*/
public enum ScaleType {
/**
* Scale using the image matrix when drawing. The image matrix can be set using
* {@link ImageView#setImageMatrix(Matrix)}. From XML, use this syntax:
* <code>android:scaleType="matrix"</code>.
*/
MATRIX (0),
/**
* Scale the image using {@link Matrix.ScaleToFit#FILL}.
* From XML, use this syntax: <code>android:scaleType="fitXY"</code>.
*/
FIT_XY (1),
/**
* Scale the image using {@link Matrix.ScaleToFit#START}.
* From XML, use this syntax: <code>android:scaleType="fitStart"</code>.
*/
FIT_START (2),
/**
* Scale the image using {@link Matrix.ScaleToFit#CENTER}.
* From XML, use this syntax:
* <code>android:scaleType="fitCenter"</code>.
*/
FIT_CENTER (3),
/**
* Scale the image using {@link Matrix.ScaleToFit#END}.
* From XML, use this syntax: <code>android:scaleType="fitEnd"</code>.
*/
FIT_END (4),
/**
* Center the image in the view, but perform no scaling.
* From XML, use this syntax: <code>android:scaleType="center"</code>.
*/
CENTER (5),
/**
* Scale the image uniformly (maintain the image's aspect ratio) so
* that both dimensions (width and height) of the image will be equal
* to or larger than the corresponding dimension of the view
* (minus padding). The image is then centered in the view.
* From XML, use this syntax: <code>android:scaleType="centerCrop"</code>.
*/
CENTER_CROP (6),
/**
* Scale the image uniformly (maintain the image's aspect ratio) so
* that both dimensions (width and height) of the image will be equal
* to or less than the corresponding dimension of the view
* (minus padding). The image is then centered in the view.
* From XML, use this syntax: <code>android:scaleType="centerInside"</code>.
*/
CENTER_INSIDE (7);
ScaleType(int ni) {
nativeInt = ni;
}
final int nativeInt;
}
configurebounds
‘’
private void configureBounds() {
if (mDrawable == null || !mHaveFrame) {
return;
}
int dwidth = mDrawableWidth;
int dheight = mDrawableHeight;
int vwidth = getWidth() - mPaddingLeft - mPaddingRight;
int vheight = getHeight() - mPaddingTop - mPaddingBottom;
boolean fits = (dwidth < 0 || vwidth == dwidth) &&
(dheight < 0 || vheight == dheight);
if (dwidth <= 0 || dheight <= 0 || ScaleType.FIT_XY == mScaleType) {
/* If the drawable has no intrinsic size, or we're told to
scaletofit, then we just fill our entire view.
*/
mDrawable.setBounds(0, 0, vwidth, vheight);
mDrawMatrix = null;
} 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) {
// Use the specified matrix as-is.
if (mMatrix.isIdentity()) {
mDrawMatrix = null;
} else {
mDrawMatrix = mMatrix;
}
} else if (fits) {
// The bitmap fits exactly, no transform needed.
mDrawMatrix = null;
} else if (ScaleType.CENTER == mScaleType) {
// Center bitmap in view, no scaling.
mDrawMatrix = mMatrix;
mDrawMatrix.setTranslate((int) ((vwidth - dwidth) * 0.5f + 0.5f),
(int) ((vheight - dheight) * 0.5f + 0.5f));
} else if (ScaleType.CENTER_CROP == mScaleType) {
mDrawMatrix = mMatrix;
float scale;
float dx = 0, dy = 0;
if (dwidth * vheight > vwidth * dheight) {
scale = (float) vheight / (float) dheight;
dx = (vwidth - dwidth * scale) * 0.5f;
} else {
scale = (float) vwidth / (float) dwidth;
dy = (vheight - dheight * scale) * 0.5f;
}
mDrawMatrix.setScale(scale, scale);
mDrawMatrix.postTranslate((int) (dx + 0.5f), (int) (dy + 0.5f));
} else if (ScaleType.CENTER_INSIDE == mScaleType) {
mDrawMatrix = mMatrix;
float scale;
float dx;
float dy;
if (dwidth <= vwidth && dheight <= vheight) {
scale = 1.0f;
} else {
scale = Math.min((float) vwidth / (float) dwidth,
(float) vheight / (float) dheight);
}
dx = (int) ((vwidth - dwidth * scale) * 0.5f + 0.5f);
dy = (int) ((vheight - dheight * scale) * 0.5f + 0.5f);
mDrawMatrix.setScale(scale, scale);
mDrawMatrix.postTranslate(dx, dy);
} else {
// Generate the required transform.
mTempSrc.set(0, 0, dwidth, dheight);
mTempDst.set(0, 0, vwidth, vheight);
mDrawMatrix = mMatrix;
mDrawMatrix.setRectToRect(mTempSrc, mTempDst, scaleTypeToScaleToFit(mScaleType));
}
}
}