android - PopupWindow Y 位置错误
问题描述
我想在用户点击屏幕的位置显示弹出窗口,我使用函数 - showAtLocation (mainView, Gravity.TOP or Gravity.START, posX, posY)
,在 x 坐标中一切都很好,但是弹出窗口的 Y 坐标被添加到高于用户点击的位置,并且如果主视图(mainView)被滚动,那么弹出窗口通常会飞到最底部,我就是不知道 Y 位置有什么问题。posX 和 posY 是用户触摸屏幕的位置
更新
override fun dispatchTouchEvent(event: MotionEvent): Boolean {
posY = event.y.toInt()
return super.dispatchTouchEvent(event)
}
解决方案
感谢您更新问题!
我认为showAtLocation()
使用总坐标,从屏幕的顶部左侧开始。但是(没有看到你的代码的完整上下文)我认为你正在为 x 和 y 坐标取相对坐标。
如果覆盖该函数dispatchTouchEvent()
的视图组具有例如 24dp 顶部边距,则此视图的 (0;0) 坐标位于全局 (0;0) 坐标下方 24dp。因此,当您按下视图组的左上角时,event.y.toInt()
将返回 (0;0),并且您将返回 0 作为 posY。但是您的点击比屏幕上的总 0 坐标低 24dp。所以你会显示弹出窗口 24dp 太高了。
当您在 mainView 中向下滚动时也会发生同样的情况。例如,您的屏幕高 1000 像素,您向下滚动屏幕长度的两倍。event.y.toInt() 现在可以返回 2000px 作为相对 y 坐标。但最高屏幕高度为 1000 像素,因此即使您在屏幕中间单击,弹出窗口也会显示在屏幕底部。
推荐阅读
- powershell - 使用 PowerShell 创建永久 WMI 事件
- delphi - 如何使用 LeakCheck 处理 DUnit 中的“错误”/预期内存?
- html - bootstrap - 将不同宽度的多列居中
- azure-language-understanding - LUIS v2.0 EndPoint - JSON 结果不一致
- angular - Angular 中的延迟 HTTP 请求
- php - 使用数据库查询定义模型访问器
- tensorflow - 多 GPU tf 估计器对象检测
- java - 编写数据集
to excel 给出 ChangeFileModeByMask 错误 (5): Access is denied ERROR
- optaplanner - TravelingTournament MatchChainRotationsMoveFactory
- liferay - build-common-ivy.xml 构建中的 Liferay 问题失败