我有一个正方形ImageView
,可以显示不同尺寸的图片。我想始终保持图片的原始宽高比,并且图像周围没有边距(因此图像占据了整个ImageView)。为此,我在centerCrop
上使用ImageView
scaleType。但是,我想这样做,如果图像的顶部和底部被切断(即:图像高于宽度),图像会被拉向容器的底部。因此,不是在顶部和底部裁剪相同数量的像素,而是图像与ImageView
的顶部和侧面齐平,并且图像的底部裁剪了两倍。这在xml中是否可行,如果没有,是否有java解决方案?
答案 0 :(得分:4)
您无法使用xml中的常规ImageView
及其属性来执行此操作。你可以使用适当的scaleType
Matrix
来实现这一目标,但是写一下它是一个痛苦的屁股。我建议你使用一个可以轻松处理这个问题的受人尊敬的库。例如CropImageView
。
答案 1 :(得分:2)
您可能无法在布局中执行此操作。但是可以使用这样的代码:
final ImageView image = (ImageView) findViewById(R.id.image);
// Proposing that the ImageView's drawable was set
final int width = image.getDrawable().getIntrinsicWidth();
final int height = image.getDrawable().getIntrinsicHeight();
if (width < height) {
// This is just one of possible ways to get a measured View size
image.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int measuredSize = image.getMeasuredWidth();
int offset = (int) ((float) measuredSize * (height - width) / width / 2);
image.setPadding(0, offset, 0, -offset);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
image.getViewTreeObserver().removeOnGlobalLayoutListener(this);
} else {
image.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
}
});
}
注意如果您的ImageView
具有预定义的大小(可能有),那么您需要将此大小设置为dimen
资源,代码将更简单:< / p>
ImageView image = (ImageView) findViewById(R.id.image2);
// For sure also proposing that the ImageView's drawable was set
int width = image.getDrawable().getIntrinsicWidth();
int height = image.getDrawable().getIntrinsicHeight();
if (width < height) {
int imageSize = getResources().getDimensionPixelSize(R.dimen.image_size);
int offset = (int) ((float) imageSize * (height - width) / width / 2);
image.setPadding(0, offset, 0, -offset);
}
另见: