Android中獲取控件寬高的4種方法集合
借鑒自開(kāi)發(fā)藝術(shù)
1.onWindowFocusChanged
這個(gè)方法會(huì)被調(diào)用多次,在View初始化完畢后會(huì)調(diào)用,當(dāng)Activity的窗口得到焦點(diǎn)和失去焦點(diǎn)都會(huì)被調(diào)用一次(Activity繼續(xù)執(zhí)行和暫停執(zhí)行時(shí))。
@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);
}
});
}
具體原理暫時(shí)還不懂,不過(guò)應(yīng)該是view封裝的異步回調(diào)初始化后,view的測(cè)繪多半也完成了,這是一個(gè)同步的過(guò)程。所以才可以接收到消息。
3.ViewTreeObserver
他有許多回調(diào)。比如當(dāng)View樹(shù)的狀態(tài)發(fā)生改變或者View樹(shù)內(nèi)部的View可見(jiàn)性發(fā)現(xiàn)改變時(shí),onGlobalLayout方法將被回調(diào)。
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);
}
});
通過(guò)一種增加global listener又移除的方式,獲取觀察而來(lái)的消息。
4.view.measure
手動(dòng)測(cè)繪,分3種情況:
一、match_parent
這個(gè)情況是獲取不到的。構(gòu)造這種情況的MeasureSpec需要知道父容器的剩余空間。
二、具體的數(shù)值(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);
到這里為止了,這種方法不推薦,因?yàn)闇y(cè)出來(lái)發(fā)現(xiàn)有錯(cuò)誤。
以上這篇Android中獲取控件寬高的4種方法集合就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Android獲取手機(jī)的版本號(hào)等信息的代碼
這篇文章主要為大家詳細(xì)介紹了Android獲取手機(jī)的版本號(hào)等信息的代碼,代碼很精彩,感興趣的小伙伴們可以參考一下2016-07-07
Android開(kāi)發(fā)之將兩張圖片合并為一張圖片的方法
這篇文章主要介紹了Android開(kāi)發(fā)之將兩張圖片合并為一張圖片的方法,涉及Android基于Canvas類操作圖片的相關(guān)技巧,需要的朋友可以參考下2016-01-01
Android 自定義TextView實(shí)現(xiàn)滑動(dòng)解鎖高亮文字
這篇文章主要介紹了Android 自定義TextView實(shí)現(xiàn)滑動(dòng)解鎖高亮文字的相關(guān)資料,需要的朋友可以參考下2018-03-03
Android程序開(kāi)發(fā)之ListView實(shí)現(xiàn)橫向滾動(dòng)(帶表頭與固定列)
這篇文章主要介紹了Android程序開(kāi)發(fā)之ListView實(shí)現(xiàn)橫向滾動(dòng)(帶表頭與固定列)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07
android 拷貝sqlite數(shù)據(jù)庫(kù)到本地sd卡的方法
下面小編就為大家?guī)?lái)一篇android 拷貝sqlite數(shù)據(jù)庫(kù)到本地sd卡的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03
一文教你如何使用Databinding寫一個(gè)關(guān)注功能
這篇文章主要介紹了一文教你如何使用Databinding寫一個(gè)關(guān)注功能,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
Android getSystemService用法實(shí)例總結(jié)
這篇文章主要介紹了Android getSystemService用法,結(jié)合實(shí)例形式總結(jié)分析了getSystemService獲取系統(tǒng)Service的相關(guān)使用方法與注意事項(xiàng),需要的朋友可以參考下2016-01-01

