我对这一点感到有些困惑 - 首先,以下链接非常有用但是我已经提出了一些可见性方面的问题:
我有一个滚动视图(父级)和一些子视图(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定位自己以便可以看到已经变得可见的视图。
如果需要任何其他信息,请与我们联系!
答案 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