java – getLocationOnScreen()vs getLocationInWindow()
在这两种方法的上下文中,屏幕和视图有什么区别?
我有一个按钮,我想得到它的中心的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. 正常活动窗口将具有FILL_PARENTxFILL_PARENT作为其WindowManager.LayoutParams,这将导致它们布局为整个屏幕的大小.窗口布局在下面(关于z顺序,而不是y坐标)状态栏和其他装饰,所以我相信更准确的图表将是: |--phone screen-----activity window---| |--------status bar-------------------| | | | | |-------------------------------------| 如果您逐步浏览这两个方法的源代码,您将看到getLocationInWindow遍历视图的视图层次结构,直到RootViewImpl,求和视图坐标和 因此,您的内容布局低于状态栏,而不是因为窗口从较低的y坐标开始而不是状态栏,而是由于边距应用于您的活动的内容视图. 如果您查看getLocationOnScreen源,您将看到它只调用getLocationInWindow,然后添加Window的左和顶部coords(它们也通过ViewRootImpl传递给View,它从WindowSession获取它们).在正常情况下,这些值都将为零.在某些情况下,这些值可能不为零,例如放置在屏幕中间的对话窗口. 因此,总结一下:正常活动的窗口填满整个屏幕,甚至是状态栏和装饰下的空间.有问题的两种方法将返回相同的x和y坐标.只有在窗口实际偏移的对话框等特殊情况下,这两个值才会不同. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |