我有两张图片并不总是完全适合屏幕。因此,我想裁剪它们(就像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,但这不是原因原始代码在两者上都能完美运行。
答案 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;
}
希望它有所帮助!