如果要在运行时手动设置宽度和高度,请在布局系统测量视图后获取对 ImageView 的 LayoutParams 的引用。如果您在渲染阶段过早执行此操作,您的视图的宽度和高度以及它的父视图等都将为 0。
我在一个开源库中有一些代码可以帮助你。该过程分为两部分:
- 为您的控件设置一个附加到 ViewTreeObserver 的 OnPreDrawListener。我的示例在自定义控件中执行此操作,但您也可以在您的活动中执行此操作。
- 在 onPreDraw 方法中,您的图像及其父图像现在将分配给它们的宽度和高度值。您可以进行计算,然后手动将宽度和/或高度设置为视图的 LayoutParams 对象(不要忘记将其设置回来)。
查看这个示例,其中我在自定义 ImageView 渲染到屏幕之前将其应用宽高比。我不知道这是否完全适合您的用例,但这将演示如何将 OnPreDrawListener 添加到 ViewTreeObserver,完成后将其删除,并在运行时将动态调整大小应用于 View
https://github.com/aguynamedrich/beacon-utils/blob/master/Library/src/us/beacondigital/utils/RemoteImageView.java#L78
这是一个修改后的版本,它删除了我特定的调整大小逻辑。它还从 imageView 中获取 ViewTreeObserver,如果您没有实现自定义控件并且只想在 Activity 中执行此操作,则更有可能发生这种情况
private void initResizeLogic() {
final ViewTreeObserver obs = imageView.getViewTreeObserver();
obs.addOnPreDrawListener(new OnPreDrawListener() {
public boolean onPreDraw() {
dynamicResize();
obs.removeOnPreDrawListener(this);
return true;
}
});
}
protected void dynamicResize() {
ViewGroup.LayoutParams lp = imageView.getLayoutParams();
// resize logic goes here...
// imageView.getWidth() and imageView.getHeight() now return
// their initial layout values
lp.height = someCalculatedHeight;
lp.width = someCalculatedWidth;
imageView.setLayoutParams(lp);
}
}