Apakah ada cara untuk membuat ViewPager
yang tidak menggulir secara horizontal, tetapi secara vertikal ?!
android
android-viewpager
pengguna1709805
sumber
sumber
Jawaban:
Anda dapat menggunakan ViewPager.PageTransformer untuk memberikan ilusi vertikal
ViewPager
. Untuk mencapai pengguliran dengan vertikal alih-alih seret horizontal, Anda harus menggantiViewPager
event sentuh default dan menukar koordinatMotionEvent
sebelum menangani, misalnya:Tentu saja Anda dapat mengubah pengaturan ini sesuai keinginan Anda. Berakhir tampak seperti ini:
sumber
Saya punya solusi yang berfungsi untuk saya dalam dua langkah.
onInstantiateItem()
dariPagerAdapter
, buat tampilan dan putar dengan -90:Jika Anda menggunakan
FragmentPagerAdapter
, maka:Putar
ViewPager
tampilan 90 derajat:Bekerja seperti jimat setidaknya untuk kebutuhan saya.
sumber
ViewPager Vertikal
Jawaban lain di sini semua tampaknya memiliki beberapa masalah dengan mereka. Bahkan proyek open source yang direkomendasikan tidak menggabungkan permintaan tarikan terbaru dengan perbaikan bug. Kemudian saya menemukan
VerticalViewPager
dari Google bahwa mereka menggunakan beberapa aplikasi DeskClock. Saya percaya menggunakan implementasi Google jauh lebih banyak daripada jawaban lain yang beredar di sini. (Versi Google mirip dengan jawaban terpilih saat ini, tetapi lebih menyeluruh.)Contoh Lengkap
Contoh ini hampir persis sama dengan Contoh ViewPager Dasar saya , dengan beberapa perubahan kecil untuk menggunakan
VerticalViewPager
kelas.XML
Tambahkan tata letak xml untuk aktivitas utama dan untuk setiap halaman (fragmen). Perhatikan bahwa kami menggunakan
VerticalViewPager
daripada standarViewPager
. Saya akan memasukkan kode untuk itu di bawah ini.activity_main.xml
fragment_one.xml
Kode
Kode untuk
VerticalViewPager
bukan milikku. Ini hanya versi singkat (tanpa komentar) dari kode sumber Google. Lihat yang itu untuk versi yang paling baru. Komentar di sana juga bermanfaat untuk memahami apa yang terjadi.VerticalViewPager.java
MainActivity.java
Saya hanya bertukar
VerticalViewPager
untukViewPager
.Jadi
Anda harus dapat menjalankan aplikasi dan melihat hasilnya di animasi di atas.
Lihat juga
sumber
Untuk seseorang yang berjuang dengan cara membuat ViewPager vertikal bekerja di dalam horisontal, lakukan saja hal-hal berikut:
ViewPager Vertikal
Tampilan Halaman Horisontal
sumber
Sedikit ekstensi jawaban ini membantu saya mencapai persyaratan saya (Pager Tampilan Vertikal untuk menghidupkan serupa seperti di Inshorts - Berita dalam 60 kata )
Saya harap ini bisa membantu orang lain.
sumber
Ada beberapa proyek open source yang mengklaim melakukan ini. Di sini mereka:
Ini telah ditandai tidak digunakan oleh penulisnya:
Dan satu hal lagi:
deskclock
aplikasi, tetapi tampaknya tidak didukung secara resmi karena saya tidak dapat menemukan dokumentasi untuk itu.sumber
Lihat ini: https://github.com/JakeWharton/Android-DirectionalViewPager
Atau pertanyaan berikut dapat membantu Anda: 'Gridview with pages' atau 'Viewpager' Vertikal
sumber
DirectionalViewPager
belum diperbarui untuk beberapa waktu dan karenanya kehilangan beberapa fitur yang lebih baruViewPager
di perpustakaan dukungan; yaitusetPageMargin(int)
. Secara umum itu harus melakukan pekerjaannya. Dan jika tidak, tidak terlalu sulit untuk mengambil kode sumberViewPager
dan menukar semua x / y dan logika lebar / tinggi.DirectionalViewPager
tetapi, seperti yang dikatakan MH, itu tidak diperbarui (pengembangnya menganggapnya TERGANGGU) !! Sungguh luar biasa bahwa pengembang Android tidak menyediakan untuk komunitas secara vertikalViewPager
, tetapi hanya horisontal. Saya lebih baru ke Android, mengembangkanViewPager
pertukaran vertikal saya x / y tidak begitu mudah bagi saya .. saya lebih suka solusi yang sudah dibangun .. lagi pula, terima kasihHanya peningkatan pada jawaban dari @ Brett dan @ Salman666 untuk mengubah koordinat (X, Y) menjadi (Y, X) dengan benar karena tampilan perangkat berbentuk persegi panjang:
...
...
Namun, masih ada sesuatu yang perlu dilakukan untuk lebih responsif layar sentuh. Masalahnya mungkin terkait dengan apa yang @msdark mengomentari jawaban @ Salman666.
sumber
true
dionInterceptTouchEvent
dan saya juga telah memodifikasi binding kunci, sehingga menggunakan DPAD itu memicu scroll dengan UP / DOWN bukannya kiri / kanan: gist.github.com/zevektor/fbacf4f4f6c39fd6e409sumber
Sebenarnya sudah ada satu di sumber Android . Saya telah memodifikasinya agar berfungsi lebih baik:
sumber
Repositori yang saat ini lebih aktif adalah lsjwzh / RecyclerViewPager .
RecyclerView
sumber
Ini adalah implementasi ViewPager yang dapat digulir vertikal. Bekerja dengan baik dengan RecyclerView dan ListView. guochong / VerticalViewPager .
gunakan ViewPager.PageTransformer untuk membuat gulir ViewPager secara vertikal, dan juga menyediakan View.OnTouchListener untuk menangani konflik gulir.
sumber
Bahkan saya menghadapi masalah yang sama dengan membuat ViewPager vertikal dengan menukar X dan Y. Itu sama sekali tidak mulus.
Itu karena dulu hanya bekerja ketika sudut menggesekkan kurang dari 7,125 derajat = arctan (1/8) saat mencegat dan 14 derajat = arctan (1/4) saat disentuh; sebagai ViewPager horizontal asli berfungsi ketika sudut gesek kurang dari 26,565 derajat = arctan (1/2) saat mencegat dan 45 derajat = arctan (1) saat disentuh.
Itu sebabnya saya menyalin kode Android support-core-ui dan memindahkan nilai ke variabel, yang saya kalikan menggunakan refleksi.
Silakan cari kode dan README di https://github.com/deepakmishra/verticalviewpager dan VerticalViewPager di https://github.com/deepakmishra/verticalviewpager/blob/master/app/src/main/java/com/viewpager/VerticalViewPager .Jawa
sumber
cara yang lebih baik adalah memutar viewpager dengan 90 derajat, dan menggunakan constraintLayout untuk menyesuaikan lokasi.
sumber
Saya akhirnya menciptakan DirectionalViewPager baru yang dapat menggulir baik secara vertikal maupun horizontal karena semua solusi yang saya lihat di sini memiliki kekurangan:
Implementasi VerticalViewPager yang ada (oleh castorflex dan LambergaR)
Trik transformasi dengan koordinat swapping
VelocityTracker.computeCurrentVelocity
masih menghitung kecepatan dengan sumbu X, mungkin karena ini secara internal menggunakan panggilan asli yang mengabaikan pertukaran koordinat.Lihat rotasi
sumber