Çoklu dokunma hareketi, ekrana birden fazla işaretçi (parmak) dokunduğunda gerçekleşir anlamına gelir. Bu dokümanda, video içeren hareketlerin nasıl algılanacağı açıklanmaktadır. kullanabilirsiniz.
Birden çok işaretçiyi izleme
Ekrana aynı anda birden fazla işaretçi dokunduğunda sistem, aşağıdaki dokunma etkinlikleri:
ACTION_DOWN
: ekrana dokunduğunda gönderilir. Bu işlem, hareketi başlatır. İlgili içeriği oluşturmak için kullanılan bu işaretçi için işaretçi verileri her zaman0
MotionEvent
.ACTION_POINTER_DOWN
: ilkinden sonra ekrana fazladan işaretçiler girdiğinde gönderilir. Web sitemiz g.co/newsinitiative/labs üzerinden aşağı inen işaretçinin dizinini bulabilirsiniz.getActionIndex()
ACTION_MOVE
: herhangi bir sayıda hareketi içeren bir harekette değişiklik gerçekleştiğinde gönderilir kullanabilirsiniz.ACTION_POINTER_UP
: bir işaretçi çıktığında gönderilir. bir sonucu görmek içingetActionIndex()
işaretini kullanabilirsiniz.ACTION_UP
: son işaretçi ekrandan çıktığında gönderilir.ACTION_CANCEL
: tüm işaretçiler de dahil olmak üzere hareketin tamamının iptal edildiğini gösterir.
Başlangıç ve bitiş hareketleri
Hareket, ACTION_DOWN
ile başlayan bir dizi etkinliktir
ya da ACTION_UP
veya
ACTION_CANCEL
etkinlik. Aynı anda tek bir etkin hareket var. İlgili içeriği oluşturmak için kullanılan
AŞAĞI, TAŞI, YUKARI ve İPTAL işlemleri hareketin tamamına uygulanır. Örneğin,
ACTION_MOVE
içeren etkinlik tüm işaretçiler için bir hareketi gösterebilir
yaşandığını söylüyor.
İşaretçileri takip edin
Bağımsız işaretçileri izlemek için işaretçinin dizinini ve kimliğini kullanın
MotionEvent
konumu.
- Dizin:
MotionEvent
işaretçisi depolanıyor bilgi içerir. Bir işaretçinin dizini, işaretçinin bu dizisidir.MotionEvent
yöntemlerinin çoğu işaretçi dizinini bir parametre kullanın. - Kimlik: Her işaretçinin aynı zamanda Tek bir işaretçinin izlenmesine olanak tanımak için dokunma etkinliklerinde kalıcıdır dokunun.
Bağımsız işaretçiler, bir hareket etkinliğinde tanımlanmamış bir sırada görünür. Böylece,
işaretçinin dizini bir etkinlikten diğerine değişebilir, ancak işaretçi kimliği
bir sürekli işaretçinin mevcut olduğu sürece sabit kalması garanti edilir.
etkin. Şunu kullanın:
getPointerId()
.
İşaretçiyi takip eden tüm sonraki işlemlerde işaretçiyi takip etmek için işaretçinin
hareket etkinlikleri oluşturabilirsiniz. Daha sonra, ardışık hareket etkinlikleri için
findPointerIndex()
.
yöntemini kullanabilirsiniz.
Örnek:
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
kendi ACTION_POINTER_DOWN
mağazalarında ve
ACTION_DOWN
etkinlik zamanı. İşaretçileri önbelleğinizden kaldırın:
ACTION_POINTER_UP
ve ACTION_UP
etkinliklerini kapsar. En son haberleri sunan,
önbellekteki bu kimlikleri, diğer işlem etkinliklerini doğru şekilde işleme konusunda faydalı bulabilirsiniz. Örneğin,
Örneğin, bir ACTION_MOVE
etkinliği işlenirken, şunun dizinini bulun:
her önbelleğe alınmış etkin işaretçi kimliğini almak için
getX()
ve
getY()
fonksiyonlarını kullanmak için, bu koordinatları önbelleğe aldığınız koordinatlarla
hangi işaretçilerin hareket ettiğini görebilirsiniz.
getActionIndex()
işlevini şununla kullanın:
ACTION_POINTER_UP
ve ACTION_POINTER_DOWN
etkinlik
gerekir. Bu işlevi ACTION_MOVE
etkinlikleriyle kullanmayın.
her zaman 0
değerini döndürür.
MotionEvent
işlemi al
Şunu kullanın:
getActionMasked()
.
yöntemini veya uyumluluk sürümünü
MotionEventCompat.getActionMasked()
MotionEvent
işlemini almak için kullanılır. Öncekinden farklı olarak
getAction()
.
yöntemi kullanıldığında, getActionMasked()
birçok farklı alan ile çalışacak şekilde tasarlanmıştır.
kullanabilirsiniz. İşlemi işaretçi dizinleri olmadan döndürür. Şunun için:
geçerli işaretçi dizini, aşağıdaki dizini döndürmek için getActionIndex()
öğesini kullanın:
aşağıdaki snippet'te gösterildiği gibi işlemle ilişkili işaretçiler:
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ğıdakilere bakın referanslar:
- Giriş etkinliklerine genel bakış
- Sensörler genel bakış
- Özel oluştur etkileşimli görüntüleme
- Sürükleme ve ölçeklendirme