Android中的getX/getY混合使用了相对坐标和绝对坐标。

4
有很多关于 MotionEvent.getX/.getY 不可靠的讨论(或其他术语),我们应该使用这些调用的 Raw 版本来获取坐标。
在我的 Nexus 7 上,我发现 .getX/.getY 可靠地返回交替的绝对和相对坐标。换句话说,假设给定的 ACTION_MOVE 事件在调用 .getX 和 .getY 时返回绝对坐标。下一个 ACTION_MOVE 事件将在其 .getX 和 .getY 调用中返回相对坐标。
这不可能是意外行为。这也使我相信必须有一种方法可以确定给定的 ACTION_MOVE 是否将在其 .getX 和 .getY 调用中返回绝对或相对坐标。
有人知道如何检查给定的 MotionEvent 对象以查看它是否在其 .getX 和 .getY 调用中返回绝对与相对坐标吗?
编辑:根据您的要求,以下是代码。它并没有什么特别之处,只需获取坐标并移动 View 对象:
public boolean  onTouch(View v,MotionEvent event) {

    boolean bExitValue = true;
    float   fX;
    float   fY;
    int     iAction;

    iAction = event.getActionMasked();

    if (MotionEvent.ACTION_MOVE == iAction) {
        fX = event.getX();
        fY = event.getY();
        v.setX(fX);
        v.setY(fY);
        Log.d("",("X: " + fX + ", Y: " + fY));
    }

    else if (MotionEvent.ACTION_DOWN != iAction) {
        bExitValue = false;
    }

    return(bExitValue);

}

Log.d调用和独立浮点数并不是使代码工作所必需的,但它们可以让你在LogCat窗口中看到值的交错。


代码已添加在上方,谢谢。如果您运行此代码并缓慢移动手指,您可以一次获取一个坐标对 - 它们将在“X:59.509125,Y:75.56683”和“X:356.14337,Y:489.77722”等值之间交替。这些坐标对非常不同,但奇数和偶数集将彼此保持一致。这就像同时放下两个手指一样(尽管这不是MotionEvent报告多点触控的方式)。 - AndroidNewbie
如果在输出中添加getHistoricalX/Y,会发生什么?也许只有在存在历史数据时才返回相对坐标? - j.holetzeck
好的建议。我修改了Log.d输出以显示event.getHistorySize()。结果是除非我真的在屏幕上狂按手指,否则它始终为1,即使值为1时我仍然会得到交错的坐标对。 - AndroidNewbie
1
有趣的是:我注释掉了对v.setX和v.setY的调用(这样View就不会移动),交错的坐标停止了。现在我只得到相对坐标!重新定位View和MotionEvents之间似乎存在联系。仍在深入挖掘中... - AndroidNewbie
1
我以前也遇到过这个问题。问题在于您正在重新定位视图,然后获取新的相对坐标,这会导致跳动的值。据我所知,getX()getY()始终返回相对坐标。请在此处查看我解决此问题的方法:https://dev59.com/YnTYa4cB1Zd3GeqPsDYB#17549458 - Ben Kane
显示剩余2条评论
1个回答

0

我发现在Galaxy S4上,getY和getRawY都是错误的。但它们以正交的方式变化。因此,您可以通过以下代码获取正确的值:

rawY = event.getRawY() - spaceOverLayout;
normalY = event.getY();
y = 0F;

float prozentPosition = ((rawY + normalY) / 2) / height;
y = (normalY * (1 - prozentPosition)) + (rawY * prozentPosition);

希望这能有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接