Saya punya ScrollView
yang memegang serangkaian Views
. Saya ingin dapat menentukan apakah tampilan saat ini terlihat (jika ada bagian yang saat ini ditampilkan oleh ScrollView
). Saya mengharapkan kode di bawah ini untuk melakukan ini, anehnya tidak:
Rect bounds = new Rect();
view.getDrawingRect(bounds);
Rect scrollBounds = new Rect(scroll.getScrollX(), scroll.getScrollY(),
scroll.getScrollX() + scroll.getWidth(), scroll.getScrollY() + scroll.getHeight());
if(Rect.intersects(scrollBounds, bounds))
{
//is visible
}
android
scrollview
visible
ab11
sumber
sumber
Jawaban:
Gunakan
View#getHitRect
alih-alihView#getDrawingRect
pada tampilan yang Anda uji. Anda dapat menggunakanView#getDrawingRect
diScrollView
alih alih menghitung secara eksplisit.Kode dari
View#getDrawingRect
:Kode dari
View#getHitRect
:sumber
Ini bekerja:
sumber
GridView
/ListView
/GridViewWithHeader
bekerja dengannyaSwipeRefreshLayout
.getHitRect
mengembalikan kotak di koordinat induk, tetapigetLocalVisibleRect
mengembalikan kotak di koordinat lokal scrollview, bukan?Jika Anda ingin mendeteksi bahwa tampilan SEPENUHNYA terlihat:
sumber
Solusi saya adalah menggunakan
NestedScrollView
elemen Gulir:sumber
Untuk sedikit memperluas jawaban Bill Mote menggunakan getLocalVisibleRect, Anda mungkin ingin memeriksa apakah tampilan hanya terlihat sebagian:
sumber
Ekstensi ini membantu mendeteksi tampilan yang sepenuhnya terlihat.
Ini juga berfungsi jika Anda
View
adalah anak dari ...ScrollView
(misalnya:ScrollView
->LinearLayout
->ContraintLayout
-> ... ->YourView
).Catatan
1)
view.getY()
danview.getX()
kembalikan nilai x, y ke PARENT PERTAMA .2) Berikut adalah contoh tentang bagaimana
getDrawingRect
mengembalikan Tautansumber
sumber
Saya menghadapi masalah yang sama hari ini. Saat mencari di Google dan membaca referensi Android, saya menemukan posting ini dan metode yang akhirnya saya gunakan;
Nice dari mereka tidak hanya menyediakan Rect tetapi juga boolean menunjukkan jika Lihat terlihat sama sekali. Di sisi negatif, metode ini tidak berdokumen :(
sumber
Saya ingin Anda mendeteksi apakah Anda
View
sepenuhnyavisible
, coba dengan metode ini:Sebenarnya Anda bisa mendapatkan visibilitas tampilan dengan:
Nilai konstan yang mungkin dari visibilitas dalam Tampilan adalah:
TERLIHAT Tampilan ini terlihat. Gunakan dengan setVisibility (int) dan android: visibility.
INVISIBLE Tampilan ini tidak terlihat, tetapi masih membutuhkan ruang untuk keperluan tata letak. Gunakan dengan setVisibility (int) dan android: visibility.
PERGI Tampilan ini tidak terlihat, dan tidak membutuhkan ruang apa pun untuk keperluan tata letak. Gunakan dengan setVisibility (int) dan android: visibility.
sumber
Anda dapat menggunakan
FocusAwareScrollView
yang memberi tahu saat tampilan menjadi terlihat:Ini kelasnya:
sumber
Jalan Kotlin;
Perpanjangan untuk daftar gulir tampilan gulir dan dapatkan tindakan jika tampilan anak terlihat di layar.
Gunakan fungsi ekstensi ini untuk tampilan yang dapat digulir
sumber
Saya tahu ini sudah sangat terlambat. Tetapi saya punya solusi yang bagus. Di bawah ini adalah cuplikan kode untuk mendapatkan persentase visibilitas tampilan dalam tampilan gulir.
Pertama-tama atur pendengar sentuh pada tampilan gulir untuk mendapatkan panggilan balik untuk gulir berhenti.
Dalam cuplikan kode di atas, kami menerima panggilan balik untuk acara sentuh tampilan gulir dan memposting runnable setelah 150 milis (Tidak wajib) setelah panggilan balik untuk gulir dihentikan. Dalam runnable itu kita akan mendapatkan lokasi tampilan gulir di layar dan ketinggian tampilan gulir. Kemudian dapatkan instance viewgroup anak langsung dari tampilan gulir dan dapatkan jumlah anak. Dalam kasus saya anak langsung dari tampilan gulir adalah LinearLayout bernama scrollViewRootChild . Kemudian ulangi semua tampilan anak dari scrollViewRootChild . Dalam cuplikan kode di atas Anda dapat melihat saya mendapatkan lokasi anak di layar dalam array integer bernama viewLocation , dapatkan ketinggian tampilan dalam nama variabel viewHeight . Kemudian saya memanggil metode pribadi getViewVisibilityOnScrollStopped. Anda bisa mendapatkan pemahaman tentang cara kerja internal metode ini dengan membaca dokumentasi.
Jika Anda merasa ada peningkatan dalam kode ini, silakan berkontribusi.
sumber
Saya akhirnya menerapkan kombinasi dua jawaban Java (@ bill-mote https://stackoverflow.com/a/12428154/3686125 dan @ denys-vasylenko https://stackoverflow.com/a/25528434/3686125 ) di proyek saya sebagai sekumpulan ekstensi Kotlin, yang mendukung kontrol ScrollView vertikal standar atau HorizontalScrollView.
Saya hanya melemparkan ini dalam file Kotlin bernama Extensions.kt, tidak ada kelas, hanya metode.
Saya menggunakan ini untuk menentukan item mana yang akan diambil ketika pengguna berhenti menggulir dalam berbagai tampilan gulir dalam proyek saya:
Contoh penggunaan, mengulangi melalui anak-anak LinearLayout scrollview dan mencatat keluaran:
sumber
var
dan menekan petunjuk ide?Menggunakan @Qberticus jawaban yang to the point tapi btw hebat, saya menyusun banyak kode untuk memeriksa apakah setiap kali scrollview dipanggil dan digulir itu memicu jawaban @ Qberticus dan Anda dapat melakukan apa pun yang Anda inginkan, dalam kasus saya saya punya jejaring sosial yang berisi video sehingga ketika tampilan digambar di layar saya memutar ide video yang sama seperti facebook dan Instagram. Berikut kodenya:
sumber