android - 确定 View 是否在屏幕上 - Android

标签 android view scrollview visibility

我对这个有点坚持 - 首先,以下链接很有用,但是我提出了一些可见性问题:

链接:Check view visibility

我有一个 ScrollView (父 View )和许多 subview (LinearLayout -> TableLayout )等。我设置了许多项目为 View.GONE在 XML (android:visibility="gone") 中。

我有一些简单的代码可以使用 getVisibility() 来确定它是否可见但是,当我将项目设置为 View.VISIBLE并立即尝试getDrawingRect()我得到一个全线为零的矩形。任何进一步的点击都会获得正确的坐标。

现在这可能是因为从未绘制过 View (如 XML 中定义的那样)导致它不返回坐标,但我确实设置了 View.VISIBLE在尝试确定屏幕可见性之前。是不是我需要从 onDraw() 中获得某种回调?或者也许设置代码中隐藏项的 View 可见性。有点烦人;(

一些代码:

Rect scrollBounds = new Rect();
scroll.getHitRect(scrollBounds);

Rect viewBounds = new Rect();

if (view.getVisibility() == View.GONE) {
    view.setVisibility(View.VISBLE)


    viewBounds.getDrawingRect(viewBounds);
    if (!Rect.intersects(scrollBounds, viewBounds) {
        // do somthing
    } 
}

布局区域如下:

  • ScrollView
    • LinearLayout
      • TableLayout
        • Button
        • HiddenView

当然,我很有可能完全走错了路 - 基本上我只是想确保 ScrollView 自行定位,以便可以看到整个可见的 View 。

如果需要任何其他信息,请告诉我!

最佳答案

好的,感谢 OceanLife 为我指明了正确的方向!确实需要回调,ViewTreeObserver.OnGlobalLayoutListener() 成功了。我最终针对我的 fragment 类实现了监听器,并在我需要的地方拾取了它。感谢您对多次调用的警告,我使用 removeOnGlobalLayoutListener() 方法解决了这个问题 - 很有魅力。

代码:

...

// vto initialised in my onCreateView() method

vto = getView().getViewTreeObserver();
vto.addOnGlobalLayoutListener(this);

...

@Override
    public void onGlobalLayout() {

        final int i[] = new int[2];
        final Rect scrollBounds = new Rect();

        sView.getHitRect(scrollBounds);
        tempView.getLocationOnScreen(i);

        if (i[1] >= scrollBounds.bottom) {
            sView.post(new Runnable() {
                @Override
                public void run() {
                    sView.smoothScrollTo(0, sView.getScrollY() + (i[1] - scrollBounds.bottom));
                }
            });
        }

        vto.removeOnGlobalLayoutListener(this);
    }

现在只需要做一些清理工作......

关于android - 确定 View 是否在屏幕上 - Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15874260/

相关文章:

java - 用垂直线和水平线/ View 划分屏幕

ruby-on-rails - 将 button_to 与文本 : twitter-bootstrap-rails 内联

Android:: View 知道它何时滚动吗?

android - 如何滚动背景图片?

Android ViewPager,如何使兄弟 View 变小变暗

android - 来自邮箱应用程序的日期和时间选择器小部件

java - 是否可以引用静态字符串作为Android list 中的值?

android - 图片在 iPhone 上不起作用,但在 Android 上可以吗?

mysql - 授予用户权限以仅查看 MySQL View 而不是其他 View

android scrollView 最大滚动