Genel hareketleri algılama

"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.
Hareketler → 'nı inceleyin.

Dokunma hareketi, kullanıcı bir veya daha fazla parmağını ekranın ve uygulamanız bu dokunma kalıbını bir hareket olarak yorumlar. Orada hareket algılamanın iki aşamasından oluşur:

  1. Dokunma etkinliği verileri toplanıyor.
  2. Verileri yorumlayarak, programın ölçütlerini karşılayıp karşılamadığını özellikleri de kullanabilirsiniz.

AndroidX sınıfları

Bu dokümandaki örneklerde GestureDetectorCompat. ve MotionEventCompat sınıflar. Bu sınıflar AndroidX Kitaplık. Uyumluluğu sağlamak için mümkünse AndroidX sınıflarını kullanın: eski cihazlar. MotionEventCompat, MotionEvent sınıfını kullanır. Bunun yerine, verilerinizi iletebileceğiniz statik yardımcı Bununla ilişkili işlemi alacak MotionEvent nesne unutmayın.

Veri toplama

Kullanıcı ekrana bir veya daha fazla parmağını koyduğunda bu, geri arama onTouchEvent(). Dokunmatik etkinlikleri alan görünümde de görünür. Her dokunma sırası için konum, basınç, boyut ve başka bir öğenin eklenmesi gibi olaylar onTouchEvent() parmak (hareket olarak tanımlanır) birkaç kez tetiklenmiştir.

Kullanıcı ekrana ilk dokunduğunda hareket başlar ve sistem, kullanıcının parmağının veya parmaklarının konumunu izler ve kullanıcının son parmağıyla ekrandan ayrılan son anları yakalama. Bu etkileşim boyunca MotionEvent onTouchEvent() her etkileşimin ayrıntılarını sağlar. Uygulamanız kullanıp kullanmadığını belirlemek için MotionEvent tarafından sağlanan verileri bir hareketin gerçekleşmesidir.

Bir Aktivite veya Görünüm için dokunma etkinliklerini yakalayın

Activity veya View, onTouchEvent() geri çağırmasını geçersiz kıl.

Aşağıdaki kod snippet'i, getAction(). kullanıcının event parametresinden gerçekleştirdiği işlemi ayıklamak için kullanılır. Böylece, bir hareketi önemsediğinizi belirlemek için ihtiyacınız olan ham verileri elde edersiniz. bahsedeceğim.

Kotlin

class MainActivity : Activity() {
    ...
    // This example shows an Activity. You can use the same approach if you are 
    // subclassing a View.
    override fun onTouchEvent(event: MotionEvent): Boolean {
        return when (event.action) {
            MotionEvent.ACTION_DOWN -> {
                Log.d(DEBUG_TAG, "Action was DOWN")
                true
            }
            MotionEvent.ACTION_MOVE -> {
                Log.d(DEBUG_TAG, "Action was MOVE")
                true
            }
            MotionEvent.ACTION_UP -> {
                Log.d(DEBUG_TAG, "Action was UP")
                true
            }
            MotionEvent.ACTION_CANCEL -> {
                Log.d(DEBUG_TAG, "Action was CANCEL")
                true
            }
            MotionEvent.ACTION_OUTSIDE -> {
                Log.d(DEBUG_TAG, "Movement occurred outside bounds of current screen element")
                true
            }
            else -> super.onTouchEvent(event)
        }
    }
}

Java

