編輯:關於Android編程
一、MeasureSpec
(測量方法):
LinearLayout newsTopLayout = (LinearLayout) viewHashMapObj.get("top"); int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED); int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED); newsTopLayout.measure(w, h); int height = newsTopLayout.getMeasuredHeight();
但是要注意,這兩個方法所獲取的width和height可能跟實際draw後的不一樣。官方文檔解釋了不同的原因:
View的大小由width和height決定。一個View實際上同時有兩種width和height值。第一種是measure width和measure height。他們定義了view想要在父View中占用多少width和height(詳情見Layout)。measured height和width可以通過getMeasuredWidth() 和 getMeasuredHeight()獲得。第二種是width和height,有時候也叫做drawing width和drawing height。這些值定義了view在屏幕上繪制和Layout完成後的實際大小。這些值有可能跟measure width和height不同。width和height可以通過getWidth()和getHeight獲得。
二、addOnGlobalLayoutListener
(增加整體布局監聽
):
view.getViewTreeObserver().addOnGlobalLayoutListener( new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { int width =view.getMeasuredWidth(); int height =view.getMeasuredHeight(); } });
但是要注意這個方法在每次有些view的Layout發生變化的時候被調用(比如某個View被設置為Invisible),所以在得到你想要的寬高後,記得移除onGlobleLayoutListener:
在 SDK Lvl < 16時使用:public void removeGlobalOnLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim)
在 SDK Lvl >= 16時使用:public void removeOnGlobalLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim)
三、view.post():
view.post(new Runnable() { @Override public void run() { view.getHeight(); } });只要用View.post()一個runnable就可以了。runnable對象中的方法會在View的measure、layout等事件後觸發,具體的參考Romain Guy:
UI事件隊列會按順序處理事件。在setContentView()被調用後,事件隊列中會包含一個要求重新layout的message,所以任何你post到隊列中的東西都會在Layout發生變化後執行。你的代碼只會執行一次,而且你不用在在每次執行後將Observer禁用,省心多了。
四、重寫View的onLayout方法:
view = new View(this) { @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); view.getHeight(); } };這個方法只在某些場景中實用,比如當你所要執行的東西應該作為他的內在邏輯被內聚、模塊化在view中,否者這個解決方案就顯得十分冗長和笨重。需要注意的是onLayout方法會調用很多次,所以要考慮好在這個方法中要做什麼,或者在第一次執行後禁用掉你的代碼。
1 背景在Android中任何耗時的操作都不能放在UI主線程中,所以耗時的操作都需要使用異步實現。同樣的,在ContentProvider中也可能存在耗時操作,這時也該使
ScrollView和ListView這兩個控件想必大家都不會陌生,但是這兩者嵌套使用的時候就會出現麻煩。比如,我們如果想在ListView下面添加其他的布局或者控件,然
無限自動循環 = 無限循環 + 自動循環無限循環 = 無限向左循環 + 無限向右循環接下來我們通過demo一步步的實現無限向右循環–>無限向左循環&nd
Android Bitmap 加載與像素操作一:加載與像素讀寫在Android SDK中,圖像的像素讀寫可以通過getPixel與setPixel兩個Bitmap的API