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:
- Dokunma etkinliği verileri toplanıyor.
- 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; } } }