我对这个有点困惑 - 首先也是最重要的是,以下链接很有用,但是我提出了一些可见性问题:
链接:检查视图可见性 https://stackoverflow.com/questions/4628800/android-how-to-check-if-a-view-inside-of-scrollview-is-visible
我有一个滚动视图(父视图)和许多子视图(LinearLayout
-> TableLayout
)等。我设置了很多项目View.GONE
在 XML 中(android:visibility="gone"
).
我有一些简单的代码来确定它是否可见getVisibility()
但是当我将该项目设置为View.VISIBLE
并尝试立即getDrawingRect()
我得到一个全是零的矩形。任何进一步的单击都会获得正确的坐标。
现在,这可能是因为视图从未被绘制过(如 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
}
}
布局区域如下:
当然,我很可能完全以错误的方式处理这个问题 - 基本上我只是想确保滚动视图定位自身,以便可以完整地看到已经变得可见的视图。
如果需要任何其他信息,请告诉我!
好的,感谢 OceanLife 为我指明了正确的方向!确实需要回调并且ViewTreeObserver.OnGlobalLayoutListener()
成功了。我最终针对我的片段类实现了侦听器,并在需要的地方选取了它。也感谢您关于多次通话的警告,我使用以下方法解决了这个问题removeOnGlobalLayoutListener()
方法——有魅力。
Code:
...
// 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);
}
现在要做一些清理工作...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)