Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 避免Android中动作事件的合并_Java_Android_Motionevent - Fatal编程技术网

Java 避免Android中动作事件的合并

Java 避免Android中动作事件的合并,java,android,motionevent,Java,Android,Motionevent,我试图从Android中的一系列MotionEvents中准确地读取ACTION\u MOVEdelta 然而,我用手指在屏幕上滑动的测试表明,在最初的动作_DOWN之后,一些动作事件不会传递给侦听器。只有在进行了足够大的移动之后,才会以相对较大的增量交付动作\u移动事件。在第一次ACTION\u MOVE事件之后,所有的增量都非常小 或者,您也可以触摸屏幕(ACTION\u DOWN)并稍微四处移动,而根本不传递任何ACTION\u move事件 我知道对于许多用途,具有一定的移入敏感性是有益

我试图从Android中的一系列
MotionEvent
s中准确地读取
ACTION\u MOVE
delta

然而,我用手指在屏幕上滑动的测试表明,在最初的
动作_DOWN
之后,一些
动作事件
不会传递给侦听器。只有在进行了足够大的移动之后,才会以相对较大的增量交付
动作\u移动
事件。在第一次
ACTION\u MOVE
事件之后,所有的增量都非常小

或者,您也可以触摸屏幕(
ACTION\u DOWN
)并稍微四处移动,而根本不传递任何
ACTION\u move
事件

我知道对于许多用途,具有一定的移入敏感性是有益的。但是,是否有办法避免将
动作
事件合并在一起,从而实现每个小的初始动作?在
动作向下
位置和第一个
动作移动
位置之间的最小距离上是否有可设置的阈值

以下是一些示例代码:

private float lastX;
private float lastY;

public boolean onTouch(View v, MotionEvent ev) {

    final float y = ev.getX();
    final float x = ev.getY();

    final int hs = ev.getHistorySize();

    final int ac = ev.getAction();
    switch(ac)
    {
        case MotionEvent.ACTION_DOWN:
        {
            this.lastX = x;
            this.lastY = y;
            Log.i("TEST", "Down at " + x + "/" + y + " (History size="+hs+")");
            return true;
        }
        case MotionEvent.ACTION_MOVE:
        {
            Log.i("TEST", "Move at " + x + "/" + y + ": Delta="+(lastX-x)+"/"+(lastY-y) + " (History size="+hs+")");
            this.lastX = x;
            this.lastY = y;
            return true;
        }
        case MotionEvent.ACTION_UP:
        {
            Log.i("TEST", "Up at " + x + "/" + y + " (History size="+hs+")");
            return true;
        }
    } 
}
以及相应的输出:

Down at 376.0/259.0 (History size=0)
Move at 392.0/268.0: Delta=-16.0/-9.0 (History size=0)
Move at 394.0/268.0: Delta=-2.0/0.0 (History size=0)
Move at 395.0/269.0: Delta=-1.0/-1.0 (History size=0)
Move at 394.0/268.0: Delta=1.0/1.0 (History size=0)
Move at 396.0/269.0: Delta=-2.0/-1.0 (History size=0)
Move at 399.0/271.0: Delta=-3.0/-2.0 (History size=1)
Move at 401.0/272.0: Delta=-2.0/-1.0 (History size=0)
Move at 403.0/273.0: Delta=-2.0/-1.0 (History size=0)
Move at 404.0/273.0: Delta=-1.0/0.0 (History size=0)
Move at 405.0/274.0: Delta=-1.0/-1.0 (History size=0)
Move at 406.0/275.0: Delta=-1.0/-1.0 (History size=0)
Up at 406.0/275.0 (History size=0)
换句话说,我希望避免第二行(-16/-9)的大增量,但接收的增量顺序为1或2

我对三星Galaxy S2和Note进行了测试


非常感谢您的帮助或建议

我在一些应用程序中使用MotionEvent,necer遇到了这个问题

如果使用SDK版本>4,则MotionEvent支持多点触摸。我正在我的应用程序上测试这一点,并使用修改后的侦听器获取触摸事件。代码如下:

private static PointF touchScreenStartPtArr[] = new PointF[10]; 
private static PointF touchScreenStopPtArr[] = new PointF[10]; 
private static PointF touchScreenCurrPtArr[] = new PointF[10]; 

