首页 > 解决方案 > 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)
}

标签: androidandroid-popupwindow

解决方案


感谢您更新问题!

我认为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 像素,因此即使您在屏幕中间单击,弹出窗口也会显示在屏幕底部。


推荐阅读