Android : ScrollView 내부의보기가 보이는지 확인하는 방법은 무엇입니까? ScrollView). 아래

나는 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#getDrawingRectScrollView명시 적으로 계산 대신 .

코드 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;
        }
    }