2012-03-23 84 views
1

我试图将位图放入ImageView中,该图像在旋转设备时更改大小。 它改变了大小,因为我分别为纵向和横向模式加载不同的布局。 根据ImageView在布局上放置多少可用的屏幕空间计算最终的位图大小。在取向变化时获取ImageView的宽度和高度

目前我正在尝试通过照顾自己的配置更改(旋转)来解决此问题。

我尝试使用onConfigurationChanged和ViewTreeObserver取得了一些成功。只要我不使用setContentView,我就可以获得ImageView的宽度和高度,并且相应地完成缩放。但是,我需要能够加载另一个布局,并基于ImageView的可用空间计算位图的新缩放比例。

我该如何做到这一点?只要我加载一个新的布局,ImageView的宽度和高度就会变成零。

我的目标是缩放位图大小以适应旋转的图像视图。

+0

您是否找到解决方案?我还注意到,当我进行配置更改时,ImageView会变为0。但我无法用0值缩放“位图”。 – Azurespot 2015-04-08 00:36:34

回答

0

有许多方法可以覆盖,包括onSizeChanged和onLayout,但它们都有怪癖。我发现查找视图大小的最可靠方法是使用视图树观察者。您从观察者的视图中获得的宽度和高度可能会发生变化,并且onGlobalLayout的第一次或前几次更改通常为0。

试着在视图树观察者的onGlobalLayout中记录所需视图的宽度和高度,看看会发生什么。还要确保在调用setContentView之后,再次调用findViewById以查找任何ImageView对象替换旧ImageView对象的位置。如果您仍然在旋转之前查看图像视图,则宽度和高度将永远不会准确,因为该视图不再处于任何可见布局中。

+1

看来他没有什么黄金解决方案,现在我抛出了ViewTreeObserver,而是在保存的实例状态之间传递数据。这意味着我不得不重新采样传入的位图,所以我没有达到虚拟机预算的限制,但如果没有其他的,它的工作原理。 但是您的回复确实有一些重要的提示,所以我会接受您的回答。 – 2012-03-26 05:49:59

+0

@shellströmSONY,保存状态的工作?我试图但得到一个新的错误:'requestLayout()被android.widget.ListView'错误地调用。这意味着,当我试图访问我的视图来保存它时,Android正在尝试使用我的视图,因此存在冲突。虽然没有找到解决方法,因为'ViewTreeObserver'也不适用于我。 – Azurespot 2015-04-08 01:22:15