确定视图是否在屏幕上 - Android

时间:2013-04-08 08:12:13

标签: android view scrollview visibility

我对这一点感到有些困惑 - 首先,以下链接非常有用但是我已经提出了一些可见性方面的问题:

链接:Check view visibility

我有一个滚动视图(父级)和一些子视图(LinearLayout - > TableLayout)等。我设置的内容有很多项View.GONE XML(android:visibility="gone")。

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

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

一些代码:

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定位自己以便可以看到已经变得可见的视图。

如果需要任何其他信息,请与我们联系!

2 个答案:

答案 0 :(得分:19)

好的,感谢OceanLife让我指向正确的方向!确实需要回调,ViewTreeObserver.OnGlobalLayoutListener()就可以了。我最终实现了对我的片段类的监听器,并在我需要它的地方拾起它。感谢关于多个电话的警告,我使用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);
    }

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

答案 1 :(得分:10)

所以,如果我正确地阅读了这个问题,那么您想要找出布局中某些视图的尺寸,以确定您是否与父ScrollView有交集。

我认为你所看到的(正如你所提到的)是绘制被调度视图的指令,然后在某种竞争条件下,渲染器解析布局的测量值视图对象获得实际大小的实际渲染。找出视图在屏幕上具有哪种维度的一种方法是使用布局树监听器。我们使用此观察者来利用Google Charts API来解析屏幕的尺寸,这需要定义像素宽度和高度......当然,Android上可能是开发人员面临的最大问题。所以观察(双关语);

final ViewTreeObserver vto = chart.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

  /**
   * @see android.view.ViewTreeObserver.OnGlobalLayoutListener#onGlobalLayout()
   */
  @SuppressWarnings("deprecation")
  @Override
  public void onGlobalLayout() {
    if (view.getVisibility() == View.GONE) {
      view.setVisibility(View.VISBLE)
      viewBounds.getDrawingRect(viewBounds);
      if (!Rect.intersects(scrollBounds, viewBounds) {
        // do something
      } 
    }
  }
});

当渲染器关闭最终解决方案时,onGlobalLayout将被多次调用警告。最后一个电话是我们采取的。

这将为您提供一种机制,用于对绘制的视图执行操作,例如获取视图组件的宽度和高度。希望能帮到你。

除此之外:Square广场上的聪明人员设计了一个FEST hamcrest库,可以让你在Robotium旁边编写一个测试。 Check it out