ImageView Scaling BOTTOM_CROP

时间:2014-02-11 11:23:57

标签: android

我有两张图片并不总是完全适合屏幕。因此,我想裁剪它们(就像CENTER_CROP一样)但在某种程度上,以便图像的底部区域始终可见。两个图像都填满整个屏幕宽度和屏幕高度的1/2。

我在这里找到了类似的解决方案: ImageView scaling TOP_CROP 接受的解决方案完美无缺,但我无法弄清楚如何更改矩阵以使其成为BOTTOM_CROP。

TOP_CROP的工作代码:

setScaleType(ScaleType.MATRIX);
Matrix matrix = getImageMatrix();
float scaleFactor = (getWidth() - Data.getImgPadding(c)) / (float) getDrawable().getIntrinsicWidth();
matrix.setScale(scaleFactor, scaleFactor, 0, 0);
setImageMatrix(matrix);

注意:右侧的填充是以编程方式设置的,因此需要将其包含在计算中(该值由Data.getImgPadding(c)读取)。

对于BOTTOM_CROP我以为我会用:

matrix.setScale(scaleFactor, scaleFactor, 0, getHeight());

但它并没有真正起作用,因为第一张图像的底部部分或多或少地正确显示,但是它下方有一些边距 - 底部图像边框应该恰好位于底部的ImageView边框。我假设我必须以某种方式使用填充,但我不知道在设置水平填充值之后如何计算“新”图像高度。

然而更大的问题是(无论出于何种原因)当我在setScale()中设置值py时,第二个ImageView突然变空......两个视图使用相同的布局xml,但这不是原因原始代码在两者上都能完美运行。

1 个答案:

答案 0 :(得分:1)

我知道这已经很久没了,但我已经在帖子中修改了答案,以满足您的需求。

@Override
protected boolean setFrame(int l, int t, int r, int b) {
    boolean hasChanged = super.setFrame(l, t, r, b);
    Matrix matrix = getImageMatrix();
    float scaleFactor = getWidth() / (float) getDrawable().getIntrinsicWidth();
    matrix.setScale(scaleFactor, scaleFactor, 0, 0);

    // The Important Bit
    Drawable drawable = getDrawable();
    float heightD = drawable.getIntrinsicHeight();
    float height = getHeight();
    matrix.setTranslate(0, height - heightD);

    setImageMatrix(matrix);
    return hasChanged;
}

希望它有所帮助!