我有以下代码:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
logArea = (TextView) findViewById(R.id.logArea);
//Tocco
logArea.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if(erase) {
logArea.setText("");
counter = 0;
}
logArea.append("DOWN: (" + x + ", " + y + ") ");
counter++;
break;
case MotionEvent.ACTION_MOVE:
logArea.append("MOVE: (" + x + ", " + y + ") ");
counter++;
break;
case MotionEvent.ACTION_UP:
counter++;
logArea.append("UP: (" + x + ", " + y + ") Contatore: " + counter);
erase = true;
break;
}
return true;
}
});
}
现在我运行我的应用程序并将手指放在手机屏幕上。感知的事件是MotionEvent.ACTION_DOWN以及一系列事件MotionEvent.ACTION_MOVE。返回多对点,而不仅仅是我预期的坐标对。 如果我在模拟器上运行应用程序只返回一个点和事件MotionEvent.ACTION_DOWN,正如我所期望的那样。为什么? 我只需要一个点(如果可能的话,一个在手指的中间或接近),因为我必须阅读他的确切颜色来做某事。 在模拟器上运行,而不是在设备上运行。 我该怎么做才能解决问题? 提前谢谢。
答案 0 :(得分:1)
我所做的限制触摸事件的精确度的方法是存储最后一次触摸,从最后一次到当前的增量,然后测试它是否超过我的精度级别。我从SDK示例中得到了这个想法(我相信我甚至不需要更改代码),所以至少在平台的旧版本中(预先多点触控)这是一个很好的推荐做法。
如果您的问题因多点触控而发生,您可能需要使用MotionEvent.getPointerXYZ()方法进行一些跟踪(仅考虑与您在第一个ACTION_DOWN事件中开始跟踪的原始指针ID关联的ACTION_MOVE事件)
private float mX, mY;
private static float TOUCH_TOLERANCE = 5;
private void touch_start(float x, float y) {
mX = x;
mY = y;
}
private void touch_move(float x, float y) {
float dx = Math.abs(x - mX);
float dy = Math.abs(y - mY);
if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
// do my stuff here...
mX = x;
mY = y;
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
touch_start(x, y);
break;
case MotionEvent.ACTION_MOVE:
touch_move(x, y);
break;
case MotionEvent.ACTION_UP:
touch_up();
break;
}
return true;
}
http://developer.android.com/reference/android/view/MotionEvent.html#getPointerCount%28%29
http://developer.android.com/reference/android/view/MotionEvent.html#getPointerId%28int%29