知识点:
From the JavaDoc of getGlobalVisibleRect:
/**
* If some part of this view is not clipped by any of its parents, then
* return that area in r in global (root) coordinates. To convert r to local
* coordinates (without taking possible View rotations into account), offset
* it by -globalOffset (e.g. r.offset(-globalOffset.x, -globalOffset.y)).
* If the view is completely clipped or translated out, return false.
*
* @param r If true is returned, r holds the global coordinates of the
* visible portion of this view.
* @param globalOffset If true is returned, globalOffset holds the dx,dy
* between this view and its root. globalOffet may be null.
* @return true if r is non-empty (i.e. part of the view is visible at the
* root level.
*/
getLocalVisibleRect calls getGlobalVisibleRect and then makes it local as suggested:
r.offset(-offset.x, -offset.y); // make r local`
So:
- It doesn't return a Rectangle, it returns a boolean. But it can set the parameters of a rectangle you pass, and that must be an android.graphics.Rect rectangle;
- The rectangle r will be filled with local coordinates;
- I'm not sure but I think it's the same for visibile and invisible views, while it should return false for views with
visibility="gone"
详见http://www.myexception.cn/android/1884660.html
private boolean isViewCompletelyVisible(View view) { Rect scrollBounds = new Rect(); mRecyclerView.getHitRect(scrollBounds); if (view.getLocalVisibleRect(scrollBounds)) { //此控件至少有一个像素在可视范围内 Rect rect = new Rect(); view.getGlobalVisibleRect(rect); if (YoukuUtil.isPad()) { if (view.getHeight() <= (rect.bottom - rect.top) && (rect.top >= 0 && rect.top < YoukuUtil.getScreenRealWidth(getActivity().getApplicationContext())) && (rect.bottom > 0 && rect.bottom <= YoukuUtil.getScreenRealWidth(getActivity().getApplicationContext()))) { return true; } } else { if (view.getHeight() <= (rect.bottom - rect.top) && (rect.top >= 0 && rect.top < YoukuUtil.getScreenRealHeight(getActivity().getApplicationContext())) && (rect.bottom > 0 && rect.bottom <= YoukuUtil.getScreenRealHeight(getActivity().getApplicationContext()))) { return true; } } } return false; }