public class MainActivity extends Activity {
...
// This example shows an Activity. You can use the same approach if you are
// subclassing a View.
@Override
public boolean onTouchEvent(MotionEvent event){
    switch(event.getAction()) {
        case (MotionEvent.ACTION_DOWN) :
            Log.d(DEBUG_TAG,"Action was DOWN");
            return true;
        case (MotionEvent.ACTION_MOVE) :
            Log.d(DEBUG_TAG,"Action was MOVE");
            return true;
        case (MotionEvent.ACTION_UP) :
            Log.d(DEBUG_TAG,"Action was UP");
            return true;
        case (MotionEvent.ACTION_CANCEL) :
            Log.d(DEBUG_TAG,"Action was CANCEL");
            return true;
        case (MotionEvent.ACTION_OUTSIDE) :
            Log.d(DEBUG_TAG,"Movement occurred outside bounds of current screen element");
            return true;
        default :
            return super.onTouchEvent(event);
    }
}

Bu kod, kullanıcı ekrana dokunduğunda Logcat'te aşağıdakine benzer mesajlar oluşturur: dokunma ve basılı tutup sürükler:

GESTURES D   Action was DOWN
GESTURES D   Action was UP
GESTURES D   Action was MOVE

Özel hareketler için bu etkinliklerde kendi işleminizi yaparak yapmanız gereken bir hareketi temsil edip etmediğini belirleyin. Ancak, Uygulama iki kez dokunma, dokunma ve hızlıca kaydırma gibi işlemlerle dönüşümleri artırmanız için GestureDetector. sınıfını kullanır. GestureDetector, sık karşılaşılan durumları tespit etmenizi kolaylaştırır hareketlerinizi tek tek dokunma etkinliklerini işlemeyecek şekilde düzenleyebilirsiniz. Bu Hareketleri algılama bölümünde daha ayrıntılı olarak ele alınacaktır.

Dokunma etkinliklerini tek bir görünüm için yakalayın

onTouchEvent() için alternatif olarak, View.OnTouchListener herhangi bir View öğesine nesne nesnesini setOnTouchListener() yöntemidir. Bu, bir alt sınıfa ihtiyaç duymadan dokunma etkinliklerini dinleme mevcut View, aşağıdaki örnekte gösterildiği gibi:

Kotlin

findViewById<View>(R.id.my_view).setOnTouchListener { v, event ->
    // Respond to touch events.
    true
}

Java

View myView = findViewById(R.id.my_view);
myView.setOnTouchListener(new OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        // Respond to touch events.
        return true;
    }
});

Şu dil için false değerini döndüren bir işleyici oluşturun: ACTION_DOWN etkinliği. Bunu yaparsanız dinleyici, bir sonraki ACTION_MOVE ve ACTION_UP dizisi etkinlikler. Çünkü ACTION_DOWN tüm projeleriniz için dokunma etkinlikleridir.

Özel görünüm oluşturuyorsanız onTouchEvent(), daha önce açıklandığı gibi.

Hareketleri algılama

Android, yaygın durumları algılamak için GestureDetector sınıfını sağlar hareketler. Desteklediği hareketlerden bazıları şunlardır: onDown(), onLongPress(), ve onFling(). GestureDetector öğesini onTouchEvent() yöntemini kullanın.

Desteklenen tüm hareketleri algıla

Bir GestureDetectorCompat nesnesini örneklendirdiğinizde parametreleri, GestureDetector.OnGestureListener kullanır. GestureDetector.OnGestureListener, aşağıdaki durumlarda kullanıcıları bilgilendirir: gerçekleşebilir. Hem sizin hem de ekibinizin Etkinlikleri alacak GestureDetector nesnesini tanımlayın, görünümü geçersiz kılın veya etkinliğin onTouchEvent() yöntemini kullanır ve gözlemlenen tüm etkinlikleri iletir. ekler.

Aşağıdaki snippet'te, true her bir on<TouchEvent> yöntemi, dokunma etkinliği işlenir. false işlevinin döndürülen değeri, etkinlikleri atlar görünüm yığınından geçer.

Aşağıdaki snippet'i bir test uygulamasında çalıştırırsanız, uygulamanızın etkileşimde bulunduğunuzda tetiklenen MotionEvent içeriği her dokunma etkinliği için geçerli. Bu işlemin ardından Basit etkileşimler için ne kadar veri üretildiğini ifade eder.

Kotlin

private const val DEBUG_TAG = "Gestures"

