Saya ingin mendapatkan fling
deteksi gerakan yang berfungsi di aplikasi Android saya.
Yang saya miliki adalah GridLayout
yang berisi 9 ImageView
s. Sumbernya dapat ditemukan di sini: Layout Grid Romain Guys .
File yang saya ambil adalah dari aplikasi Photostream Romain Guy dan hanya sedikit diadaptasi.
Untuk situasi klik sederhana, saya hanya perlu mengatur onClickListener
agar setiap yang ImageView
saya tambahkan menjadi alat utama activity
yang diterapkan View.OnClickListener
. Tampaknya jauh lebih rumit untuk mengimplementasikan sesuatu yang mengenali a fling
. Saya kira ini karena mungkin span views
?
Jika aktivitas saya menerapkan,
OnGestureListener
saya tidak tahu cara mengaturnya sebagai pendengar gerakan untukGrid
atauImage
pandangan yang saya tambahkan.public class SelectFilterActivity extends Activity implements View.OnClickListener, OnGestureListener { ...
Jika aktivitas saya diimplementasikan
OnTouchListener
maka saya tidak memilikionFling
metode untukoverride
(memiliki dua peristiwa sebagai parameter yang memungkinkan saya untuk menentukan apakah melemparkan itu penting).public class SelectFilterActivity extends Activity implements View.OnClickListener, OnTouchListener { ...
Jika saya membuat kebiasaan
View
, sepertiGestureImageView
itu meluasImageView
saya tidak tahu bagaimana cara mengetahui aktivitas yangfling
telah terjadi dari tampilan. Bagaimanapun, saya mencoba ini dan metode tidak dipanggil ketika saya menyentuh layar.
Saya benar-benar hanya perlu contoh nyata dari ini bekerja lintas pandangan. Apa, kapan dan bagaimana saya harus melampirkan ini listener
? Saya harus dapat mendeteksi satu klik juga.
// Gesture detection
mGestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
int dx = (int) (e2.getX() - e1.getX());
// don't accept the fling if it's too short
// as it may conflict with a button push
if (Math.abs(dx) > MAJOR_MOVE && Math.abs(velocityX) > Math.absvelocityY)) {
if (velocityX > 0) {
moveRight();
} else {
moveLeft();
}
return true;
} else {
return false;
}
}
});
Apakah mungkin untuk meletakkan tampilan transparan di atas layar saya untuk menangkap teman kencan?
Jika saya memilih untuk tidak inflate
melihat gambar anak saya dari XML, bisakah saya meneruskan GestureDetector
sebagai parameter konstruktor ke subkelas baru ImageView
yang saya buat?
Ini adalah aktivitas yang sangat sederhana yang saya coba agar fling
pendeteksiannya bekerja: SelectFilterActivity (Diadaptasi dari photostream) .
Saya telah melihat sumber-sumber ini:
Sejauh ini belum ada yang berhasil dan saya berharap ada beberapa petunjuk.
Jawaban:
Terima kasih kepada Code Shogun , yang kodenya saya sesuaikan dengan situasi saya.
Biarkan aktivitas Anda menerapkan
OnClickListener
seperti biasa:Lampirkan pendengar gerakan Anda ke semua tampilan yang Anda tambahkan ke tata letak utama;
Saksikan dengan kagum saat metode Anda yang ditimpa dipukul, baik
onClick(View v)
aktivitas maupunonFling
pendengar gerakan.Tarian 'melemparkan' adalah opsional tetapi dianjurkan.
sumber
Salah satu jawaban di atas menyebutkan penanganan kerapatan piksel yang berbeda tetapi menyarankan untuk menghitung parameter gesek dengan tangan. Perlu dicatat bahwa Anda benar-benar dapat memperoleh nilai yang diskalakan dan masuk akal dari sistem menggunakan
ViewConfiguration
kelas:Saya perhatikan bahwa menggunakan nilai-nilai ini menyebabkan "rasa" melemparkan lebih konsisten antara aplikasi dan seluruh sistem.
sumber
swipeMinDistance = vc.getScaledPagingTouchSlop()
danswipeMaxOffPath = vc.getScaledTouchSlop()
.getScaledTouchSlop
memberi saya hasil offset yang sangat sedikit, dengan canggung. Misalnya hanya 24 piksel pada layar tinggi 540, itu sangat sulit untuk menjaga jaraknya dengan jari. : SSaya melakukannya sedikit berbeda, dan menulis kelas detektor tambahan yang mengimplementasikan
View.onTouchListener
onCreate
cukup tambahkan ke tata letak terendah seperti ini:di mana id.lowestLayout adalah id.xxx untuk tampilan terendah dalam hierarki tata letak danelendahLayout dinyatakan sebagai RelativeLayout
Dan kemudian ada kelas swipe detector aktivitas yang sebenarnya:
Bekerja sangat baik untuk saya!
sumber
Saya sedikit memodifikasi dan memperbaiki solusi dari Thomas Fankhauser
Seluruh sistem terdiri dari dua file, SwipeInterface dan ActivitySwipeDetector
SwipeInterface.java
Detektor
digunakan seperti ini:
Dan dalam mengimplementasikan
Activity
Anda perlu mengimplementasikan metode dari SwipeInterface , dan Anda bisa mengetahui dari mana View the Swipe Event dipanggil.sumber
v.performClick();
, yang digunakan untuk tidak mengkonsumsi acara ke OnClickListener, jika disetel pada tampilan yang samaKode detektor gerakan isyarat di atas sangat berguna! Namun Anda mungkin ingin menjadikan kerapatan solusi ini agnostik dengan menggunakan nilai relatif berikut
(REL_SWIPE)
daripada nilai absolut(SWIPE_)
sumber
Versi solusi saya diusulkan oleh Thomas Fankhauser dan Marek Sebera (tidak menangani gesekan vertikal):
SwipeInterface.java
ActivitySwipeDetector.java
sumber
Pertanyaan ini agak lama dan pada Juli 2011 Google merilis Paket Kompatibilitas, revisi 3) yang mencakup
ViewPager
yang berfungsi dengan Android 1.6 ke atas. TheGestureListener
jawaban diposting untuk pertanyaan ini tidak merasa sangat elegan di Android. Jika Anda mencari kode yang digunakan untuk beralih antar foto di Galeri Android atau mengalihkan tampilan di aplikasi Play Market yang baru, maka sudah pastiViewPager
.Berikut ini beberapa tautan untuk info lebih lanjut:
sumber
Ada antarmuka bawaan yang dapat Anda gunakan langsung untuk semua gerakan:
Berikut adalah penjelasan untuk pengguna tingkat dasar: Ada 2 impor hati-hati dalam memilih bahwa keduanya berbeda
sumber
Ada beberapa proposisi di web (dan halaman ini) untuk menggunakan ViewConfiguration. getScaledTouchSlop () untuk memiliki nilai skala perangkat untuk
SWIPE_MIN_DISTANCE
.getScaledTouchSlop()
ditujukan untuk jarak " scrolling threshold", bukan swipe. Jarak ambang pengguliran harus lebih kecil dari jarak ambang "ayunan antara halaman". Misalnya, fungsi ini mengembalikan 12 piksel pada Samsung GS2 saya, dan contoh yang dikutip di halaman ini sekitar 100 piksel.Dengan API Level 8 (Android 2.2, Froyo), Anda punya
getScaledPagingTouchSlop()
, dimaksudkan untuk gesekan halaman. Di perangkat saya, ini mengembalikan 24 (piksel). Jadi jika Anda menggunakan API Level <8, saya pikir "2 *getScaledTouchSlop()
" harus menjadi ambang geser "standar". Tetapi pengguna aplikasi saya dengan layar kecil mengatakan kepada saya bahwa itu terlalu sedikit ... Seperti pada aplikasi saya, Anda dapat menggulir secara vertikal, dan mengubah halaman secara horizontal. Dengan nilai yang diusulkan, mereka terkadang mengubah halaman alih-alih menggulir.sumber
Juga sebagai peningkatan kecil.
Alasan utama untuk blok coba / tangkap adalah bahwa e1 bisa menjadi nol untuk gerakan awal. selain mencoba / menangkap, sertakan tes untuk null dan kembali. mirip dengan yang berikut ini
sumber
Ada banyak informasi bagus di sini. Sayangnya banyak dari kode pemrosesan ini tersebar di berbagai situs di berbagai negara bagian penyelesaian, meskipun orang akan berpikir ini penting untuk banyak aplikasi.
Saya telah meluangkan waktu untuk membuat pendengar main yang memverifikasi bahwa kondisi yang sesuai terpenuhi. Saya telah menambahkan pendengar halaman penghubung yang menambahkan lebih banyak pemeriksaan untuk memastikan bahwa teman kencan memenuhi ambang batas untuk teman halaman. Kedua pendengar ini memungkinkan Anda untuk membatasi teman kencan dengan sumbu horizontal atau vertikal. Anda dapat melihat bagaimana ini digunakan dalam tampilan untuk menggeser gambar . Saya mengakui bahwa orang-orang di sini telah melakukan sebagian besar penelitian --- Saya baru saja mengumpulkannya di perpustakaan yang dapat digunakan.
Beberapa hari terakhir ini merupakan penusukan pertama saya pada pengkodean di Android; berharap lebih banyak yang akan datang.
sumber
Ini adalah jawaban gabungan dari dua jawaban di atas, jika ada yang menginginkan implementasi yang berjalan.
sumber
absDeltaY > minSwipeDelta
,absVelocityY > minSwipeVelocity
,absVelocityY < maxSwipeVelocity
hanya dalam kasus jikaminSwipeDelta
! =getScaledTouchSlop
,minSwipeVelocity
! =getScaledMinimumFlingVelocity
,maxSwipeVelocity
! =getScaledMaximumFlingVelocity
, Yaitu untuk memeriksa hanya jika ini disebut “default” (Maksudku getScaledTouchSlop, getScaledMinimumFlingVelocity, getScaledMaximumFlingVelocity) nilai-nilai yang ditingkatkan atau diubah sesuai dengan Anda keinginan sendiri.ACTION_UP
, tidakACTION_MOVE
atauACTION_POINTER_UP
, yaitu hanya sebagai hasil dari gerakan yang terwujud sepenuhnya). (Saya belum memeriksa versi API lainnya, jadi komentar sangat dihargai).Anda dapat menggunakan perpustakaan droidQuery untuk menangani teman kencan, klik, klik panjang, dan acara khusus. Implementasinya dibangun berdasarkan jawaban saya sebelumnya di bawah ini, tetapi droidQuery memberikan sintaks yang sederhana dan apik:
Jawaban Asli
Jawaban ini menggunakan kombinasi komponen dari jawaban lain di sini. Ini terdiri dari
SwipeDetector
kelas, yang memiliki antarmuka batin untuk mendengarkan acara. Saya juga menyediakanRelativeLayout
untuk menunjukkan bagaimana untuk menimpaView
'sonTouch
metode untuk memungkinkan kedua peristiwa menggesek dan acara terdeteksi lainnya (seperti klik atau klik panjang).SwipeDetector
Gesek Tampilan Pencegat
sumber
SwipeInterceptorView
, sehingga klik yang ditangani pertama. Anda dapat memperbaikinya dengan menerapkan mekanisme mengklik Anda sendiri dengan menerapkanonTouchListener
, atau sebagai solusi, Anda dapat mendengarkan klik panjang alih-alih klik (lihatView.setOnLongClickListener
).Saya tahu sudah terlambat untuk menjawab, tetapi saya masih memposting Deteksi Gesek untuk ListView bahwa Cara menggunakan Swipe Touch Listener di Item ListView .
Refrence: Pembasmi13 (salah satu jawaban di halaman ini)
Buat satu ActivitySwipeDetector.class
Sebut saja dari kelas aktivitas Anda seperti ini:
Dan jangan lupa untuk mengimplementasikan SwipeInterface yang akan memberi Anda dua metode @override:
sumber
MAX_OFF_PATH = 5 * vc.getScaledPagingTouchSlop()
lebih nyaman untuk sapuan jempol secara alami bepergian dalam sedikit lengkungan.Gerakan adalah gerakan halus untuk memicu interaksi antara layar sentuh dan pengguna. Ini berlangsung untuk waktu antara sentuhan pertama di layar ke titik ketika jari terakhir meninggalkan permukaan.
Android memberi kita kelas yang disebut GestureDetector yang dapat digunakan untuk mendeteksi gerakan umum seperti mengetuk ke bawah dan ke atas, menggesek secara vertikal dan horizontal (fling), tekan lama dan pendek, ketukan ganda, dll . dan lampirkan pendengar pada mereka.
Buat kelas Aktivitas kami mengimplementasikan GestureDetector.OnDoubleTapListener (untuk deteksi gerakan ketuk ganda) dan antarmuka GestureDetector.OnGestureListener dan menerapkan semua metode abstrak. Untuk info lebih lanjut. Anda dapat mengunjungi https://developer.android.com/training/gestures/detector.html . Kesopanan
Untuk Tes Demo. GestureDetectorDemo
sumber
Jika Anda tidak ingin membuat kelas terpisah atau membuat kode kompleks,
Anda bisa membuat variabel GestureDetector di dalam OnTouchListener dan membuat kode Anda lebih mudah
namVyuVar dapat berupa nama apa pun dari View yang Anda perlukan untuk mengatur listner
sumber
Untuk semua: jangan lupa tentang case MotionEvent.ACTION_CANCEL:
panggilan dalam gesekan 30% tanpa ACTION_UP
dan sama dengan ACTION_UP dalam kasus ini
sumber
Saya menambahkan Kelas yang lebih umum, saya mengambil kelas Tomas dan menambahkan Antarmuka yang mengirim acara ke Aktivitas atau Fragmen Anda. itu akan mendaftarkan pendengar pada konstruktor jadi pastikan Anda mengimplementasikan antarmuka atau ClassCastException akan menjadi milik mereka. antarmuka mengembalikan salah satu dari empat int final yang didefinisikan di kelas dan akan mengembalikan tampilan yang diaktifkan.
sumber