0

我的修复代码ImageView

private void fixImageWidth() {
    int parentHeight = getHeight();
    if (parentHeight == 0 || getParent() == null)
        return;

    Drawable drawable = image.getDrawable();
    LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) image.getLayoutParams();
    if (drawable != null) {
        int height = drawable.getIntrinsicHeight();
        int width = drawable.getIntrinsicWidth();
        lp.width = (int) ((float)(parentHeight - lp.topMargin * 2) / height * width);
    } else {
        lp.width = LayoutParams.WRAP_CONTENT;
    }

    image.requestLayout();
}

但有时实际上图像边界没有改变。您可以在下面看到该对象的 HierarchyViewer 属性:

层次视图属性

编辑:

经过大量调试后,我确定,有时 requestLayout 不会重新测量图像视图。这是怎么发生的?

编辑:

我找到了解决方案,但仍然不知道原因。解决方案如下:

    image.post(new Runnable() {
        @Override
        public void run() {
            image.requestLayout();
        }
    });

有任何想法吗?

4

1 回答 1

2

因为 getWidth() 和 getLayoutParams().width 是不同的东西。第一个与视图有关,第二个是对父级的布局请求。如果父级无法匹配请求,则视图可能会以不同的宽度布局。在这种情况下,您在布局高度中请求了 MATCH_PARENT,并且由于 ImageView 的默认 scaleType 为 FIT_CENTER,因此内容纵横比保持不变,因此宽度会发生变化。

于 2013-07-23T15:00:33.847 回答