2014-02-11 71 views
2

我有两个图像并不总是完全适合屏幕。因此我想裁剪它们(像CENTER_CROP那样),但是以某种方式使图像的底部区域始终可见。两张图像都填充整个屏幕宽度和屏幕高度的每个1/2。ImageView缩放BOTTOM_CROP

我发现了一个类似的解决方案在这里: 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

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

@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; 
} 

希望它有帮助!