onTouchListener ACTION_MOVE 不能使用超过 1 个手指
onTouchListener ACTION_MOVE not working with more than 1 finger
我正在构建一个 OpenGL ES 应用程序,我使用 onTouchListener 来检测触摸事件,正如 android 开发网站 (https://developer.android.com/training/gestures/multi#java) 所建议的那样。然后我调用其他函数来处理触摸事件。但问题是,我的其他函数告诉我第二个指针(或更多指针)永远不会调用 ACTION_MOVE。我没有在任何地方看到这个问题被提及,甚至在 Whosebug 上也没有,所以如果你知道是什么导致了这个问题,请告诉我。
代码如下:
public class GluSurfaceView extends GLSurfaceView {
final com.glu.engine.Renderer renderer;
@SuppressLint("ClickableViewAccessibility")
public GluSurfaceView(Context context, AppCompatActivity main) {
super(context);
setEGLContextClientVersion(3);
renderer = new com.glu.engine.Renderer(main);
setRenderer(renderer);
setOnTouchListener((view, motionEvent) -> {
int ID = MotionEventCompat.getActionIndex(motionEvent);
if(motionEvent.getActionMasked() == MotionEvent.ACTION_MOVE){
//recorAction records a new Pointer's position
renderer.recordAction(ID, motionEvent.getX(ID),motionEvent.getY(ID));
Log.w("OnTouchListener","we recorded a change! "+ID+" has moved.");
return true;
}
if(motionEvent.getActionMasked() == MotionEvent.ACTION_UP){
//stopAction let's the program know that an action has stopped
renderer.stopAction(0);
Log.w("onTouchListener","first Action stopped");
return true;
}
if(motionEvent.getActionMasked() == MotionEvent.ACTION_DOWN){
//startAction let's the program know to start a knew array to store Pointers positions
renderer.startAction(0);
renderer.recordAction(0,motionEvent.getX(0),motionEvent.getY(0));
Log.w("onTouchListener","first Action!");
return true;
}
if(motionEvent.getActionMasked() == MotionEvent.ACTION_POINTER_DOWN){
renderer.addPointer(ID);
renderer.recordAction(ID,motionEvent.getX(ID),motionEvent.getY(ID));
Log.w("onTouchListener","new Action! "+ID);
return true;
}
if(motionEvent.getActionMasked() == MotionEvent.ACTION_POINTER_UP) {
renderer.removePointer(ID);
Log.w("onTouchListener","action "+ID+" has stopped.");
return true;
}
return false;
});
}
}
这是日志:
E/actionManager: addedAction 0. actionNumber: 1 isTouching: true // this one is called in renderer
W/onTouchListener: first Action!
W/OnTouchListener: we recorded a change! 0 has moved.
E/actionManager: addedAction 1. actionNumber: 2 isTouching: true
W/onTouchListener: new Action! 1
W/OnTouchListener: we recorded a change! 0 has moved.
W/OnTouchListener: we recorded a change! 0 has moved.
W/OnTouchListener: we recorded a change! 0 has moved.
[same thing for a while...]
W/OnTouchListener: we recorded a change! 0 has moved.
W/OnTouchListener: we recorded a change! 0 has moved.
W/OnTouchListener: we recorded a change! 0 has moved.
E/actionManager: stopped action 1. actionNumber: 1 isTouching: false
W/onTouchListener: action 1 has stopped.
W/OnTouchListener: we recorded a change! 0 has moved.
W/OnTouchListener: we recorded a change! 0 has moved.
E/actionManager: stopped action 0. actionNumber: 0 isTouching: false
W/onTouchListener: first Action stopped
您可以看到 ACTION_MOVE 从未被操作 1 调用。为什么会这样?我可以修复它吗?
原来有人提到了 here。感谢@EleventhPrime。另外,经过一番思考,我不需要在系统需要时一次只更新一个指针,我可以一次更新它们!
for(int i = 0; i < motionEvent.getPointerCount(); i++) {
int Index = motionEvent.findPointerIndex(motionEvent.getPointerId(i));
renderer.recordAction(motionEvent.getPointerId(i), motionEvent.getX(Index), motionEvent.getY(Index));
Log.w("OnTouchListener", "we recorded a change! " + i + " has moved.");
}
我正在构建一个 OpenGL ES 应用程序,我使用 onTouchListener 来检测触摸事件,正如 android 开发网站 (https://developer.android.com/training/gestures/multi#java) 所建议的那样。然后我调用其他函数来处理触摸事件。但问题是,我的其他函数告诉我第二个指针(或更多指针)永远不会调用 ACTION_MOVE。我没有在任何地方看到这个问题被提及,甚至在 Whosebug 上也没有,所以如果你知道是什么导致了这个问题,请告诉我。
代码如下:
public class GluSurfaceView extends GLSurfaceView {
final com.glu.engine.Renderer renderer;
@SuppressLint("ClickableViewAccessibility")
public GluSurfaceView(Context context, AppCompatActivity main) {
super(context);
setEGLContextClientVersion(3);
renderer = new com.glu.engine.Renderer(main);
setRenderer(renderer);
setOnTouchListener((view, motionEvent) -> {
int ID = MotionEventCompat.getActionIndex(motionEvent);
if(motionEvent.getActionMasked() == MotionEvent.ACTION_MOVE){
//recorAction records a new Pointer's position
renderer.recordAction(ID, motionEvent.getX(ID),motionEvent.getY(ID));
Log.w("OnTouchListener","we recorded a change! "+ID+" has moved.");
return true;
}
if(motionEvent.getActionMasked() == MotionEvent.ACTION_UP){
//stopAction let's the program know that an action has stopped
renderer.stopAction(0);
Log.w("onTouchListener","first Action stopped");
return true;
}
if(motionEvent.getActionMasked() == MotionEvent.ACTION_DOWN){
//startAction let's the program know to start a knew array to store Pointers positions
renderer.startAction(0);
renderer.recordAction(0,motionEvent.getX(0),motionEvent.getY(0));
Log.w("onTouchListener","first Action!");
return true;
}
if(motionEvent.getActionMasked() == MotionEvent.ACTION_POINTER_DOWN){
renderer.addPointer(ID);
renderer.recordAction(ID,motionEvent.getX(ID),motionEvent.getY(ID));
Log.w("onTouchListener","new Action! "+ID);
return true;
}
if(motionEvent.getActionMasked() == MotionEvent.ACTION_POINTER_UP) {
renderer.removePointer(ID);
Log.w("onTouchListener","action "+ID+" has stopped.");
return true;
}
return false;
});
}
}
这是日志:
E/actionManager: addedAction 0. actionNumber: 1 isTouching: true // this one is called in renderer
W/onTouchListener: first Action!
W/OnTouchListener: we recorded a change! 0 has moved.
E/actionManager: addedAction 1. actionNumber: 2 isTouching: true
W/onTouchListener: new Action! 1
W/OnTouchListener: we recorded a change! 0 has moved.
W/OnTouchListener: we recorded a change! 0 has moved.
W/OnTouchListener: we recorded a change! 0 has moved.
[same thing for a while...]
W/OnTouchListener: we recorded a change! 0 has moved.
W/OnTouchListener: we recorded a change! 0 has moved.
W/OnTouchListener: we recorded a change! 0 has moved.
E/actionManager: stopped action 1. actionNumber: 1 isTouching: false
W/onTouchListener: action 1 has stopped.
W/OnTouchListener: we recorded a change! 0 has moved.
W/OnTouchListener: we recorded a change! 0 has moved.
E/actionManager: stopped action 0. actionNumber: 0 isTouching: false
W/onTouchListener: first Action stopped
您可以看到 ACTION_MOVE 从未被操作 1 调用。为什么会这样?我可以修复它吗?
原来有人提到了 here。感谢@EleventhPrime。另外,经过一番思考,我不需要在系统需要时一次只更新一个指针,我可以一次更新它们!
for(int i = 0; i < motionEvent.getPointerCount(); i++) {
int Index = motionEvent.findPointerIndex(motionEvent.getPointerId(i));
renderer.recordAction(motionEvent.getPointerId(i), motionEvent.getX(Index), motionEvent.getY(Index));
Log.w("OnTouchListener", "we recorded a change! " + i + " has moved.");
}