- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
这两种方法的上下文中screen和view有什么区别?
我有一个按钮,我想获取其中心的 x 坐标。
我想这就够了:
public int getButtonXPosition() {
return (button.getLeft()+button.getRight())/2;
}
但是,如果我使用它会有什么不同
getLocationOnScreen()
或 getLocationInWindow()
?
(当然是按钮宽度的一半)
最佳答案
我不认为 this answer是正确的。如果我创建一个新项目,并通过添加以下代码段仅编辑 MainActivity:
public boolean dispatchTouchEvent(MotionEvent ev) {
View contentsView = findViewById(android.R.id.content);
int test1[] = new int[2];
contentsView.getLocationInWindow(test1);
int test2[] = new int[2];
contentsView.getLocationOnScreen(test2);
System.out.println(test1[1] + " " + test2[1]);
return super.dispatchTouchEvent(ev);
}
我会看到打印到控制台108 108
。这是使用运行 4.3 的 Nexus 7。使用运行 android 版本的模拟器,我也有类似的结果,可以追溯到 2.2。
普通 Activity 窗口将 FILL_PARENTxFILL_PARENT 作为其 WindowManager.LayoutParams,这导致它们布局为整个屏幕的大小。窗口位于状态栏和其他装饰下方(关于 z 顺序,而不是 y 坐标),所以我相信更准确的图表是:
|--phone screen-----activity window---|
|--------status bar-------------------|
| |
| |
|-------------------------------------|
如果您逐步了解这两种方法的源代码,您会看到 getLocationInWindow
向上遍历 View 的 View 层次结构,直至 RootViewImpl,将 View 坐标和减去父滚动偏移量。在我上面描述的情况下,ViewRootImpl 从 WindowSession 获取状态栏高度,并通过 fitSystemWindows 向下传递到 ActionBarOverlayLayout,它将这个值添加到操作栏高度。 ActionBarOverlayLayout 然后将这个总和值应用到它的内容 View ,它是你的布局的父级,作为一个边距。
因此,您的内容布局低于状态栏并不是因为窗口从低于状态栏的 y 坐标开始,而是因为您的 Activity 的内容 View 应用了边距。
如果您查看 getLocationOnScreen
源代码,您会看到它只是调用 getLocationInWindow
然后添加窗口的左坐标和上坐标(也通过ViewRootImpl,它从 WindowSession 中获取它们)。在正常情况下,这些值都为零。在某些情况下,这些值可能不为零,例如位于屏幕中间的对话窗口。
所以,总结一下:一个正常 Activity 的窗口会填满整个屏幕,甚至是状态栏和装饰下方的空间。有问题的两种方法将返回相同的 x 和 y 坐标。只有在特殊情况下,例如窗口实际偏移的对话框,这两个值才会不同。
关于java - getLocationOnScreen() 与 getLocationInWindow(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17672891/
我需要获取应用程序在屏幕上的坐标,以将它们用作弹出窗口的偏移量。 View tempView = (View) findViewById(R.layout.ma
我将以下 3 个包裹在 RelativeLayout 中(忽略 visibility="gone")。 当我调用 view.getLocationOnScreen(pos); 我为 pos[0]
据我所知,当我们将 int[2] 位置数组传递给 view.getLocationOnScreen(location) 时,我们将获得该 View 的左上角坐标。但是当我调试这个函数时,我看到那个位置
我正在使用以下代码获取按钮的位置,但它总是返回零。为什么会这样 Button b=(Button) findViewById(R.id.button2); final int[] x=
我有什么: 具有 android:configChanges="orientation|screenSize|keyboardHidden" 的 Activity 上面有一个 DialogFragme
我在 JButton“支持”上的 ActionListener 中有以下代码。 cl.across.text 是我的 GUI 中的另一个 JTextArea。问题在于点 pt1 给出的结果。 Fram
View.getLocationOnScreen() 返回 View 的 X 和 Y 坐标。 单位是像素还是 DIP? 产地在哪里?左上角? 该位置指的是 View 的哪个角? 轴往哪个方向走?例如3
我调用getLocationOnScreen()来 self 的 Swing 应用程序中的 JFrame。如果 JFrame 最小化为 -32000,则返回 -32000。 预计: Location
我想将 View 的边界投影/转换为屏幕坐标。局部边界是 0,0,1280,628,我 View 正上方的 ActionBar 是 108 像素高。 问题是 view.getLocationOnScr
我试图在 GridLayout 中获取 ImageView 的 x/y,但我的日志一直显示 X & Y: 0 0 有什么想法吗? ... ...
这两种方法的上下文中screen和view有什么区别? 我有一个按钮,我想获取其中心的 x 坐标。 我想这就够了: public int getButtonXPosition() { retu
需要帮助: 我尝试对放置在 FlowLayout 内的每个组件调用 getLocationOnScreen() 并最终获得相同的位置。 这是设计使然还是我做错了什么?那么我应该如何获取每个组件的确切位
我需要获取 JFrame 位置以保存应用程序位置。但问题是 getLocationOnScreen() 返回不正确的结果。或者至少看起来是这样。 public static void main(Str
在响应按钮点击时在 ImageView(或其他 View )上调用 getLocationOnScreen() 会给出正确的值。 但是当从 Activity::onCreate() 调用 getLoc
据我了解,getLocationOnScreen 返回的位置在 Y 轴上从屏幕角的最左上角起增加了状态栏(或操作栏或标题栏?)的高度。 getLocationInWindow 返回 Activity
对 getLocationOnScreen() 或 getLocationInWindow() 的调用都给了我一个 top/Y 坐标约为 30px (status/通知栏的高度)太低了。 left/X
对 Android 很陌生,已经研究了一段时间,但找不到答案。我确信有一个简单的解决方案。 我收到一个 NullPointException,它连接到我的 View characterContaine
在 Android 2.1 模拟器上。 在 ActivityInstrumentationtestCase2 测试类中, 我断言 phototButton 在 sendButton 之上。 @UiTh
在我的 FragmentLayout 中,我有一个带有多个 subview (TextView、CardView)的 LinearLayout。我想找到所有 LinearLayout View 的顶部
我有一个带有 EditText 的 dialog,当用户点击它时,软键盘出现并将 dialog 向上推(以免隐藏)。当键盘关闭时,EditText 恢复其原始位置。这是标准行为。 EditText 明
我是一名优秀的程序员,十分优秀!