Android ImageView topCrop / bottomCrop scaletype?

时间:2015-12-22 23:06:42

标签: android imageview scaletype

我有一个正方形ImageView,可以显示不同尺寸的图片。我想始终保持图片的原始宽高比,并且图像周围没有边距(因此图像占据了整个ImageView)。为此,我在centerCrop上使用ImageView scaleType。但是,我想这样做,如果图像的顶部和底部被切断(即:图像高于宽度),图像会被拉向容器的底部。因此,不是在顶部和底部裁剪相同数量的像素,而是图像与ImageView的顶部和侧面齐平,并且图像的底部裁剪了两倍。这在xml中是否可行,如果没有,是否有java解决方案?

2 个答案:

答案 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);
}

另见: