您好,登錄后才能下訂單哦!
借鑒自開發藝術
1.onWindowFocusChanged
這個方法會被調用多次,在View初始化完畢后會調用,當Activity的窗口得到焦點和失去焦點都會被調用一次(Activity繼續執行和暫停執行時)。
@Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (hasFocus) { int width = view.getMeasuredWidth(); int height = view.getMeasuredHeight(); } }
2.view.post
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ViewGroup root = (ViewGroup) LayoutInflater.from(this).inflate(R.layout.activity_main, null, false); setContentView(root); final View view = root; view.post(new Runnable() { @Override public void run() { int width = view.getMeasuredWidth(); int height = view.getMeasuredHeight(); Log.i(TAG, width + " " + height); } }); }
具體原理暫時還不懂,不過應該是view封裝的異步回調初始化后,view的測繪多半也完成了,這是一個同步的過程。所以才可以接收到消息。
3.ViewTreeObserver
他有許多回調。比如當View樹的狀態發生改變或者View樹內部的View可見性發現改變時,onGlobalLayout方法將被回調。
final View view = root; ViewTreeObserver observer = view.getViewTreeObserver(); observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { view.getViewTreeObserver().removeGlobalOnLayoutListener(this); int width = view.getMeasuredWidth(); int height = view.getMeasuredHeight(); Log.i(TAG, width + " " + height); } });
通過一種增加global listener又移除的方式,獲取觀察而來的消息。
4.view.measure
手動測繪,分3種情況:
一、match_parent
這個情況是獲取不到的。構造這種情況的MeasureSpec需要知道父容器的剩余空間。
二、具體的數值(dp/px)
比如寬高都是100px,可以這樣做:
View view = root; int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY); int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY); view.measure(widthMeasureSpec, heightMeasureSpec); Log.i(TAG, widthMeasureSpec + " " + heightMeasureSpec);
到這里為止了,這種方法不推薦,因為測出來發現有錯誤。
以上這篇Android中獲取控件寬高的4種方法集合就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。