From 6d5ed6dd7b55ef1bbb8eec5e26673e249c3dff9f Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Wed, 24 Mar 2021 08:47:14 -0600 Subject: [PATCH] Update fast scroll behavior Update the behavior of the fast scroller so that the scroll only begins when the pointer is in the indicator box itself, instead of the general view. --- .../org/oxycblt/auxio/songs/FastScrollView.kt | 31 +++++++++++++------ app/src/main/res/drawable/ui_circle.xml | 5 +++ ...rcular_button.xml => ui_circle_ripple.xml} | 0 app/src/main/res/layout/item_accent.xml | 2 +- app/src/main/res/layout/view_fast_scroll.xml | 2 +- app/src/main/res/values/styles.xml | 2 +- 6 files changed, 30 insertions(+), 12 deletions(-) create mode 100644 app/src/main/res/drawable/ui_circle.xml rename app/src/main/res/drawable/{ui_circular_button.xml => ui_circle_ripple.xml} (100%) diff --git a/app/src/main/java/org/oxycblt/auxio/songs/FastScrollView.kt b/app/src/main/java/org/oxycblt/auxio/songs/FastScrollView.kt index 1ae93e5d2..3356eb438 100644 --- a/app/src/main/java/org/oxycblt/auxio/songs/FastScrollView.kt +++ b/app/src/main/java/org/oxycblt/auxio/songs/FastScrollView.kt @@ -59,6 +59,7 @@ class FastScrollView @JvmOverloads constructor( // --- STATE --- private var hasPostedItemUpdate = false + private var wasValidTouch = false private var lastPos = -1 init { @@ -147,6 +148,7 @@ class FastScrollView @JvmOverloads constructor( @Suppress("ClickableViewAccessibility") override fun onTouchEvent(event: MotionEvent): Boolean { + super.onTouchEvent(event) performClick() val success = handleTouch(event.action, event.x.roundToInt(), event.y.roundToInt()) @@ -160,15 +162,25 @@ class FastScrollView @JvmOverloads constructor( } private fun handleTouch(action: Int, touchX: Int, touchY: Int): Boolean { - if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) { - binding.scrollIndicatorText.setTextColor(inactiveColor) - lastPos = -1 + when (action) { + MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> { + binding.scrollIndicatorText.setTextColor(inactiveColor) + wasValidTouch = false + lastPos = -1 - return false + return false + } + + // Since this view is unified between the thumb and the indicators, we have + // to check if the initial pointer position was in the indicators to prevent the + // scroll from being triggered outside its bounds. + MotionEvent.ACTION_DOWN -> { + wasValidTouch = binding.scrollIndicatorText.contains(touchX, touchY) + } } // Try to figure out which indicator the pointer has landed on - if (binding.scrollIndicatorText.isBeingPressed(touchX, touchY)) { + if (binding.scrollIndicatorText.containsY(touchY) && wasValidTouch) { // Get the touch position in regards to the TextView and the rough text height val indicatorTouchY = touchY - binding.scrollIndicatorText.top val textHeight = binding.scrollIndicatorText.height / indicators.size @@ -214,10 +226,11 @@ class FastScrollView @JvmOverloads constructor( } } - /** - * Returns if the pointer is currently in the view - */ - private fun View.isBeingPressed(x: Int, y: Int): Boolean { + private fun View.contains(x: Int, y: Int): Boolean { + return x in (left until right) && containsY(y) + } + + private fun View.containsY(y: Int): Boolean { return y in (top until bottom) } } diff --git a/app/src/main/res/drawable/ui_circle.xml b/app/src/main/res/drawable/ui_circle.xml new file mode 100644 index 000000000..a6f3dfaa6 --- /dev/null +++ b/app/src/main/res/drawable/ui_circle.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ui_circular_button.xml b/app/src/main/res/drawable/ui_circle_ripple.xml similarity index 100% rename from app/src/main/res/drawable/ui_circular_button.xml rename to app/src/main/res/drawable/ui_circle_ripple.xml diff --git a/app/src/main/res/layout/item_accent.xml b/app/src/main/res/layout/item_accent.xml index dfe49c589..2ee82364d 100644 --- a/app/src/main/res/layout/item_accent.xml +++ b/app/src/main/res/layout/item_accent.xml @@ -12,7 +12,7 @@ android:id="@+id/accent" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:background="@drawable/ui_circular_button" + android:background="@drawable/ui_circle_ripple" android:padding="@dimen/margin_medium" android:scaleType="fitCenter" android:src="@drawable/ic_check" diff --git a/app/src/main/res/layout/view_fast_scroll.xml b/app/src/main/res/layout/view_fast_scroll.xml index 30f2095ce..bd1a614a7 100644 --- a/app/src/main/res/layout/view_fast_scroll.xml +++ b/app/src/main/res/layout/view_fast_scroll.xml @@ -12,7 +12,7 @@ android:id="@+id/scroll_thumb" android:layout_width="@dimen/size_scroll_thumb" android:layout_height="@dimen/size_scroll_thumb" - android:background="@drawable/ui_circular_button" + android:background="@drawable/ui_circle" android:elevation="@dimen/elevation_small" android:backgroundTint="?attr/colorPrimary" android:stateListAnimator="@animator/animator_thumb" diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 080c65ba7..e88b269d1 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -213,7 +213,7 @@