OnTouchListener onTouchListenerMulti = new OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 

        int action = event.getAction() & MotionEvent.ACTION_MASK; 
        int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; 
        int fingerId = event.getPointerId(pointerIndex); 

        switch (action) { 
        case MotionEvent.ACTION_DOWN: 
        case MotionEvent.ACTION_POINTER_DOWN: 
            touchScreenStartPtArr[fingerId].x = event.getX(pointerIndex); 
            touchScreenStartPtArr[fingerId].y = event.getY(pointerIndex); 
            break; 
        case MotionEvent.ACTION_UP: 
        case MotionEvent.ACTION_POINTER_UP: 
        case MotionEvent.ACTION_CANCEL: 
            touchScreenStopPtArr[fingerId].x = event.getX(pointerIndex); 
            touchScreenStopPtArr[fingerId].y  = event.getX(pointerIndex); 
            break; 
        case MotionEvent.ACTION_MOVE: 
            int pointerCount = event.getPointerCount(); 
            for (int i = 0; i < pointerCount; i++) { 
                touchScreenCurrPtArr[fingerId].x = event.getX(i); 
                touchScreenCurrPtArr[fingerId].y = event.getY(i); 
            } 
            break; 
        } 
        return true; 
    } 
}; 
看起来您可能有另一个侦听器从这个侦听器中窃取事件

我建议你在一个清理项目中检查你的代码(你需要在最后添加一个“returnfalse”),只是为了确认它


祝你好运。

我不想打断你,但这完全是三星的错,只会发生在Galaxy S2上。基本上,他们在输入驱动程序中添加了一个软件触摸阈值,但没有真正的原因

我曾经试图说服他们取消门槛,但他们似乎不理解这个问题,并告诉我这是故意的!尽管如此,他们还是在星系S3中修复了它


幸运的是,这不是一个硬件限制,所以如果你有一个根手机,你可以绕过它,或者安装一个自定义ROM。

这是移动中的死区还是动作结束后的死区,在此期间动作被禁用?也许你想通过实验来找出哪个。你可以通过使用event.getHistoricalX/Y()方法来获得更多的分数。这肯定是运动中的死区。当(1)触摸(
ACTION\u DOWN
)并保持手指稳定,并在几秒钟后开始移动,或(2)在屏幕上滑动而不等待时,可以观察到相同的行为。第一个
ACTION\u MOVE
事件始终具有最大的增量-就好像在
ACTION\u DOWN
之后报告
ACTION\u MOVE
之前需要最小的增量一样。谢谢,路易斯。我理解多点触摸的含义。然而,我在这里考虑一个简单的“单触”场景,我只有一个手指,似乎在第一次触摸之后,在触发第一次移动事件之前,移动距离有一个最小阈值。我试图避免这种行为,即,立即报告任何独立于阈值的移动。@Ms如果您是对的,使用单触键不会产生任何影响。我已经在emulator和华为x5设备中试用了您的代码。它没有显示您正在报告的问题。我正在编辑答案以发布日志。路易斯,这确实很有趣!感谢您进行此测试。您在哪个视图元素上注册了事件侦听器?我使用了一个跨越整个视图端口的普通空视图。也许我必须对这个问题稍加重命名,使其针对三星手机……我使用了一个填满所有屏幕的文本视图。我的设备正在运行姜饼。链接已断开。很抱歉,我将其从我的频道中删除,因为。。。人们还在使用Galaxy S2s吗?!
Down at 387.29388/247.27272 (History size=0)
Move at 387.29388/247.27272: Delta=0.0/0.0 (History size=0)
Move at 387.29388/247.27272: Delta=0.0/0.0 (History size=0)
Move at 387.29388/245.39589: Delta=0.0/1.876831 (History size=0)
Move at 387.29388/244.92668: Delta=0.0/0.46920776 (History size=0)
Move at 387.29388/244.45747: Delta=0.0/0.46920776 (History size=0)
Move at 387.29388/243.98827: Delta=0.0/0.46920776 (History size=0)
Move at 387.29388/243.51906: Delta=0.0/0.46920776 (History size=0)
Move at 389.01614/243.51906: Delta=-1.7222595/0.0 (History size=0)
Move at 389.8773/243.51906: Delta=-0.861145/0.0 (History size=0)
Move at 389.8773/243.04985: Delta=0.0/0.46920776 (History size=0)
Move at 390.73843/243.04985: Delta=-0.861145/0.0 (History size=0)
Move at 390.73843/242.58064: Delta=0.0/0.46920776 (History size=0)
Move at 391.59958/242.58064: Delta=-0.861145/0.0 (History size=0)
Move at 391.59958/242.11143: Delta=0.0/0.46920776 (History size=0)
Move at 392.46072/242.11143: Delta=-0.861145/0.0 (History size=0)
Move at 392.46072/241.64223: Delta=0.0/0.46920776 (History size=0)
Move at 393.32187/241.64223: Delta=-0.861145/0.0 (History size=0)
Move at 394.183/241.64223: Delta=-0.861145/0.0 (History size=0)
Move at 394.183/241.17302: Delta=0.0/0.46920776 (History size=0)
Move at 395.04413/241.17302: Delta=-0.8611145/0.0 (History size=0)
Move at 395.04413/242.11143: Delta=0.0/-0.9384155 (History size=0)
Move at 395.04413/242.58064: Delta=0.0/-0.46920776 (History size=0)
Up at 395.04413/242.58064 (History size=0)