Android獲取view高度的三種方式
本文為大家分享了Android獲取view高度的方法,供大家參考,具體內(nèi)容如下
getMeasuredHeight()與getHeight的區(qū)別
實(shí)際上在當(dāng)屏幕可以包裹內(nèi)容的時(shí)候,他們的值相等,
只有當(dāng)view超出屏幕后,才能看出他們的區(qū)別:
getMeasuredHeight()是實(shí)際View的大小,與屏幕無(wú)關(guān),
而getHeight的大小此時(shí)則是屏幕的大小。
當(dāng)超出屏幕后,getMeasuredHeight()等于getHeight()加上屏幕之外沒(méi)有顯示的大小
具體方法
我們知道在oncreate中View.getWidth和View.getHeight無(wú)法獲得一個(gè)view的高度和寬度,這是因?yàn)閂iew組件 布局要在onResume回調(diào)后完成。
下面說(shuō)三種方式
getViewTreeObserver
使用 getViewTreeObserver().addOnGlobalLayoutListener()來(lái)獲得寬度或者高度。
OnGlobalLayoutListener 是ViewTreeObserver的內(nèi)部類(lèi),當(dāng)一個(gè)視圖樹(shù)的布局發(fā)生改變時(shí),可以被ViewTreeObserver監(jiān)聽(tīng)到,這是一個(gè)注冊(cè)監(jiān)聽(tīng)視圖樹(shù)的觀察者(observer),在視圖樹(shù)的全局事件改變時(shí)得到通知。ViewTreeObserver不能直接實(shí)例化,而是通過(guò)getViewTreeObserver()獲得。
除了OnGlobalLayoutListener ,ViewTreeObserver還有如下內(nèi)部類(lèi):
interfaceViewTreeObserver.OnGlobalFocusChangeListener
當(dāng)在一個(gè)視圖樹(shù)中的焦點(diǎn)狀態(tài)發(fā)生改變時(shí),所要調(diào)用的回調(diào)函數(shù)的接口類(lèi)
interfaceViewTreeObserver.OnGlobalLayoutListener
當(dāng)在一個(gè)視圖樹(shù)中全局布局發(fā)生改變或者視圖樹(shù)中的某個(gè)視圖的可視狀態(tài)發(fā)生改變時(shí),所要調(diào)用的回調(diào)函數(shù)的接口類(lèi)
interfaceViewTreeObserver.OnPreDrawListener
當(dāng)一個(gè)視圖樹(shù)將要繪制時(shí),所要調(diào)用的回調(diào)函數(shù)的接口類(lèi)
interfaceViewTreeObserver.OnScrollChangedListener
當(dāng)一個(gè)視圖樹(shù)中的一些組件發(fā)生滾動(dòng)時(shí),所要調(diào)用的回調(diào)函數(shù)的接口類(lèi)
interfaceViewTreeObserver.OnTouchModeChangeListener
當(dāng)一個(gè)視圖樹(shù)的觸摸模式發(fā)生改變時(shí),所要調(diào)用的回調(diào)函數(shù)的接口類(lèi)
其中,我們可以利用OnGlobalLayoutListener來(lái)獲得一個(gè)視圖的真實(shí)高度。
private int mHeaderViewHeight; private View mHeaderView; ..... mHeaderView.getViewTreeObserver().addOnGlobalLayoutListener( new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { mHeaderViewHeight = mHeaderView.getHeight(); mHeaderView.getViewTreeObserver() .removeGlobalOnLayoutListener(this); } });
但是需要注意的是OnGlobalLayoutListener可能會(huì)被多次觸發(fā),因此在得到了高度之后,要將OnGlobalLayoutListener注銷(xiāo)掉。
View post事件中獲取
還可以在VIew的post方法中獲取
public class TestHeight extends Activity { TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_activity_b); tv = (TextView) findViewById(R.id.textView); tv.post(new Runnable() { @Override public void run() { int height= tv.getHeight(); } }); } }
直接測(cè)量計(jì)算
int intw=View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED); int inth=View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED); textView.measure(intw, inth); int intwidth = textView.getMeasuredWidth(); int intheight = textView.getMeasuredHeight();
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android定時(shí)器實(shí)現(xiàn)定時(shí)執(zhí)行、重復(fù)執(zhí)行、定時(shí)重復(fù)執(zhí)行、定次數(shù)執(zhí)行的多種方式
今天小編就為大家分享一篇關(guān)于Android定時(shí)器實(shí)現(xiàn)定時(shí)執(zhí)行、重復(fù)執(zhí)行、定時(shí)重復(fù)執(zhí)行、定次數(shù)執(zhí)行的多種方式,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12Android中調(diào)用系統(tǒng)的文件瀏覽器及自制簡(jiǎn)單的文件瀏覽器
這篇文章主要介紹了Android中調(diào)用系統(tǒng)自帶的文件瀏覽器及自制簡(jiǎn)單的文件瀏覽器的方法,這里的例子僅展示瀏覽而沒(méi)有添加復(fù)制粘貼剪切等文件管理操作,非常簡(jiǎn)單,需要的朋友可以參考下2016-04-04Android自定義View實(shí)現(xiàn)五星好評(píng)效果
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)五星好評(píng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11利用SpannableString和ImageSpan在textview中插入圖片的方法
這篇文章主要為大家詳細(xì)介紹了利用SpannableString和ImageSpan在textview中插入圖片的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11Android手機(jī)屏幕px與dp互轉(zhuǎn)的工具類(lèi)
今天小編就為大家分享一篇關(guān)于Android手機(jī)屏幕px與dp互轉(zhuǎn)的工具類(lèi),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03Android的HTTP類(lèi)庫(kù)Volley入門(mén)學(xué)習(xí)教程
這篇文章主要介紹了Android應(yīng)用開(kāi)發(fā)框架Volley的入門(mén)學(xué)習(xí)教程,Volley適合于輕量級(jí)的通信功能開(kāi)發(fā),善于處理JSON對(duì)象,需要的朋友可以參考下2016-02-02Android中AsyncTask的入門(mén)使用學(xué)習(xí)指南
AsyncTask異步任務(wù),用于執(zhí)行耗時(shí)任務(wù)并在UI線(xiàn)程中更新結(jié)果。下面這篇文章主要給大家介紹了關(guān)于Android中AsyncTask入門(mén)使用的相關(guān)資料,需要的朋友可以參考下2019-02-02