나는 ScrollView
일련의을 보유하고 있습니다 Views
. 뷰가 현재 보이는지 여부를 확인할 수 있기를 원합니다 (그중 일부가 현재에 의해 표시되는 경우 ScrollView
). 아래 코드 가이 작업을 수행 할 것으로 예상하지만 놀랍게도 그렇지 않습니다.
Rect bounds = new Rect();
view.getDrawingRect(bounds);
Rect scrollBounds = new Rect(scroll.getScrollX(), scroll.getScrollY(),
scroll.getScrollX() + scroll.getWidth(), scroll.getScrollY() + scroll.getHeight());
if(Rect.intersects(scrollBounds, bounds))
{
//is visible
}
답변
테스트중인보기 View#getHitRect
대신 사용하십시오 View#getDrawingRect
. 당신이 사용할 수있는 View#getDrawingRect
온ScrollView
명시 적으로 계산 대신 .
코드 View#getDrawingRect
:
public void getDrawingRect(Rect outRect) {
outRect.left = mScrollX;
outRect.top = mScrollY;
outRect.right = mScrollX + (mRight - mLeft);
outRect.bottom = mScrollY + (mBottom - mTop);
}
코드 View#getHitRect
:
public void getHitRect(Rect outRect) {
outRect.set(mLeft, mTop, mRight, mBottom);
}
답변
이것은 작동합니다 :
Rect scrollBounds = new Rect();
scrollView.getHitRect(scrollBounds);
if (imageView.getLocalVisibleRect(scrollBounds)) {
// Any portion of the imageView, even a single pixel, is within the visible window
} else {
// NONE of the imageView is within the visible window
}
답변
보기가 완전히 표시 되는지 감지하려면 다음을 수행하십시오 .
private boolean isViewVisible(View view) {
Rect scrollBounds = new Rect();
mScrollView.getDrawingRect(scrollBounds);
float top = view.getY();
float bottom = top + view.getHeight();
if (scrollBounds.top < top && scrollBounds.bottom > bottom) {
return true;
} else {
return false;
}
}
답변
내 솔루션은 NestedScrollView
스크롤 요소를 사용하는 것입니다 .
final Rect scrollBounds = new Rect();
scroller.getHitRect(scrollBounds);
scroller.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
@Override
public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
if (myBtn1 != null) {
if (myBtn1.getLocalVisibleRect(scrollBounds)) {
if (!myBtn1.getLocalVisibleRect(scrollBounds)
|| scrollBounds.height() < myBtn1.getHeight()) {
Log.i(TAG, "BTN APPEAR PARCIALY");
} else {
Log.i(TAG, "BTN APPEAR FULLY!!!");
}
} else {
Log.i(TAG, "No");
}
}
}
});
}
답변
getLocalVisibleRect를 사용하여 Bill Mote의 답변을 조금 확장하려면 뷰가 부분적으로 만 보이는지 확인하십시오.
Rect scrollBounds = new Rect();
scrollView.getHitRect(scrollBounds);
if (!imageView.getLocalVisibleRect(scrollBounds)
|| scrollBounds.height() < imageView.getHeight()) {
// imageView is not within or only partially within the visible window
} else {
// imageView is completely visible
}
답변
이 확장은보기를 완전히 볼 수있게합니다.
귀하 View
가 …의 자녀의 자녀 인 경우에도 작동합니다 ScrollView
(예 : ScrollView
-> LinearLayout
-> ContraintLayout
-> …-> YourView
).
fun ScrollView.isViewVisible(view: View): Boolean {
val scrollBounds = Rect()
this.getDrawingRect(scrollBounds)
var top = 0f
var temp = view
while (temp !is ScrollView){
top += (temp).y
temp = temp.parent as View
}
val bottom = top + view.height
return scrollBounds.top < top && scrollBounds.bottom > bottom
}
노트
1) view.getY()
과 view.getX()
는 x, y의 값을 반환 먼저 부모 .
2) 다음은 LinkgetDrawingRect
를 반환 하는 방법에 대한 예 입니다.
답변
public static int getVisiblePercent(View v) {
if (v.isShown()) {
Rect r = new Rect();
v.getGlobalVisibleRect(r);
double sVisible = r.width() * r.height();
double sTotal = v.getWidth() * v.getHeight();
return (int) (100 * sVisible / sTotal);
} else {
return -1;
}
}