getLocationOnScreen() 与 getLocationInWindow()

2023-12-28

在这两种方法的上下文中,屏幕和视图有什么区别?

我有一个按钮,我想获取其中心的 x 坐标。

我想这就足够了:

public int getButtonXPosition() {
    return (button.getLeft()+button.getRight())/2;
}

但如果我使用的话会有什么不同

getLocationOnScreen() or getLocationInWindow() ?

(当然,还要加上按钮宽度的一半)


我不认为这个答案 https://stackoverflow.com/a/17673679是正确的。如果我创建一个新项目,并通过添加以下代码片段仅编辑 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 坐标开始,而是因为将边距应用于您的 Activity 的内容视图。

如果你凝视getLocationOnScreen来源你会看到它只是调用getLocationInWindow然后添加 Window 的左坐标和上坐标(这些坐标也由 ViewRootImpl 传递给 View,ViewRootImpl 从 WindowSession 中获取它们)。在正常情况下,这些值都为零。在某些情况下,这些值可能不为零,例如放置在屏幕中间的对话框窗口。


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

getLocationOnScreen() 与 getLocationInWindow() 的相关文章

  • 自动生成Flyway的迁移SQL

    当通过 Java 代码添加新模型 字段等时 JPA Hibernate 的自动模式生成是否可以生成新的 Flyway 迁移 捕获自动生成的 SQL 并将其直接保存到新的 Flyway 迁移中 以供审查 编辑 提交到项目存储库 这将很有用 预
  • 通过列表视图检查动态生成的复选框时遇到问题

    我知道其他成员已经提出了这个问题 一些成员也给出了解决方案 但问题是我没有找到任何适合我的应用程序的解决方案 我正在创建一个应用程序 其中我有一个屏幕 它将显示动态列表视图 其中包含列表项 复选框和三个文本视图 一个用于候选人姓名 另外两个
  • 从手机访问本地主机[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在使用
  • 如何使用 Hibernate (EntityManager) 或 JPA 调用 Oracle 函数或过程

    我有一个返回 sys refcursor 的 Oracle 函数 当我使用 Hibernate 调用该函数时 出现以下异常 Hibernate call my function org hibernate exception Generic
  • 如何检测 Java 字符串中的 unicode 字符?

    假设我有一个包含 的字符串 我如何找到所有这些 un icode 字符 我应该测试他们的代码吗 我该怎么做呢 例如 给定字符串 A X 我想将其转换为 AYXY 我想对其他 unicode 字符做同样的事情 并且我不想将它们存储在某种翻译映
  • 使用 Guice 优化注册表

    你好 今天思考了一种优化 有一些疑问 语境 我正在使用 Guice 2 进行 Java 开发 在我的网络应用程序中 我有一个转换器注册表 可以即时转换为某种类型 转换器描述如下 public class StringToBoolean im
  • 生成的序列以 1 开头,而不是注释中设置的 1000

    我想请求一些有关 Hibernate 创建的数据库序列的帮助 我有这个注释 下面的代码 在我的实体类中 以便为合作伙伴表提供单独的序列 我希望序列以 1000 开头 因为我在部署期间使用 import sql 将测试数据插入数据库 并且我希
  • 不显示 WRITE_EXTERNAL_STORAGE 的权限对话框

    I want to download a file using DownloadManager And DownloadManager wants to WRITE EXTERNAL STORAGE permission I have in
  • Java实现累加器类,提供Collector

    A Collector具有三种通用类型 public interface Collector
  • Freemarker 和 Struts 2,有时它计算为序列+扩展哈希

    首先我要说的是 使用 Struts2 Freemarker 真是太棒了 然而有些事情让我发疯 因为我不明白为什么会发生这种情况 我在这里问是因为也许其他人有一个想法可以分享 我有一个动作 有一个属性 说 private String myT
  • 流中的非终结符 forEach() ?

    有时 在处理 Java Stream 时 我发现自己需要一个非终端 forEach 来触发副作用但不终止处理 我怀疑我可以用 map item gt f item 之类的方法来做到这一点 其中方法 f 执行副作用并将项目返回到流中 但这似乎
  • 如何在 Java 中创建接受多个值的单个注释

    我有一个名为 Retention RetentionPolicy SOURCE Target ElementType METHOD public interface JIRA The Key Bug number JIRA referenc
  • JMenu 中的文本居中

    好吧 我一直在网上寻找有关此问题的帮助 但我尝试的任何方法似乎都不起作用 我想让所有菜单文本都集中在菜单按钮上 当我使用setHorizontalTextPosition JMenu CENTER 没有变化 事实上 无论我使用什么常量 菜单
  • 更改Android菜单的背景颜色[重复]

    这个问题在这里已经有答案了 我正在尝试将标准浅灰色更改为浅绿色 似乎没有一个简单的方法可以做到这一点 例如 通过 Android 主题 但我找到了一个解决方法 如本页所述 http tinyurl com 342dgn3 http tiny
  • 如何使用play框架上传多个文件?

    我在用play framework 2 1 2 使用java我正在创建视图来上传多个文件 我的代码在这里 form action routes upload up enctype gt multipart form data
  • 将 Apache Camel 执行器指标发送到 Prometheus

    我正在尝试转发 添加 Actuator Camel 指标 actuator camelroutes 将交换 交易数量等指标 发送到 Prometheus Actuator 端点 有没有办法让我配置 Camel 将这些指标添加到 Promet
  • 如何以编程方式创建活动转换?

    我想以编程方式创建一个动画 以从触摸屏点启动具有缩放效果的活动 接下来我模拟缩放输入效果
  • Android ADT Eclipse 插件,parseSDKContent 失败

    我刚刚设置了我的第一个 Android 开发环境 其中包括 日食3 5 Mac OS X 10 5 适用于 x86 mac 的 Android SDK ADT Eclipse 插件 0 9 6 我已将 set PATH 设置为我的 SDK
  • 异步更新后更新Android Listview

    我正在将 HTTP 调用从同步调用转换为异步调用 由于连接在后台运行 因此当我最初设置列表适配器时 数据不存在 如何在 HTTP 调用后更新列表适配器 我尝试了一些方法 例如在数据发送回之前不设置适配器并再次设置适配器 但没有任何效果 这是
  • 在java中使用多个bufferedImage

    我正在 java 小程序中制作游戏 并且正在尝试优化我的代码以减少闪烁 我已经实现了双缓冲 因此我尝试使用另一个 BufferedImage 来存储不改变的游戏背景元素的图片 这是我的代码的相关部分 public class QuizApp

随机推荐

  • 随机且唯一的子集生成

    假设我们有从 1 到 25 的数字 我们必须选择 15 个数字的集合 如果我没猜错的话 可能的集合是 3268760 在这 3268760 个选项中 您必须生成 100000 个 生成 100000 个唯一且随机的子集的最佳方法是什么 有没
  • T 树或 B 树

    T树算法描述于这张纸 http www vldb org conf 1986 P294 PDFT Tree是T tree的改进 可以更好地使用查询操作 包括范围查询 并且包含T tree的所有其他良好功能 该算法在论文 T tree A M
  • 使用 fields_for 时如何将范围应用于关联?

    我有一个包含许多任务的项目 每个任务都属于一个人 在我的项目编辑表单中 我允许编辑现有任务并使用嵌套对象表单工具添加新任务 http ryandaigle com articles 2009 2 1 what s new in edge r
  • 如何在iOS上使用代码截屏?

    如何以编程方式截取屏幕截图 您可以使用UIGraphicsBeginImageContext以此目的 例如 UIGraphicsBeginImageContextWithOptions self view bounds size self
  • 制作第三代iPad应用程序的注意事项

    我目前正在制作一个 iPad 应用程序 其中的视图是为 iPad 2 分辨率创建的 不过现在iPad已经出了双倍分辨率了 我也得支持一下 请直接告知要在应用程序中进行哪些更改才能支持 iPad 2 和第 3 代 iPad 我能想到的唯一方法
  • 使用 C# 和 UI Automation 获取未知控件类型的内容

    下图中有一个区域 其具有未知 自定义 类别 那不是网格或表格 我需要能够 选择该区域中的行 从每个单元格中获取一个值 问题是因为这不是一个常见的类型元素 我不知道如何用谷歌搜索这个问题或自己解决它 到目前为止 代码如下 Process pr
  • 交换结构体数组中的元素

    假设我有这个结构 struct MyStruct int iID int iMyNumber 然后我定义一个 MyStructs 数组 struct MyStruct msTest 3 我正在通过查看 ID 对类似于此的结构进行排序操作 现
  • 在 Nuxt.js (SPA) 中使用“

    我使用 nuxt js express 启动该项目 我们为 nuxt js 中的每个组件 vue 开发了样式 因此 在路由时 属性会叠加在同一个类名 样式 上 从而导致页面无法正常显示 1 样式范围 的正确用法是什么 2 或者路由过程应该是
  • 如何在 Notepad++ 中模仿 Visual Studio 的 CTRL-X、CTRL-V 功能?

    I m using Notepad for some projects and miss Visual Studio s Ctrl X Ctrl C functionality that cuts or copies the entire
  • 从另一个表单显示一个表单

    当我想通过单击另一个表单中的按钮来显示表单 C 时 我通常从要显示的表单创建一个对象并使用 show 方法 Form2 f2 new Form2 f2 Show 或者我与 所有者 一起工作 Form2 tempForm new Form2
  • 如何使用 WhenCustomCommandReceived 设置 Topshelf?

    我正在使用 Topshelf 创建一个 Windows 服务 ServiceClass 并且我正在考虑使用 WhenCustomCommandReceived 发送自定义命令 HostFactory Run x gt x EnablePau
  • 在使用 reticulate 创建的 virtualenv 中安装特定版本的 python 包

    使用时reticulate为了在 R 中使用 Python 我们可以通过命令创建一个 virtualenvreticulate virtualenv create指定 env 名称和 python bin 的路径 我们还可以将包添加到之前创
  • 将日期发布到 Web API 的正确方法?

    我正在从 Web API 读取数据并填充表单 当我将其提交回 Web API 时 出现以下错误 Message 发生错误 ExceptionMessage 属性 类型 MvcApplication1 Models ProductSale 上
  • 使此 WCF 客户端代码在 Mac 上的 Mono 和 MonoTouch 上运行?

    我试图让以下代码在 Mono 控制台应用程序中工作 并作为 MonoTouch 应用程序的最终目标 该代码在使用 Windows 控制台应用程序的 VS2008 下运行良好 当在 Mac 上将其作为 Mono 控制台应用程序运行时 我得到
  • 为 CoffeeScript 声明不同的编译路径

    我有一个 Scalatra 应用程序可以编译 CoffeeScript 使用https github com softprops coffeescripted sbt https github com softprops coffeescr
  • Spring MVC 打开PDF作为视图

    哪个 View 类适合渲染现有 PDF 抽象视图 我通过网络服务获取 PDF 所以我不打算子类 Abstract PdfView 来渲染 PDF 我想继续使用返回 ModelAndView 的 Spring 控制器类 这意味着编写我自己的
  • 进程在读取时挂起

    以下代码通过管道从其他进程读取消息 所有进程都正确打印出所有消息 但它们将永远不会继续经过 while 循环 尝试在 Eclipse 中进行调试 在阅读完所有消息后 它将停止在 while 循环处 索引是分配给每个进程的编号 第一个进程的索
  • 如何使用 PHP 生成二维码?

    我正在尝试将一些数据转换为网页上的二维码 为此 我使用 php qrcode Sourceforge 图书馆主页 http phpqrcode sourceforge net http phpqrcode sourceforge net 我
  • 将图片插入Excel单元格[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想生成一份带有图片的报告 但我无法将图片放入单个单元格中 我可以让图片 浮动 在我的工作表周围 但我需要将它们放入单元格中 我怎样才能做
  • getLocationOnScreen() 与 getLocationInWindow()

    在这两种方法的上下文中 屏幕和视图有什么区别 我有一个按钮 我想获取其中心的 x 坐标 我想这就足够了 public int getButtonXPosition return button getLeft button getRight