Çoklu dokunma hareketlerini işleme

"Oluştur" yöntemini deneyin
Jetpack Compose, Android için önerilen kullanıcı arayüzü araç setidir. Oluşturma'da dokunma ve giriş özelliklerini nasıl kullanacağınızı öğrenin.

Ç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 zaman 0 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çin getActionIndex() 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 "";
}
Şekil 1. Çoklu dokunmatik çizim dikkat edin.

Ek kaynaklar

Giriş etkinlikleriyle ilgili daha fazla bilgi için aşağıdakilere bakın referanslar: