Oke guys, pada kali ini kita akan membahas mengenai scroll. Tentu saja, ini akan bermanfaat ketika kalian menemukan ui / tampilan dengan menggunakan scroll button dan scroll gulir, ya meskipun bagusnya digulir saja. Ya mungkin saja, aplikasi kita akan digunakan pada device android yang sensitivenya kurang bagus sehingga membutuhkan button up dan down.

Oke, pertama kita bisa mendeteksi kapan scroll diaktifkan dengan menggunakan code berikut ini, pengecekan ini berlaku untuk scroll paling atas dan bawah saja ya.

fun NestedScrollView.canScrollViewScrollUp(): Boolean {
        return this.canScrollVertically(-1)
    }

fun NestedScrollView.canScrollViewScrollDown(): Boolean {
    return this.canScrollVertically(1)
}

Sebagai informasi canScrollViewScrollUp ada sebuah ektension dari NestedScrollView, dimana fungsi mengecek apakah dia bisa discroll ke paling atas? begitupun fungsi satunya adalah pengecekan scroll ke paling bawah.

Untuk memanggilnya, cukup mudah. Teman-teman hanya butuh seperti ini saja :

nsvItem.canScrollViewScrollUp()

Dimana nsvItem adalah inisialisasi view dari NestedScrollView ya

<androidx.core.widget.NestedScrollView
    android:id="@+id/nsv_item"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"> ...

Selain itu, teman-teman juga bisa siapkan code untuk button scrollnya ya, seperti ini :

ivBottom.setOnClickListener {
     scrollDown(nsvItem)
}
ivTop.setOnClickListener {
     scrollUp(nsvItem)
}

fun scrollUp(nestedScrollView: NestedScrollView) {
    nestedScrollView.smoothScrollTo(0, 0)
}
fun scrollDown(nestedScrollView: NestedScrollView) {
    nestedScrollView.smoothScrollTo(0,   nestedScrollView.height)
}

Ingat, ini button hanya akan melakukan scroll paling atas dan bawah saja bukan scroll sedikit demi sedikit ya. Selanjutnya kalian butuh fungsi ini, untuk melakukan pengecekan aplikasi saat pertama kali dijalankan (Tombol mana yang harus aktif dan disable ) :

nsvItem.viewTreeObserver.addOnGlobalLayoutListener(
                object : ViewTreeObserver.OnGlobalLayoutListener {
                    override fun onGlobalLayout() {
                        nsvItem.viewTreeObserver.removeOnGlobalLayoutListener(this)
                        val canScrollUp = nsvItem.canScrollViewScrollUp()
                        val canScrollDown = nsvItem.canScrollViewScrollDown()
                        ivTop.isEnabled = canScrollUp
                        ivBottom.isEnabled = canScrollDown
                    }
                },
            )

Agar terlihat lebih mulus ketika di scroll teman-teman bisa tambahkan listener ini :

nsvItem.setOnScrollChangeListener { _, _, scrollY, _, _ ->
                if (nsvItem.isAtMiddle()) {
                    ivBottom.isEnabled = true
                    ivTop.isEnabled = true
                } else if (nsvItem.canScrollViewScrollDown()) {
                    ivBottom.isEnabled = true
                    ivTop.isEnabled = nsvItem.canScrollViewScrollUp()
                } else {
                    ivBottom.isEnabled = false
                    ivTop.isEnabled = true
                }
            }

Untuk code isAtMiddle(), ini adalah fungsi untuk melakukan pengecekan saat discroll apakah dia bisa di scroll up atau bottom.

fun NestedScrollView.isAtMiddle(): Boolean {
        val totalHeight = this.getChildAt(0).measuredHeight
        val screenHeight = this.height
        val currentScroll = this.scrollY
        val tolerance = screenHeight / 19

        return currentScroll > tolerance && currentScroll < totalHeight - screenHeight - tolerance
    }

Semoga bermanfaat ya

Categorized in:

Tagged in:

,