2013-05-21 49 views
2

关于MotionEvent.getX/.getY如何“不可靠”(或其他术语)以及我们应该如何使用这些调用的Raw版本来获取坐标,有许多讨论。Android getX/getY交错相对/绝对坐标

在我的Nexus 7上,我发现.getX/.getY可靠地返回交织的绝对坐标和相对坐标。换句话说,当你调用.getX和.getY时,给定的ACTION_MOVE事件返回绝对坐标。接下来的ACTION_MOVE事件将返回其.getX和.getY调用的相对坐标。

这不能是意外的行为。这也让我相信,必须有一种方法来辨别给定的ACTION_MOVE是否会返回绝对坐标或相对坐标。

有谁知道如何检查一个给定的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窗口中。

+0

你可以请你的代码检查你的行为吗? – thiagolr

+0

上面添加的代码,谢谢。如果你运行这个程序并且非常缓慢地移动你的手指,你可以一次获得一个坐标对 - 它们将在诸如“X:59.509125,Y:75.56683”和“X:356.14337,Y:489.77722”之类的值之间交替。大不相同的坐标对,但奇数组和偶数组将彼此保持一致。这几乎就像有两个手指放下(尽管这不是一个MotionEvent会报告多点触控的方式)。 – AndroidNewbie

+0

如果将[getHistoricalX/Y](https://developer.android.com/reference/android/view/MotionEvent.html#getHistoricalX%28int,%20int%29)添加到输出中,会发生什么情况?只有当历史数据存在时,才可能返回相对坐标? –

回答

0

我已经发现,在银河系4的getY和getRawY都错了。但他们以正交的方式改变。所以你可以通过下面的代码得到正确的值:

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

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

希望它会有所帮助。