android - 奇怪的跳跃在 Android MotionEvent 触摸位置

标签 android input touch touch-event motionevent

我在 Android 上使用类似于以下的代码实现了一个简单的可滚动画廊类型 View :

private int mPos; // The current scroll position.
private int mLastMostionPos; // Previous touch position.

@Override
public boolean onTouchEvent(MotionEvent ev)
{
    final int action = ev.getAction();

    Log.d(TAG, "Mouse mLastMotionPos: " + mLastMotionPos + " ev.getX(): " + ev.getX() + " mPos: " + mPos + " ev.getPointerId(0): " + ev.getPointerId(0)
            + " ev.getEventTime(): " + ev.getEventTime());

    switch (action & MotionEvent.ACTION_MASK)
    {
    case MotionEvent.ACTION_DOWN:
        // Remember where the motion event started
        mLastMotionPos = (int)ev.getX();
        break;
    case MotionEvent.ACTION_MOVE:
        final int pos = (int)ev.getX(activePointerIndex);
        // Scroll to follow the motion event
        int delta = mLastMotionPos - pos;
        mLastMotionPos = pos;

        mPos += delta;
        if (mPos < mMinPos)
            mPos = mMinPos;
        if (mPos > mMaxPos)
            mPos = mMaxPos;
        break;

它确实有效,但我注意到有时它会突然“跳跃”一点。当您滚动到一端时,它真的很明显。如果您已经一直向右滚动,并且您总是向右移动手指,偶尔它会向左跳一帧。

我在上面添加了日志记录行并获得了这个输出(为了便于阅读而编辑):

50.913: Mouse mLastMotionPos: 304 ev.getX(): 379.0 mPos: 0 ev.getPointerId(0): 0 ev.getEventTime(): 111690077
50.928: Mouse mLastMotionPos: 379 ev.getX(): 369.0 mPos: 0 ev.getPointerId(0): 0 ev.getEventTime(): 111690093
50.943: Mouse mLastMotionPos: 369 ev.getX(): 384.0 mPos: 10 ev.getPointerId(0): 0 ev.getEventTime(): 111690109
50.958: Mouse mLastMotionPos: 384 ev.getX(): 391.0 mPos: 0 ev.getPointerId(0): 0 ev.getEventTime(): 111690125
50.983: Mouse mLastMotionPos: 391 ev.getX(): 399.0 mPos: 0 ev.getPointerId(0): 0 ev.getEventTime(): 111690141
51.023: Mouse mLastMotionPos: 399 ev.getX(): 399.0 mPos: 0 ev.getPointerId(0): 0 ev.getEventTime(): 111690186

请注意,它跳跃了 10 个像素!我发誓我只是把我的手指向右拖,而且是经过深思熟虑的。起初我以为 Android 可能会乱序传递事件或其他什么,但事件时间是单调的。

知道为什么会这样吗?我想这可能是三星的错(我有 Galaxy S2)。它确实a retarded driver-imposed touch threshold因此,无论是谁编写输入驱动程序,显然都不知道他们在做什么。不过,10 像素似乎是一个很大的飞跃。有时甚至更大!

最佳答案

稍后,但也许它会对其他人有用,如果您只对延迟感兴趣而不对实际的 MotionEvent 位置感兴趣,则可以使用 getRawX() 和 getRawY() 方法。我遇到了完全相同的问题,我改变了获取坐标的方式,瞧!!!它正在工作。

关于android - 奇怪的跳跃在 Android MotionEvent 触摸位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12912600/

相关文章:

python - mac 上修改/创建/访问时间不一致

android - Imageview缩放保持高度固定和宽度可变

Android Double Back Press关闭有 fragment 的应用

java - 改造响应正文为空但状态代码为 200

php - 从sqlite检索数据并尝试使用android中的服务中的json将其插入MySQL

javascript - jQuery 中的表单输入类型时间清除事件

javascript - HTML 和 Javascript 方程式输入表单 [更新]

android - 需要触摸教程

linux - 通过 linux 脚本将输出写入文件?

mobile - 启用点击 : angular 1. 2、ngMobile 和 ng-click?