2010-11-19 57 views
8

因此,我正在開發一個必須處理多點觸控的應用程序。基本上我想單點觸摸旋轉(這是沒有問題的)。多點觸控滾動。如何編寫多點觸控

我有基本的代碼,但是我遇到了從單一切換到多點觸控和副切換的問題。基本上,運動會發生顛簸,因爲多點觸摸的中間位置(兩個手指)和單指的絕對位置處於一定距離。所以如果我在屏幕上有兩個手指,它們組成一箇中間位置,然後擡起一個手指,就像從中間位置到絕對單指位置的快速移動。這將是我不想要的運動。

這是我的代碼:

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    float xEvent[] = new float[ 2 ]; 
    float yEvent[] = new float[ 2 ]; 
    switch(event.getPointerCount()) { 
     case 1: 
      xEvent[ 0 ] = event.getX(0); 
      yEvent[ 0 ] = event.getY(0); 
      switch(event.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        camera.onTouchDown(xEvent[ 0 ], yEvent[ 0 ]); 
        return true; 
       case MotionEvent.ACTION_MOVE: 
        camera.onTouchRotate(xEvent[ 0 ], yEvent[ 0 ]); 
        return true; 
       default: return super.onTouchEvent(event); 
      } 
     case 2: 
      xEvent[ 0 ] = event.getX(0); 
      yEvent[ 0 ] = event.getY(0); 
      xEvent[ 1 ] = event.getX(1); 
      yEvent[ 1 ] = event.getY(1); 
      switch(event.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        camera.onTouchDown(((xEvent[ 0 ] + xEvent[ 1 ])/2), ((yEvent[ 0 ] + yEvent[ 1 ])/2)); 
        return true; 
       case MotionEvent.ACTION_MOVE: 
        camera.onTouchSlide(((xEvent[ 0 ] + xEvent[ 1 ])/2), ((yEvent[ 0 ] + yEvent[ 1 ])/2)); 
        return true; 
       case MotionEvent.ACTION_POINTER_1_UP: 
        camera.onTouchDown(xEvent[ 1 ], yEvent[ 1 ]); 
        return true; 
       case MotionEvent.ACTION_POINTER_2_UP: 
        camera.onTouchDown(xEvent[ 0 ], yEvent[ 0 ]); 
        return true; 
       default: return super.onTouchEvent(event); 
      } 
     default: return false; 
    } 
} 

相機的onTouchDown功能只是設置觸摸移動的第一個值。這就是爲什麼我在向上移動中使用它爲來自多點觸控的單點觸摸移動設置新的開始值的原因。

我希望有人知道我的問題是什麼,並可以進一步幫助我。

回答

10

開始,如果你還沒有讀它,它會在一些事情與多點觸控Android中處理:http://android-developers.blogspot.com/2010/06/making-sense-of-multitouch.html

你貼的代碼有幾件事情:

  1. 你從不會看到指針數爲2的ACTION_DOWNACTION_DOWN僅用於發生故障的第一個指針。第一次觸摸屏幕後的所有手指都會發送ACTION_POINTER_DOWN
  2. 不要假設只有2個手指觸摸,可以很容易地更多。
  3. 使用屏蔽動作(使用MotionEvent#getActionMasked())比單獨爲每個指針索引編碼要容易得多。
  4. 最終,指數僅對拉出MotionEvent數據很重要。如果您正在跟蹤指針移動,請使用指針ID。
  5. 指針ID只是數字。不要假設他們將會具有什麼樣的價值,除非他們是從零開始的整數。
+0

Thanx!我剛剛完成了一個實現80%的實現。但在閱讀完鏈接後,我想我可以使用面具和ID做的更好。 – Espen 2010-11-20 19:56:30

2

你可以用簡單的數學解決這個問題,雖然有可能已經內置了一個更好的辦法。

只需創建包含每個手指的位置的對象的時候,.ACTION_POINTER_X_UP事件觸發,並且包含一個布爾對象您上次使用哪種類型的觸摸模式。

case MotionEvent.ACTION_POINTER_1_UP: 
     camera.onTouchDown(xEvent[ 1 ], yEvent[ 1 ]); 
     boolean usedMultiTouch = true; 
     int x = event.getX(1); 
     int y = event.getY(1); 
     return true; 

下一頁您ACTION_MOVE(內部= 1的情況)的用戶,因爲他們從多去單點觸摸移動手指聲明將閃光。

現在,這取決於你想做什麼,你可以忽略單招(布爾是你的支票),直到.ACTION_UP事件觸發並設置布爾回假

你調用一個方法,它根據保存的位置值和仍然在屏幕上的手指進行一些數學運算。數學應該很容易,但我不知道你真的想做什麼。這裏