Android'de Touch pozisyonu nasıl alınır?


92

Android'de dokunmatik başlama konumunu (X, Y), dokunma hareket konumunu ve ekranın bitiş konumuna dokunmam gerekiyor.

Yanıtlar:


171
@Override
public boolean onTouchEvent(MotionEvent event)
{
    int x = (int)event.getX();
    int y = (int)event.getY();

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_MOVE:
        case MotionEvent.ACTION_UP:
    }

    return false;
}

Üç durum, bu örnekte parmağınızı tekrar dokunarak veya sürükleyerek veya kaldırarak farklı olay türlerine tepki verebilmeniz içindir.


7
Neden yanlış döndürüyorsun?
Daniel Reyhanian

1
True dönüş değeri, dokunma olayının işlendiği anlamına gelir ve bu, olayın yayılmasını önleyecektir ve bunun tersi de geçerlidir.
kaosifier

28

Tamamlayıcı cevap

Verilen bir OnTouchListener

private View.OnTouchListener handleTouch = new View.OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        int x = (int) event.getX();
        int y = (int) event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                Log.i("TAG", "touched down");
                break;
            case MotionEvent.ACTION_MOVE:
                Log.i("TAG", "moving: (" + x + ", " + y + ")");
                break;
            case MotionEvent.ACTION_UP:
                Log.i("TAG", "touched up");
                break;
        }

        return true;
    }
};

bazı görünümlere göre ayarlayın:

myView.setOnTouchListener(handleTouch);

Bu size dokunmatik dinleyicinin kendisine atandığı görünüme göre dokunma olayı koordinatlarını verir. Görünümün sol üst köşesi (0, 0). Parmağınızı görünümün üzerinde hareket ettirirseniz, ynegatif olacaktır. Parmağınızı görünümün soluna hareket ettirirseniz, xnegatif olacaktır.

int x = (int)event.getX();
int y = (int)event.getY();

Koordinatların cihaz ekranının sol üst köşesine göre olmasını istiyorsanız, ham değerleri kullanın.

int x = (int)event.getRawX();
int y = (int)event.getRawY();

İlişkili


Bu çalışır, ancak benim testimde, dinleyicinin eklendiği görünüm diğer görünümler tarafından kapsanmamalıdır. Ekranda dokunulan konumun mutlak koordinatlarını elde etmek için temel görünüm olarak bir çerçeve düzeni ekledim ve bunun üzerine dinleyicinin bulunduğu görünümü ekledim. Unutmayın, return falseaksi takdirde dokunuşu tüketecektir.
lenooh

@lenooh getRawX()ve getRawY()dinleyicinin eklendiği herhangi bir görünümde dokunma konumunun mutlak koordinatlarını döndürmelidir. Ancak haklısınız, tepesinde geri dönen başka bir görünüm varsa true, dokunma olaylarından daha düşük görünümler bildirilmeyecektir.
Suragch

Suragch: aynen. Bir FrameLayout kullandığım için, görünümü "matchParent" olarak ayarlıyorum getX()ve getY()gayet iyi çalışıyorum (gerek yok getRawX/Y()).
lenooh

@Suragch Başka bir görünümle kaplı olsa veya düğmeleri sevse bile dokunmayı kaydetmek için bir yol var mı?
vignesh kumar

@vigneshkumar, görünümler aşağıdan yukarıya dokunma olayları hakkında bilgilendirilir (cevabımın altındaki bağlantıya bakın), böylece olayı kaydedebilir onInterceptTouchEventve ardından falseolayın normal olarak işlenmesi için geri dönebilirsiniz .
Suragch

10
@Override
    public boolean onTouch(View v, MotionEvent event) {
       float x = event.getX();
       float y = event.getY();
       return true;
    }

0

İşte Koltin stili, bunu projemde kullanıyorum ve çok iyi çalışıyor:

this.yourview.setOnTouchListener(View.OnTouchListener { _, event ->
        val x = event.x
        val y = event.y

        when(event.action) {
            MotionEvent.ACTION_DOWN -> {
                Log.d(TAG, "ACTION_DOWN \nx: $x\ny: $y")
            }
            MotionEvent.ACTION_MOVE -> {
                Log.d(TAG, "ACTION_MOVE \nx: $x\ny: $y")
            }
            MotionEvent.ACTION_UP -> {
                Log.d(TAG, "ACTION_UP \nx: $x\ny: $y")
            }
        }
        return@OnTouchListener  true
    })
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.