我不懂触摸屏事件

时间:2011-09-17 16:16:42

标签: android

我有以下代码:

@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,正如我所期望的那样。为什么? 我只需要一个点(如果可能的话,一个在手指的中间或接近),因为我必须阅读他的确切颜色来做某事。 在模拟器上运行,而不是在设备上运行。 我该怎么做才能解决问题? 提前谢谢。

1 个答案:

答案 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