標籤:
原因:這是一個很有趣的BUG View.getHeight(),得到的高度居然和我們想的不一樣,這個是從XListView的一個BUG說起,剛開始以為是Scroller沒有執行,經過一個小時的調試,發現原因是在這裡,View.getHeight(),返回的高度和真實的高度不一樣。解決方案:原來的代碼
public int getVisiableHeight() {return mContainer.getHeight();}FIXED後的代碼:
public int getVisiableHeight() {return mContainer.getLayoutParams().height;}
為什麼呢?讓我們看下日誌
02-12 18:15:49.774: E/Windows(5761): mContainer.getHeight():15702-12 18:15:49.774: E/Windows(5761): mContainer.getLayoutParams().height:28402-12 18:15:49.774: E/Windows(5761): mContainer.getHeight():15702-12 18:15:49.774: E/Windows(5761): mContainer.getLayoutParams().height:28402-12 18:15:49.774: E/Windows(5761): mContainer.getHeight():15702-12 18:15:49.774: E/Windows(5761): mContainer.getLayoutParams().height:28402-12 18:15:49.884: E/Windows(5761): mContainer.getHeight():24702-12 18:15:49.884: E/Windows(5761): mContainer.getLayoutParams().height:240
可以看出,兩個差距很大,為什麼呢?主要是因為這個是因為計算的問題。mContainer.getLayoutParams().height 是自己相對於父控制項設定的固定值。而mContainer.getHeight()源碼是這樣寫的
public final int getHeight() { return mBottom - mTop; }底部減去頂部,確實可以計算出來,但是這個過程不可靠,原因就在於多線程問題了,當我們處理onTouchEvent的時候UI線程還沒有重新整理,UI線程和onTouchEvent是同一個線程,不信自己阻塞下試試就知道了,這時候我們得到的View.getHeight()肯定是個錯誤的資料,而getLayoutParams().height是一個固定的數值,所以當View重新整理完畢的時候肯定是這個數值。
Android不能亂用的View.getHeight()(尤其是UI線程裡)