我的修复代码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();
}
});
有什么想法吗?
答案 0 :(得分:2)
因为getWidth()和getLayoutParams()。width是不同的东西。第一个涉及View,第二个是对父级的布局请求。如果父级无法匹配请求,则View可能以不同的宽度布局。在这种情况下,您已在布局高度中请求了MATCH_PARENT,因为ImageView的默认scaleType为FIT_CENTER,因此保持内容宽高比,以便宽度发生变化。