我们可以通过ImageView的ScaleType属性来实现图片在ImageView的展示方式。通过阅读源码可知ScaleType设置是通过ImageView中的Matrix变换得来的。在此做一个简单的文字记录 ImageView的scaleType的属性有好几种,分别是matrix(默认)、center、centerCrop、centerInside、fitCenter、fitEnd、fitStart、fitXY 基本使用: 下面主要介绍一下各个类型显示是怎么样的 保持原图的大小,显示在ImageView的中心。当原图的size大于ImageView的size,超过部分裁剪处理。 以填满整个ImageView为目的,将原图的中心对准ImageView的中心,等比例放大原图,直到填满ImageView为止(指的是ImageView的宽和高都要填满),原图超过ImageView的部分作裁剪处理。 以原图完全显示为目的,将图片的内容完整居中显示,通过按比例缩小原图的size宽(高)等于或小于ImageView的宽(高)。如果原图的size本身就小于ImageView的size,则原图的size不作任何处理,居中显示在ImageView。 不改变原图的大小,从ImageView的左上角开始绘制原图,原图超过ImageView的部分作裁剪处理。 把原图按比例扩大或缩小到ImageView的ImageView的高度,居中显示 把原图按比例扩大(缩小)到ImageView的高度,显示在ImageView的下部分位置 把原图按比例扩大(缩小)到ImageView的高度,显示在ImageView的上部分位置 把原图按照指定的大小在View中显示,拉伸显示图片,不保持原比例,填满ImageView. ImageView设置ScaleType部分源码
布局文件中android:scaleType="xxxx"
代码中:imageView.setScaleType(ImageView.ScaleType.FIT_XY)
android:scaleType="center"android:scaleType="centerCrop"android:scaleType="centerInside"android:scaleType="matrix"android:scaleType="fitCenter"android:scaleType="fitEnd"android:scaleType="fitStart"android:scaleType="fitXY"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) {
/*
如果图片没有固定的大小,我们会使用fit方式,铺满整个view
*/
mDrawable.setBounds(0, 0, vwidth, vheight);
mDrawMatrix = null;
} else {
// 我们要设置相应的缩放类型,需要图片自己的大小
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) {
// 当前的bitmap是fit方式,没有必要做变换
mDrawMatrix = null;
} else if (ScaleType.CENTER == mScaleType) {
// 居中展示bitmap,不需要缩放,仅仅是将图片和view的中心点对齐即可
mDrawMatrix = mMatrix;
mDrawMatrix.setTranslate(Math.round((vwidth - dwidth) * 0.5f),
Math.round((vheight - dheight) * 0.5f));
} else if (ScaleType.CENTER_CROP == mScaleType) {
mDrawMatrix = mMatrix;
//CenterCrop方式,先缩放,然后居中(会有dx或dy的移除效果)
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(Math.round(dx), Math.round(dy));
} 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 = Math.round((vwidth - dwidth * scale) * 0.5f);
dy = Math.round((vheight - dheight * scale) * 0.5f);
mDrawMatrix.setScale(scale, scale);
mDrawMatrix.postTranslate(dx, dy);
} else {
// 针对主动设置变换
mTempSrc.set(0, 0, dwidth, dheight);
mTempDst.set(0, 0, vwidth, vheight);
mDrawMatrix = mMatrix;
mDrawMatrix.setRectToRect(mTempSrc, mTempDst, scaleTypeToScaleToFit(mScaleType));
}
}
}
支付宝扫码打赏
微信打赏