Android 判斷一個 View 是否可見 getLocalVisibleRect(rect) 與 getGlobalVisibleRect(rect)


Android 判斷一個 View 是否可見 getLocalVisibleRect(rect) 與 getGlobalVisibleRect(rect)

這兩個方法的區別

  • View.getGlobalVisibleRect(rect); //以屏幕 左上角 為參考系的
  • View.getLocalVisibleRect(rect); //以目標 View 左上角 為參考系

鑒於這一點的區別,View.getLocalVisibleRect(rect) 的 rect.left 恆等於 0 .

判斷是否可見

boolean localVisibleRect = target.getLocalVisibleRect(rect);

進入方法的源碼可以看到:

    public final boolean getLocalVisibleRect(Rect r) {
        final Point offset = mAttachInfo != null ? mAttachInfo.mPoint : new Point();
        if (getGlobalVisibleRect(r, offset)) {
            r.offset(-offset.x, -offset.y); // make r local
            return true;
        }
        return false;
    }

1. true : View 全部或者部分 可見
2. false : View 全部不可見

在返回 true (即 View 全部或者部分 可見)時,r.offset(-offset.x, -offset.y); // make r localrect 的四個坐標進行了偏移.

如果是豎直的 Scrollview 里面的一個 View 在向上滑動的過程中,狀態由 全部可見 --> 部分可見 --> 全部不可見 ,其Rect.top的變化是:
注: 這里獲取 View 的高度是 height 像素.

  1. 全部可見 : Rect.top 恆為 0;
  2. 部分可見 : Rect.top 的值 由 0 --> height
  3. **全部不可見: ** 在全部不可見的瞬間,Rect.top 的值由 height 突變為 - height,其后隨着滑動的距離越遠,負值越大,建議自己打log查看下,這里沒有截取 log,是因為 log 太多了.

**總結: ** 當 Rect.top 的值不為 0 時,View 要么部分可見,要么完全不可見.那么當我們需要 View 在有一點點不可見時就返回 false 可以這樣處理:

//當 View 有一點點不可見時立即返回false!
public static boolean isVisibleLocal(View target){
        Rect rect =new Rect();
        target.getLocalVisibleRect(rect);
        return rect.top==0;
    }

可以使用的場景還是很多的,比如類似淘寶滑動可以懸停在頂部的 View,當View 滑到有一點不可見時就需要把 外層的 懸浮View 顯示出來,當滑動的 View 完全可見時才把 懸浮的View 隱藏掉.

最后

根據 返回的 Rect 我們其實還可以做更多的事,比如 計算正在 View 顯示部分的面積等,只是目前不知道 求出面積 ,然后呢,干嘛呢....mdzz...=.=


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM