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
ButtonHiddenView当然,我很可能完全以错误的方式解决这个问题 - 基本上我只是想确保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旁边写一个测试.看看吧.
| 归档时间: |
|
| 查看次数: |
26226 次 |
| 最近记录: |