Çoklu dokunma hareketi, birden fazla işaretçinin (parmak) aynı anda ekrana dokunmasıdır. Bu belgede, birden fazla işaretçinin kullanıldığı hareketlerin nasıl algılanacağı açıklanmaktadır.
Birden fazla işaretçiyi izleme
Birden fazla işaretçi aynı anda ekrana dokunduğunda sistem aşağıdaki dokunma etkinliklerini oluşturur:
ACTION_DOWN: İlk işaretçi ekrana dokunduğunda gönderilir. Bu işlem, hareketi başlatır. Bu işaretçinin işaretçi verileri,MotionEventiçinde her zaman0dizinindedir.ACTION_POINTER_DOWN: İlk işaretçiden sonra ek işaretçiler ekrana girdiğinde gönderilir.getActionIndex()kullanarak, yeni kapatılan işaretçinin dizinini alabilirsiniz.ACTION_MOVE: Herhangi bir sayıda işaretçinin yer aldığı bir hareket değiştiğinde gönderilir.ACTION_POINTER_UP: Birincil olmayan bir işaretçi yukarı çıktığında gönderilir.getActionIndex()kullanarak yeni artan işaretçinin dizinini alabilirsiniz.ACTION_UP: Son işaretçi ekrandan ayrıldığında gönderilir.ACTION_CANCEL: Tüm işaretçiler dahil olmak üzere hareketin tamamının iptal edildiğini gösterir.
Başlangıç ve bitiş hareketleri
Hareket, ACTION_DOWN etkinliğiyle başlayan ve ACTION_UP veya ACTION_CANCEL etkinliğiyle biten bir etkinlik dizisidir. Aynı anda yalnızca bir etkin hareket olabilir. AŞAĞI, TAŞI, YUKARI ve İPTAL işlemleri, hareketin tamamı için geçerlidir. Örneğin, ACTION_MOVE içeren bir etkinlik, o anda tüm işaretçilerin aşağı doğru hareket ettiğini gösterebilir.
İşaretçileri takip etme
Bir MotionEvent içindeki işaretçilerin konumlarını takip etmek için işaretçinin dizinini ve kimliğini kullanın.
- Dizin: Bir dizideki
MotionEventmağaza işaretçisi bilgileri. Bir işaretçinin dizini, bu dizideki konumudur.MotionEventyöntemlerinin çoğu, işaretçi kimliği yerine işaretçi dizinini parametre olarak alır. - Kimlik: Her işaretçinin, dokunma etkinlikleri boyunca kalıcı olan bir kimlik eşlemesi de vardır. Bu eşleme, işaretçinin hareketin tamamında izlenmesine olanak tanır.
Tek tek işaretçiler, hareket etkinliğinde tanımlanmamış bir sırada görünür. Bu nedenle, bir işaretçinin dizini bir etkinlikten diğerine değişebilir ancak işaretçi etkin kaldığı sürece işaretçi kimliğinin sabit kalacağı garanti edilir. Bir işaretçinin kimliğini almak için getPointerId() yöntemini kullanın. Böylece, işaretçiyi bir hareketin sonraki tüm hareket etkinliklerinde izleyebilirsiniz. Ardından, sonraki hareket etkinlikleri için findPointerIndex() yöntemini kullanarak söz konusu hareket etkinliğinde belirli bir işaretçi kimliğinin işaretçi dizinini elde edin.
Örneğin:
Kotlin
private var mActivePointerId: Int = 0 override fun onTouchEvent(event: MotionEvent): Boolean { ... // Get the pointer ID. mActivePointerId = event.getPointerId(0) // ... Many touch events later... // Use the pointer ID to find the index of the active pointer // and fetch its position. val (x: Float, y: Float) = event.findPointerIndex(mActivePointerId).let { pointerIndex -> // Get the pointer's current position. event.getX(pointerIndex) to event.getY(pointerIndex) } ... }
Java
private int mActivePointerId; public boolean onTouchEvent(MotionEvent event) { ... // Get the pointer ID. mActivePointerId = event.getPointerId(0); // ... Many touch events later... // Use the pointer ID to find the index of the active pointer // and fetch its position. int pointerIndex = event.findPointerIndex(mActivePointerId); // Get the pointer's current position. float x = event.getX(pointerIndex); float y = event.getY(pointerIndex); ... }
Birden fazla dokunma işaretçisini desteklemek için tüm etkin işaretçileri kimlikleriyle birlikte kendi ACTION_POINTER_DOWN ve ACTION_DOWN etkinlik zamanlarında önbelleğe alabilirsiniz. İşaretçileri ACTION_POINTER_UP ve ACTION_UP etkinliklerindeki önbelleğinizden kaldırın. Bu önbelleğe alınmış kimlikler, diğer işlem etkinliklerini doğru şekilde ele almanızda faydalı olabilir. Örneğin, bir ACTION_MOVE etkinliğini işlerken her bir önbelleğe alınmış etkin işaretçi kimliğinin dizinini bulun, getX() ve getY() işlevlerini kullanarak işaretçinin koordinatlarını alın, ardından hangi işaretçilerin hareket ettiğini öğrenmek için bu koordinatları önbelleğe alınmış koordinatlarınızla karşılaştırın.
getActionIndex() işlevini yalnızca ACTION_POINTER_UP ve ACTION_POINTER_DOWN etkinlikleriyle kullanın. Bu işlev her zaman 0 değerini döndürdüğünden ACTION_MOVE etkinlikleriyle birlikte kullanmayın.
MotionEvent işlemlerini alma
Bir MotionEvent işlemini almak için getActionMasked() yöntemini veya uyumluluk sürümü MotionEventCompat.getActionMasked() yöntemini kullanın. Önceki getAction() yönteminin aksine, getActionMasked() birden fazla işaretçiyle çalışacak şekilde tasarlanmıştır. İşlemi, işaretçi dizinleri olmadan döndürür. Geçerli bir işaretçi dizinine sahip işlemler için, aşağıdaki snippet'te gösterildiği gibi işlemle ilişkili işaretçilerin dizinini döndürmek üzere getActionIndex() kullanın:
Kotlin
val (xPos: Int, yPos: Int) = MotionEventCompat.getActionMasked(event).let { action -> Log.d(DEBUG_TAG, "The action is ${actionToString(action)}") // Get the index of the pointer associated with the action. MotionEventCompat.getActionIndex(event).let { index -> // The coordinates of the current screen contact, relative to // the responding View or Activity. MotionEventCompat.getX(event, index).toInt() to MotionEventCompat.getY(event, index).toInt() } } if (event.pointerCount > 1) { Log.d(DEBUG_TAG, "Multitouch event") } else { // Single touch event. Log.d(DEBUG_TAG, "Single touch event") } ... // Given an action int, returns a string description. fun actionToString(action: Int): String { return when (action) { MotionEvent.ACTION_DOWN -> "Down" MotionEvent.ACTION_MOVE -> "Move" MotionEvent.ACTION_POINTER_DOWN -> "Pointer Down" MotionEvent.ACTION_UP -> "Up" MotionEvent.ACTION_POINTER_UP -> "Pointer Up" MotionEvent.ACTION_OUTSIDE -> "Outside" MotionEvent.ACTION_CANCEL -> "Cancel" else -> "" } }
Java
int action = MotionEventCompat.getActionMasked(event); // Get the index of the pointer associated with the action. int index = MotionEventCompat.getActionIndex(event); int xPos = -1; int yPos = -1; Log.d(DEBUG_TAG,"The action is " + actionToString(action)); if (event.getPointerCount() > 1) { Log.d(DEBUG_TAG,"Multitouch event"); // The coordinates of the current screen contact, relative to // the responding View or Activity. xPos = (int)MotionEventCompat.getX(event, index); yPos = (int)MotionEventCompat.getY(event, index); } else { // Single touch event. Log.d(DEBUG_TAG,"Single touch event"); xPos = (int)MotionEventCompat.getX(event, index); yPos = (int)MotionEventCompat.getY(event, index); } ... // Given an action int, returns a string description public static String actionToString(int action) { switch (action) { case MotionEvent.ACTION_DOWN: return "Down"; case MotionEvent.ACTION_MOVE: return "Move"; case MotionEvent.ACTION_POINTER_DOWN: return "Pointer Down"; case MotionEvent.ACTION_UP: return "Up"; case MotionEvent.ACTION_POINTER_UP: return "Pointer Up"; case MotionEvent.ACTION_OUTSIDE: return "Outside"; case MotionEvent.ACTION_CANCEL: return "Cancel"; } return ""; }
Ek kaynaklar
Giriş etkinlikleriyle ilgili daha fazla bilgi için aşağıdaki referanslara bakın:
- Giriş etkinliklerine genel bakış
- Sensörlere genel bakış
- Özel görünümü etkileşimli hale getirme
- Sürükleme ve ölçekleme