我有一个RelativeLayout
它的大小占据了所有可用的屏幕区域Activity
。也就是说,它会填满除通知栏以外的所有屏幕区域。
我正在使用 ActionBarSherlock。ActionBar 使用getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY)
. 因此,my 的高度RelativeLayout
从通知栏的正下方一直延伸到屏幕的底部,并且View
它所持有的任何 child 都可能被放置在 ActionBar 的后面。因此,ActionBar 肯定在覆盖模式下运行。我确认运行 2.2、4.0.x(ICS) 和 4.1(JB) 的设备就是这种情况。
因为我的应用程序在 this 中实现了拖放机制RelativeLayout
,所以我需要知道布局在屏幕上的位置,以便更正由 返回的绝对屏幕 Y 触摸值getRawY()
。为了实现这一点,在布局阶段完成后,我一直在mRelativeLayout.getLocationOnScreen()
调用onWindowFocusChanged()
.
在我的 4.0 和 4.1 设备上,对 的调用getLocationOnScreen()
产生了一个与最顶部通知栏的高度(以像素为单位)相匹配的 Y 值。为了确定通知栏和 ActionBar 组合的高度,我会将返回的 Y 值添加getLocationOnScreen()
到 ActionBarSherlockgetHeight()
方法的结果中。
问题是在 2.2 设备上进行测试时,getLocationOnScreen()
返回的 Y 值已经是通知栏高度加上 ABS 高度。即使 ABS 设置为覆盖模式也是如此。
关于 SO 有一些关于令人难以置信的结果的问题getLocationOnScreen()
;这里有一个答案,它让我想到放弃getLocationOnScreen()
,而是通过从总屏幕高度中减去布局的高度来计算RelativeLayout
' 顶部 Y 偏移量:
DisplayMetrics dm = new DisplayMetrics();
this.getWindowManager().getDefaultDisplay().getMetrics(dm);
int mRelativeLayoutYOffs = dm.heightPixels - mRelativeLayout.getMeasuredHeight();
我发现这个结果的奇怪之处在于,它似乎给了我和我从getLocationOnScreen()
. 在 2.2 上发生的情况是,对.getMeasuredHeight()
on的调用RelativeLayout
实际上似乎给出了一个高度值,该高度值从 的实际高度中减去了 ActionBar 高度RelativeLayout
,即使ABS 设置为覆盖并且我已经在视觉上确认它肯定在叠加模式。
目前我能想到的最佳策略是 getLocationOnScreen()
根据操作系统版本对结果进行不同的处理。如果是 2.2,那么我知道它包括 ABS 高度。如果 4.0 以后,它不会。2.2和4.0之间的任何东西,我还不确定。也许人们可以帮助填写这些细节。也许在原生支持 ActionBar 的操作系统版本中引入了差异?如果它是可预测的并且可以很好地定义行为是什么,那么希望这将是一个安全的策略。
如果做不到这一点,是否有其他方法可以确定RelativeLayout
' 的顶部和左侧屏幕位置以纠正绝对屏幕触摸值?