Android View经手势旋转后getLocationOnScreen返回坐标点不正确
问题原因
getLocationOnScreen()仅基于View的原始布局参数(left、top、right、bottom)计算坐标,不会纳入rotation、scaleX/Y、translationX/Y这类动态视图变换的影响。手势旋转修改的是View的视觉变换矩阵,不会改动View的原始布局位置,因此该方法返回的是未旋转前的原始位置,和视觉实际位置存在偏差。
解决方案
方案1:计算指定点的实际屏幕坐标
如果需要获取旋转后View的指定点(比如左上角、中心点)的精准屏幕坐标,可以通过变换矩阵映射实现,示例代码如下:
// 要计算的点:此处为View原始的左上角相对坐标,需要中心点则替换为 view.getWidth()/2f, view.getHeight()/2f float[] targetPoint = new float[]{0f, 0f}; // 应用View自身的变换矩阵 view.getMatrix().mapPoints(targetPoint); // 叠加View原始布局的屏幕坐标偏移 float[] rawLocation = new float[2]; view.getLocationOnScreen(rawLocation); float actualScreenX = rawLocation[0] + targetPoint[0]; float actualScreenY = rawLocation[1] + targetPoint[1];
方案2:直接获取可见区域边界
如果只需要获取旋转后View视觉可见区域的整体屏幕矩形,可以直接使用getGlobalVisibleRect()方法,该方法会自动纳入所有视图变换的影响:
Rect visibleRect = new Rect(); // 调用后visibleRect中存储的就是View视觉可见区域的屏幕坐标矩形 view.getGlobalVisibleRect(visibleRect);
注意:以上两种方案均可自动覆盖父布局存在变换的场景,不需要额外计算父布局的变换影响。
内容的提问来源于stack exchange,提问作者Telal
相关产品推荐
相关产品推荐

