Итак, все, что я пытаюсь сделать, - это нарисовать круги вокруг двух точек, к которым прикасаются, и, когда пальцы тянутся вдоль экрана, эти круги следуют за каждым пальцем.
Однако у меня странное поведение, которое я не могу понять. Поэтому, когда я помещаю два пальца в экран, я получаю свои круги без проблем. Когда я тащу двумя пальцами все работает, как я хочу. Однако если я подниму первый палец, все перестанет перерисовываться, а второй палец, который все еще находится на экране, перестанет отслеживаться. Если я снова положу первый палец, все снова будет хорошо. Я полагаю, что плохо обращаюсь с двумя пальцами.
Кто-нибудь может увидеть, что я делаю не так?
Кроме того, если у меня два пальца на экране, и я поднимаю и касаюсь второго пальца, все ведет себя хорошо. Только в случае, когда у меня два пальца, и я поднимаю первый, я вижу проблему.
@Override
public boolean onTouchEvent(MotionEvent event) {
/*
* Log this touch event
*/
String names[] = { "DOWN" , "UP" , "MOVE" , "CANCEL" , "OUTSIDE" ,
"POINTER_DOWN" , "POINTER_UP" , "7?" , "8?" , "9?" };
StringBuilder sb = new StringBuilder();
int action = event.getAction();
int actionCode = action & MotionEvent.ACTION_MASK;
sb.append("OnTouchEvent ACTION_" ).append(names[actionCode]);
if (actionCode == MotionEvent.ACTION_POINTER_DOWN
|| actionCode == MotionEvent.ACTION_POINTER_UP) {
sb.append("(pid " ).append(
action >> MotionEvent.ACTION_POINTER_ID_SHIFT);
sb.append(")" );
}
sb.append("[" );
for (int i = 0; i < event.getPointerCount(); i++) {
sb.append("#" ).append(i);
sb.append("(pid " ).append(event.getPointerId(i));
sb.append(")=" ).append((int) event.getX(i));
sb.append("," ).append((int) event.getY(i));
if (i + 1 < event.getPointerCount())
sb.append(";" );
}
sb.append("]" );
Log.d(TAG, sb.toString());
/*
* Track the touches that are on the screen
* Grab X,Y, and Size data
*/
int action = event.getAction();
int actionCode = action & MotionEvent.ACTION_MASK;
if (actionCode == MotionEvent.ACTION_POINTER_DOWN) {
if (0 == action >> MotionEvent.ACTION_POINTER_ID_SHIFT){
p0Down = true;
}
if (1 == action >> MotionEvent.ACTION_POINTER_ID_SHIFT){
p1Down = true;
}
}
else if (actionCode == MotionEvent.ACTION_POINTER_UP){
if (0 == action >> MotionEvent.ACTION_POINTER_ID_SHIFT){
p0Down = false;
}
if (1 == action >> MotionEvent.ACTION_POINTER_ID_SHIFT){
p1Down = false;
}
}
if(actionCode == MotionEvent.ACTION_DOWN){
if (0 == action >> MotionEvent.ACTION_POINTER_ID_SHIFT){
p0Down = true;
}
if (1 == action >> MotionEvent.ACTION_POINTER_ID_SHIFT){
p1Down = true;
}
}
else if (actionCode == MotionEvent.ACTION_UP){
if (0 == action >> MotionEvent.ACTION_POINTER_ID_SHIFT){
p0Down = false;
}
if (1 == action >> MotionEvent.ACTION_POINTER_ID_SHIFT){
p1Down = false;
}
}
int pointCt = event.getPointerCount();
for(int i = 0; i < pointCt; i++){
int pid = event.getPointerId(i);
if((pid == 0) && p0Down){
curX1 = event.getX(pid);
curY1 = event.getY(pid);
size1 = event.getSize(pid);
}
if((pid == 0) && (p0Down == false)){
curX1 = -1;
curY1 = -1;
size1 = -1;
}
if((pid == 1) && p1Down){
curX2 = event.getX(pid);
curY2 = event.getY(pid);
size2 = event.getSize(pid);
}
if((pid == 1) && (p1Down == false)){
curX2 = -1;
curY2 = -1;
size2 = -1;
}
}
return true;
}