代碼片段:
ImageView rectImage = findViewById(R.id.rect_image);
rectImage.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect localRect = new Rect();
//getLocalVisibleRect相對于View本身左上角進行計算
rectImage.getLocalVisibleRect(localRect);
Log.i("lyyyyyyyyy", "getLocalVisibleRect: "+localRect.toString());
//getGlobalVisibleRect相對于整個螢屏坐標系進行計算
rectImage.getGlobalVisibleRect(localRect);
Log.i("lyyyyyyyyy", "getGlobalVisibleRect: "+localRect.toString());
}
});
// 列印結果:
2021-02-19 17:37:57.658 17409-17409/com.example.myapplication4 I/lyyyyyyyyy: getLocalVisibleRect: Rect(0, 0 - 165, 330)
2021-02-19 17:37:57.659 17409-17409/com.example.myapplication4 I/lyyyyyyyyy: getGlobalVisibleRect: Rect(458, 121 - 623, 451)
2021-02-19 17:37:57.671 17409-17409/com.example.myapplication4 I/lyyyyyyyyy: getLocalVisibleRect: Rect(0, 0 - 165, 330)
2021-02-19 17:37:57.671 17409-17409/com.example.myapplication4 I/lyyyyyyyyy: getGlobalVisibleRect: Rect(458, 121 - 623, 451)
2021-02-19 17:37:58.639 17409-17409/com.example.myapplication4 I/lyyyyyyyyy: getLocalVisibleRect: Rect(0, 0 - 165, 330)
2021-02-19 17:37:58.639 17409-17409/com.example.myapplication4 I/lyyyyyyyyy: getGlobalVisibleRect: Rect(458, 121 - 623, 451)
GlobalLayoutListener:布局的狀態發生變化或者可見性發生變化才會呼叫,準確的說,這個不是監聽View的加載完成,而是監聽布局變化的,
所以會呼叫多次,使用的時候需要注意,
解決的辦法就是第一次回呼后,就把回呼remove掉,如:rectImage.getViewTreeObserver().removeOnGlobalLayoutListener(this);
測驗不同情況下OnGlobalLayoutListener的呼叫次數:
1.啟動后呼叫了三次onGlobalLayout,
2.螢屏鎖屏會呼叫兩次,
3.退出app重進呼叫一次,
4.螢屏鎖屏后重新打開會呼叫兩次(小米兩次),其中一次猜測是控制元件的可見性改變了,
5.改變可見性和修改控制元件大小,修改layoutgravity一樣都會各自呼叫一次,
回到正題:
很明顯呼叫getLocalVisibleRect(Rect r)后localRect變數中的right和bottom正是圖片的長和寬,
而呼叫getGlobalVisibleRect(Rect r)后localRect變數中的top是ActionBar的高度+View的上邊距,bottom是top+View的高;left則為View的左邊距,right為left+View的寬,(Android獲取ActionBar高度鏈接)
所以目前的結論是:getLocalVisibleRect(Rect r)方法可以把View的長和寬映射到一個Rect物件上,映射的參照物就是View本身左上角的坐標系,
而getGlobalVisibleRect(Rect r)方法可以把View在整個螢屏中的偏移量映射到一個Rect物件上,映射的參照物是螢屏左上角的坐標系,
上面的情況是View沒有超出螢屏區域的資料,那么超出螢屏區域再次進行測驗會發現1.getGlobalVisibleRect()方法的作用是獲取視圖在螢屏坐標中的可視區域,只要該視圖沒有被遮擋rectImage.getLocalVisibleRect()的坐標總是等于:(0, 0, rectImage.getwidth(), rectImage.getheight()),而遮擋后的left和top則為以View本身左上角進行計算的偏移量,所以getLocalVisibleRect的作用是獲取視圖本身可見的坐標區域,坐標以自己的左上角為原點(0,0)
測驗圖:

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/261427.html
標籤:其他
