2011-09-17 27 views
0

我有以下代碼:我不明白,觸摸屏事件

@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

你的意思是你每次你得到的事件不同的時間點?也許這是因爲你不能完全握住你的手指並且始終均勻施加壓力? – Staven

+0

也許如此。但是,我怎麼知道我是停下來的,還是我在圖像上稍微移動了一下? – Andrew

回答

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