Apakah ada cara untuk memperlambat kecepatan gulir dengan adaptor viewpager di android?
Anda tahu, saya telah melihat kode ini. Aku tidak tahu apa yang salah dong.
try{
Field mScroller = mPager.getClass().getDeclaredField("mScroller");
mScroller.setAccessible(true);
Scroller scroll = new Scroller(cxt);
Field scrollDuration = scroll.getClass().getDeclaredField("mDuration");
scrollDuration.setAccessible(true);
scrollDuration.set(scroll, 1000);
mScroller.set(mPager, scroll);
}catch (Exception e){
Toast.makeText(cxt, "something happened", Toast.LENGTH_LONG).show();
}
Itu tidak mengubah apa pun namun tidak ada pengecualian?
child.setNestedScrollingEnabled(false);
bekerja untuk sayaJawaban:
Saya sudah mulai dengan kode HighFlyer yang memang mengubah bidang mScroller (yang merupakan awal yang baik) tetapi tidak membantu memperpanjang durasi gulir karena ViewPager secara eksplisit meneruskan durasi ke mScroller saat meminta untuk menggulir.
Memperluas ViewPager tidak berfungsi karena metode penting (smoothScrollTo) tidak dapat diganti.
Saya akhirnya memperbaikinya dengan memperluas Scroller dengan kode ini:
Dan menggunakannya seperti ini:
Saya pada dasarnya telah melakukan hardcode durasinya menjadi 5 detik dan membuat ViewPager saya menggunakannya.
Semoga ini membantu.
sumber
scroller.setFixedDuration(5000);
memberikan kesalahan? Dikatakan "Metode setFixedDuration (int) tidak ditentukan"Saya ingin melakukannya sendiri dan telah mencapai solusi (menggunakan refleksi, bagaimanapun). Ini mirip dengan solusi yang diterima tetapi menggunakan interpolator yang sama dan hanya mengubah durasi berdasarkan suatu faktor. Anda perlu menggunakan a
ViewPagerCustomDuration
di XML Anda, bukanViewPager
, lalu Anda bisa melakukan ini:ViewPagerCustomDuration.java
:ScrollerCustomDuration.java
:Semoga ini bisa membantu seseorang!
sumber
Saya telah menemukan solusi yang lebih baik, berdasarkan jawaban @ df778899 dan Android ValueAnimator API . Ini bekerja dengan baik tanpa refleksi dan sangat fleksibel. Juga tidak perlu membuat ViewPager kustom dan memasukkannya ke dalam paket android.support.v4.view. Berikut ini contohnya:
sumber
startFakeDrag
danendFakeDrag
yang dimaksudkan untuk melakukan lebih dari yang tersedia diViewPager
luar kotak. Ini bekerja dengan baik untuk saya dan persis seperti yang saya carianimatePagerTransition(final boolean forward
metode Anda ? Itulah yang membuat saya bingung. Apakah Anda menyebutnya dalam salah satuViewPager.OnPageChangeListener
metode antarmuka? Atau di tempat lain?Seperti yang Anda lihat di sumber ViewPager, durasi lemparan dikontrol oleh objek mScroller. Dalam dokumentasi kita dapat membaca:
Jadi, jika Anda ingin mengontrol kecepatan, Anda dapat mengubah objek mScroller melalui refleksi.
Anda harus menulis sesuatu seperti ini:
sumber
Ini bukan solusi sempurna, Anda tidak bisa membuat kecepatan lebih lambat karena ini adalah
int
. Tapi bagi saya itu cukup lambat dan saya tidak perlu menggunakan refleksi.Perhatikan paket tempat kelas tersebut berada.
smoothScrollTo
memiliki visibilitas paket.sumber
Notice the package where the class is
.package-local
fields
/methods
, jika Anda membuat Android Studio mengira Anda menggunakan paket yang sama? Apakah saya satu-satunya yang mencium beberapasealing violation
?Metode fakeDrag di ViewPager tampaknya memberikan solusi alternatif.
Misalnya ini akan halaman dari item 0 ke 1:
(
count * count
Hanya ada di sana untuk mempercepat seret saat berjalan)sumber
Saya telah menggunakan
Berikut contohnya:
sumber
Berdasarkan solusi yang diterima saya telah membuat kelas kotlin dengan ekstensi untuk tampilan halaman. Nikmati! :)
sumber
Inilah jawaban menggunakan pendekatan yang sama sekali berbeda. Seseorang mungkin mengatakan ini memiliki perasaan hacky; namun, itu tidak menggunakan refleksi, dan saya berpendapat bahwa itu akan selalu berhasil.
Kami menemukan kode berikut di dalam
ViewPager.smoothScrollTo
:Ini menghitung durasi berdasarkan beberapa hal. Lihat apa saja yang bisa kita kendalikan?
mAdapter.getPageWidth
. Mari mengimplementasikan ViewPager.OnPageChangeListener di adaptor kita . Kami akan mendeteksi saat ViewPager menggulir, dan memberikan nilai palsu untuk lebar . Jika saya ingin durasi untuk menjadik*100
, maka saya akan kembali1.0/(k-1)
untukgetPageWidth
. Berikut adalah implikasi Kotlin dari bagian adaptor ini yang mengubah durasinya menjadi 400:Jangan lupa untuk menambahkan adaptor sebagai OnPageChangedListener.
Kasus khusus saya dapat dengan aman mengasumsikan bahwa pengguna tidak dapat menggeser untuk menyeret antar halaman. Jika Anda harus mendukung penyelesaian setelah tarik, maka Anda perlu melakukan sedikit lebih banyak dalam perhitungan Anda.
Satu kelemahannya adalah hal ini bergantung pada
100
nilai durasi dasar hardcode di ViewPager. Jika itu berubah, maka durasi Anda berubah dengan pendekatan ini.sumber
Saya ingin menyelesaikan masalah yang sama seperti Anda semua dan ini adalah solusi saya untuk masalah yang sama, tetapi saya pikir dengan cara ini solusinya lebih fleksibel karena Anda dapat mengubah durasi sesuka Anda dan juga mengubah interpolasi nilai sesuai keinginan untuk mencapai efek visual yang berbeda. Solusi saya menggesek dari halaman "1" ke halaman "2", jadi hanya dalam posisi yang meningkat, tetapi dapat dengan mudah diubah untuk masuk ke posisi yang menurun dengan melakukan "animProgress - lastFakeDrag" daripada "lastFakeDrag - animProgress". Saya rasa ini adalah solusi paling fleksibel untuk melakukan tugas ini.
sumber