class MainActivity :
        Activity(),
        GestureDetector.OnGestureListener,
        GestureDetector.OnDoubleTapListener {

    private lateinit var mDetector: GestureDetectorCompat

    // Called when the activity is first created.
    public override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        // Instantiate the gesture detector with the
        // application context and an implementation of
        // GestureDetector.OnGestureListener.
        mDetector = GestureDetectorCompat(this, this)
        // Set the gesture detector as the double-tap
        // listener.
        mDetector.setOnDoubleTapListener(this)
    }

    override fun onTouchEvent(event: MotionEvent): Boolean {
        return if (mDetector.onTouchEvent(event)) {
            true
        } else {
            super.onTouchEvent(event)
        }
    }

    override fun onDown(event: MotionEvent): Boolean {
        Log.d(DEBUG_TAG, "onDown: $event")
        return true
    }

    override fun onFling(
            event1: MotionEvent,
            event2: MotionEvent,
            velocityX: Float,
            velocityY: Float
    ): Boolean {
        Log.d(DEBUG_TAG, "onFling: $event1 $event2")
        return true
    }

    override fun onLongPress(event: MotionEvent) {
        Log.d(DEBUG_TAG, "onLongPress: $event")
    }

    override fun onScroll(
            event1: MotionEvent,
            event2: MotionEvent,
            distanceX: Float,
            distanceY: Float
    ): Boolean {
        Log.d(DEBUG_TAG, "onScroll: $event1 $event2")
        return true
    }

    override fun onShowPress(event: MotionEvent) {
        Log.d(DEBUG_TAG, "onShowPress: $event")
    }

    override fun onSingleTapUp(event: MotionEvent): Boolean {
        Log.d(DEBUG_TAG, "onSingleTapUp: $event")
        return true
    }

    override fun onDoubleTap(event: MotionEvent): Boolean {
        Log.d(DEBUG_TAG, "onDoubleTap: $event")
        return true
    }

    override fun onDoubleTapEvent(event: MotionEvent): Boolean {
        Log.d(DEBUG_TAG, "onDoubleTapEvent: $event")
        return true
    }

    override fun onSingleTapConfirmed(event: MotionEvent): Boolean {
        Log.d(DEBUG_TAG, "onSingleTapConfirmed: $event")
        return true
    }

}

Java

public class MainActivity extends Activity implements
        GestureDetector.OnGestureListener,
        GestureDetector.OnDoubleTapListener{

    private static final String DEBUG_TAG = "Gestures";
    private GestureDetectorCompat mDetector;

    // Called when the activity is first created.
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Instantiate the gesture detector with the
        // application context and an implementation of
        // GestureDetector.OnGestureListener.
        mDetector = new GestureDetectorCompat(this,this);
        // Set the gesture detector as the double-tap
        // listener.
        mDetector.setOnDoubleTapListener(this);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event){
        if (this.mDetector.onTouchEvent(event)) {
            return true;
        }
        return super.onTouchEvent(event);
    }

    @Override
    public boolean onDown(MotionEvent event) {
        Log.d(DEBUG_TAG,"onDown: " + event.toString());
        return true;
    }

    @Override
    public boolean onFling(MotionEvent event1, MotionEvent event2,
            float velocityX, float velocityY) {
        Log.d(DEBUG_TAG, "onFling: " + event1.toString() + event2.toString());
        return true;
    }

    @Override
    public void onLongPress(MotionEvent event) {
        Log.d(DEBUG_TAG, "onLongPress: " + event.toString());
    }

    @Override
    public boolean onScroll(MotionEvent event1, MotionEvent event2, float distanceX,
            float distanceY) {
        Log.d(DEBUG_TAG, "onScroll: " + event1.toString() + event2.toString());
        return true;
    }

    @Override
    public void onShowPress(MotionEvent event) {
        Log.d(DEBUG_TAG, "onShowPress: " + event.toString());
    }

    @Override
    public boolean onSingleTapUp(MotionEvent event) {
        Log.d(DEBUG_TAG, "onSingleTapUp: " + event.toString());
        return true;
    }

    @Override
    public boolean onDoubleTap(MotionEvent event) {
        Log.d(DEBUG_TAG, "onDoubleTap: " + event.toString());
        return true;
    }

    @Override
    public boolean onDoubleTapEvent(MotionEvent event) {
        Log.d(DEBUG_TAG, "onDoubleTapEvent: " + event.toString());
        return true;
    }

    @Override
    public boolean onSingleTapConfirmed(MotionEvent event) {
        Log.d(DEBUG_TAG, "onSingleTapConfirmed: " + event.toString());
        return true;
    }
}

