Я хочу реализовать на Android скользящий жест MultiTouch, который работает только тогда, когда на экране ровно два пальца. Если пользователь перемещает свои пальцы вправо, значение увеличивается, а если он перемещает их влево, оно уменьшается. Код, который я использовал, выглядит следующим образом:
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
int action = event.getAction() & MotionEvent.ACTION_MASK;
switch(action) {
// Pulsamos
case MotionEvent.ACTION_DOWN: {
break;
}
// Movemos
case MotionEvent.ACTION_MOVE: {
if (gestureStarted){
// Calculate new pointers positions
pointer0NewPos = new PointF(event.getX(event.findPointerIndex(pointer0Id)),
event.getY(event.findPointerIndex(pointer0Id)));
pointer1NewPos = new PointF(event.getX(event.findPointerIndex(pointer1Id)),
event.getY(event.findPointerIndex(pointer1Id)));
// Calculate difference in position
float pointer0_diff_x = pointer0NewPos.x - pointer0Pos.x; // Last x position of pointer 0
float pointer1_diff_x = pointer1NewPos.x - pointer1Pos.x; // Last y position of pointer 1
float desp_x;
// Desp_x is the average of the two pointers movements
desp_x = (pointer0_diff_x + pointer1_diff_x) / 2.0f;
int year_inc;
if (Math.abs(desp_x) > thresholdDespX) // Check if the movement is large enough
year_inc = (int)(desp_x*yearChangeFactor);
else
year_inc = 0;
indexYear += year_inc; // Increment/decrement var
if (indexYear > maxYear)
indexYear = maxYear;
else if (indexYear < minYear)
indexYear = minYear;
// Save new pointers positions
pointer0Pos = pointer0NewPos;
pointer1Pos = pointer0NewPos;
}
break;
}
case MotionEvent.ACTION_UP: {
break;
}
case MotionEvent.ACTION_POINTER_DOWN: {
if (event.getPointerCount() == 2 && !gestureStarted) {
// Save pointers positions
pointer0Id = event.getPointerId(0);
pointer0Pos = new PointF(event.getX(0), event.getY(0));
pointer1Id = event.getPointerId(1);
pointer1Pos = new PointF(event.getX(1), event.getY(1));
// Start gesture logic
gestureStarted = true;
}
else if (gestureStarted) { // Cancel gesture if a third pointer is down
gestureStarted = false;
}
break;
}
case MotionEvent.ACTION_POINTER_UP: {
// Reset gesture
if (gestureStarted) {
gestureStarted = false;
}
break;
}
case MotionEvent.ACTION_CANCEL:{
gestureStarted = false;
break;
}
}
return true;
}
Вот как это работает : он сохраняет каждую позицию указателя каждый раз, когда создается ACTION_MOVE, вычисляет разницу в положении между новымуказатели и старые и использовали эту разницу для изменения переменной.
Работает, хотя глючит . Иногда, если я перемещаю пальцы вправо, переменная не увеличивается, а уменьшается, и если пальцы остаются в том же положении на экране, иногда переменная все еще перемещается.
Возможно, проблема связана с вычислением скорости только из двух позиций вместо использования большей партии позиций, но я не уверен. Как вы думаете, я могу решить эту проблему?