2012-03-23 51 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