Все казалось отличным с моей навигационной системой мультитач в Android, пока я не обнаружил, что не всегда, но иногда, когда палец был выпущен, тогда это событие было не признанных в ядре приложения.getPointerCount() не всегда распознает, что указатель был выпущен
Я наложил на экран следы, и я понял, что во время поднятия пальца, в то время как другие пальцы не меняют свое положение (даже не одним пикселем в x или в y топор), тогда getPointerCount () не уменьшает его значение, как должно, но возвращает правильное значение, как только один из других пальцев слегка перемещается.
Bellow - это код, который имитирует этот эффект (завершенный, очень простой одноклассный проект), а APK также доступен для ручной установки (www.liknongames.com/apps/MultiTouch.apk). Пожалуйста, для вашей обратной связи, так как это проблема остановки для меня.
Приложение в apk сообщает в текстовом виде заголовка (textView [0]) активные указатели, текущее действие (замаскированное и не замаскированное) и счетчик вызовов метода onTouchEvent().
package com.example.moultitouch;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Display;
import android.view.MotionEvent;
import android.widget.LinearLayout;
import android.widget.TextView;
public class MainActivity extends Activity
{
TextView[] textView = new TextView[6]; // 0:common metrics 1-5:finger details
int pointersCount = -1;
int action = 0;
int actionMasked = 0;
String actionString = "NOT INIT";
Display display;
int iViewWidth = 0;
int motionsCounter = 0;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_motion_event);
display = getWindowManager().getDefaultDisplay();
iViewWidth = display.getWidth();
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
for (int i = 0; i < 6; i++)
{
textView[i] = new TextView(this);
textView[i].setWidth(iViewWidth);
textView[i].setTextSize(16);
textView[i].setTextColor(Color.WHITE);
textView[i].setBackgroundColor(Color.BLACK);
layout.addView(textView[i]);
}
textView[0].setText("Touch the screen to start");
setContentView(layout);
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
int i = 0;
pointersCount = event.getPointerCount();
action = event.getAction() & MotionEvent.ACTION_MASK;
motionsCounter++;
actionMasked = event.getActionMasked();
if (action == MotionEvent.ACTION_DOWN)
actionString = "DOWN";
else if (action == MotionEvent.ACTION_POINTER_DOWN)
actionString = "POINTER DOWN";
else if (action == MotionEvent.ACTION_POINTER_UP)
actionString = "POINTER UP";
else if (action == MotionEvent.ACTION_MOVE)
actionString = "MOVE";
else if (action == MotionEvent.ACTION_UP)
{
actionString = "ALL UP";
pointersCount = 0;
}
else
actionString = "UNKNOWN(" + action + ")";
textView[0].setText (pointersCount + " POINTERS. ACTION:[" + action +"] " + actionString + ". (MASKED:" + actionMasked +"). " + motionsCounter + " MOTIONS");
for (i = 0; i < pointersCount; i++)
{
int x = (int) event.getX(i);
int y = (int) event.getY(i);
int id = event.getPointerId(i);
textView[i+1].setText("idx: " + i + " id: " + id + ". (" + x + "," + y +")");
}
for (i = pointersCount; i < 5; i++)
textView[i+1].setText("- - - - - ");
return true;
}
}
спасибо