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

Ham*_*4h_ 21 android visibility view scrollview

我有点坚持这一个 - 首先,下面的链接已经然而有用的,我想出了一个有点能见度的问题:

链接:检查视图可见性

我有一个滚动视图(父)和若干子视图(LinearLayout- > TableLayout)等有许多项的予设定为View.GONEXML中(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
    } 
}
Run Code Online (Sandbox Code Playgroud)

布局区域如下:

  • ScrollView
    • LinearLayout
      • TableLayout
        • Button
        • HiddenView

当然,我很可能完全以错误的方式解决这个问题 - 基本上我只是想确保scrollview定位自己以便可以看到已经变得可见的视图.

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

Ham*_*4h_ 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);
    }
Run Code Online (Sandbox Code Playgroud)

刚刚做了一些清理工作......


Oce*_*ife 11

所以,如果我正确地阅读这个问题,那么你想要找出布局中某些视图的尺寸,以确定你是否与父母有一个交集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
      } 
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

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

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

旁白:在Square广场上设计了一个FEST hamcrest库,可以让你在Robotium旁边写一个测试.看看吧.