ScrollView:如何检查一个视图是否在屏幕上可见

20

我有一个定义如下的ScrollView:

<ScrollView
    ... 
    .../>
    <LinearLayout
        ...
        ...>

        <!-- content -->

    </LinearLayout>
</ScrollView>

我用一些ImageView动态地填充了LinearLayout。现在,是否有一种方法可以检查当一个ImageView变得可见或不可见时(例如当我向下滚动时)?


2
请查看此答案:https://dev59.com/bW865IYBdhLWcg3wfemU#12428208 - Matt K
这篇帖子可能会有所帮助:https://dev59.com/I2445IYBdhLWcg3w7ug0 - Steve Waring
请查看此答案 https://dev59.com/I2445IYBdhLWcg3w7ug0#47280300 - Himanshu
3个回答

32

要检查视图是否完全/部分可见,您可以使用:

boolean isViewVisible = view.isShown();

要确定它是否完全可见,请使用以下方法:

Rect rect = new Rect();
if(view.getGlobalVisibleRect(rect) 
    && view.getHeight() == rect.height() 
    && view.getWidth() == rect.width() ) {
    // view is fully visible on screen
}

1
我找到了一个情况,可以让view.getGlobalVisibleRect(rect)返回true :( - Farid

11
我会把这个答案转发给你:
如果图片是布局的一部分,它可能是“View.VISIBLE”,但这并不意味着它在可见屏幕范围内。如果这是你想要的,这样做就可以了:
Rect scrollBounds = new Rect();
scrollView.getHitRect(scrollBounds);
if (imageView.getLocalVisibleRect(scrollBounds)) {
    // imageView is within the visible window
} else {
    // imageView is not within the visible window
}

3

我为了得到一个准确的答案苦苦挣扎,以下方法解决了我的问题。

final ScrollView scrollView = findViewById(R.id.scrollView);

scrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
            @Override
            public void onScrollChanged() {
                Rect scrollBounds = new Rect();
                scrollView.getHitRect(scrollBounds);
                if (yourImageView.getLocalVisibleRect(scrollBounds)) {
                    // The ImageView is Visible on the screen while scrolling
                } else {
                    // The ImageView is not Visible on the screen while scrolling
            }
            }
        });

在OnScrollChangedListener中的代码不断检查ImageView是否可见并显示在屏幕上,一旦滚动并且ImageView不可见,它会立即被检测到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接