java 的getlocation_java – getLocationOnScreen()vs 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,求和视图坐标和

减去父滚动偏移量.在上面描述的情况下,ViewRootImpl从WindowSession获取状态栏高度,并通过fitSystemWindows向下传递给ActionBarOverlayLayout,后者将此值添加到操作栏高度.然后ActionBarOverlayLayout获取此求和值并将其作为边距应用于其内容视图(布局的父级).

因此,您的内容布局低于状态栏,而不是因为窗口从较低的y坐标开始而不是状态栏,而是由于边距应用于您的活动的内容视图.

如果您查看getLocationOnScreen源,您将看到它只调用getLocationInWindow,然后添加Window的左和顶部coords(它们也通过ViewRootImpl传递给View,它从WindowSession获取它们).在正常情况下,这些值都将为零.在某些情况下,这些值可能不为零,例如放置在屏幕中间的对话窗口.

因此,总结一下:正常活动的窗口填满整个屏幕,甚至是状态栏和装饰下的空间.有问题的两种方法将返回相同的x和y坐标.只有在窗口实际偏移的对话框等特殊情况下,这两个值才会不同.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值