首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ImageView Scaling BOTTOM_CROP

ImageView Scaling BOTTOM_CROP
EN

Stack Overflow用户
提问于 2014-02-11 19:23:57
回答 1查看 395关注 0票数 2

我有两个图像并不总是完全适合屏幕。因此,我想裁剪它们(就像CENTER_CROP一样),但在某种程度上,这样图像的底部区域总是可见的。这两个图像占据了整个屏幕宽度和每个屏幕高度的1/2。

我在这里找到了一个类似的解决方案:ImageView scaling TOP_CROP被接受的解决方案完美地工作,但我不知道如何改变矩阵,使其改为BOTTOM_CROP。

TOP_CROP的工作代码:

代码语言:javascript
复制
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,我想我应该使用:

代码语言:javascript
复制
matrix.setScale(scaleFactor, scaleFactor, 0, getHeight());

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

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

EN

回答 1

Stack Overflow用户

发布于 2015-02-24 12:52:45

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

代码语言:javascript
复制
@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;
}

希望它能帮上忙!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21700509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档