Desteklenen hareketlerin bir alt kümesini algıla

Yalnızca birkaç hareketi işlemek istiyorsanız GestureDetector.SimpleOnGestureListener. GestureDetector.OnGestureListener kodunu uygulamak yerine kullanır.

GestureDetector.SimpleOnGestureListener, tüm site bağlantılarında, Döndürülerek on<TouchEvent> yöntem Tümü için false. Bu, yalnızca kontrol ettiğiniz yöntemleri geçersiz kılmanıza yardımcı olur. Örneğin, aşağıdaki kod snippet'i GestureDetector.SimpleOnGestureListener ve geçersiz kılmalar onFling() ve onDown().

GestureDetector.OnGestureListener GestureDetector.SimpleOnGestureListener, true döndüren bir onDown() yöntemi uygulayın. Bu Bunun nedeni tüm hareketlerin bir onDown() mesajıyla başlamasıdır. Şu durumda: onDown() sorgusundan false değerini döndür, örneğin GestureDetector.SimpleOnGestureListener varsayılan olarak yapar, sistem hareketin geri kalanını göz ardı etmek istediğinizi ve GestureDetector.OnGestureListener çağrılmadı. Bu durum, veya beklenmedik sorunlar olduğunu tespit edebilirsiniz. Şuradan yalnızca false iade edilecek: Bir hareketin tamamını yoksaymak istiyorsanız onDown().

Kotlin

private const val DEBUG_TAG = "Gestures"

class MainActivity : Activity() {

    private lateinit var mDetector: GestureDetectorCompat

    public override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        mDetector = GestureDetectorCompat(this, MyGestureListener())
    }

    override fun onTouchEvent(event: MotionEvent): Boolean {
        mDetector.onTouchEvent(event)
        return super.onTouchEvent(event)
    }

    private class MyGestureListener : GestureDetector.SimpleOnGestureListener() {

        override fun onDown(event: MotionEvent): Boolean {
            Log.d(DEBUG_TAG, "onDown: $event")
            return true
        }

        override fun onFling(
                event1: MotionEvent,
                event2: MotionEvent,
                velocityX: Float,
                velocityY: Float
        ): Boolean {
            Log.d(DEBUG_TAG, "onFling: $event1 $event2")
            return true
        }
    }
}

Java

public class MainActivity extends Activity {

    private GestureDetectorCompat mDetector;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mDetector = new GestureDetectorCompat(this, new MyGestureListener());
    }

    @Override
    public boolean onTouchEvent(MotionEvent event){
        if (this.mDetector.onTouchEvent(event)) {
              return true;
        }
        return super.onTouchEvent(event);
    }

    class MyGestureListener extends GestureDetector.SimpleOnGestureListener {
        private static final String DEBUG_TAG = "Gestures";

        @Override
        public boolean onDown(MotionEvent event) {
            Log.d(DEBUG_TAG,"onDown: " + event.toString());
            return true;
        }

        @Override
        public boolean onFling(MotionEvent event1, MotionEvent event2,
                float velocityX, float velocityY) {
            Log.d(DEBUG_TAG, "onFling: " + event1.toString() + event2.toString());
            return true;
        }
    }
}

Ek kaynaklar