Skip to content

Commit 32641e6

Browse files
committed
block date animated scroll on date click for better fast clicks
1 parent cba9698 commit 32641e6

File tree

3 files changed

+41
-18
lines changed

3 files changed

+41
-18
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.example.util.simpletimetracker.core.delegates.dateSelector.viewData
2+
3+
data class DateSelectorScrollViewData(
4+
val position: Int,
5+
val animate: Boolean,
6+
)

core/src/main/java/com/example/util/simpletimetracker/core/delegates/dateSelector/viewDelegate/DateSelectorViewDelegate.kt

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -89,11 +89,12 @@ object DateSelectorViewDelegate {
8989
viewModel: DateSelectorViewModelDelegate,
9090
binding: DateSelectorLayoutBinding,
9191
) = with(fragment) {
92-
viewModel.dateScrollPosition.observe { position ->
92+
viewModel.dateScrollPosition.observe { data ->
9393
doScrollToPosition(
9494
viewHolder = viewHolder,
9595
binding = binding,
96-
shift = position,
96+
shift = data.position,
97+
animate = data.animate,
9798
)
9899
}
99100
viewModel.updateDatesViewData.observe {
@@ -164,22 +165,32 @@ object DateSelectorViewDelegate {
164165
viewHolder: ViewHolder,
165166
binding: DateSelectorLayoutBinding,
166167
shift: Int,
168+
animate: Boolean,
167169
) = with(binding) {
168170
val actualPosition = viewHolder.adapter.value.toPosition(shift)
169-
170-
// To long to scroll with animation if scroll distance is long,
171-
// in this case scrollToPosition closer, and than smoothScroll with animation.
172-
rvDatesContainer.scrollToPosition(actualPosition)
173-
174-
rvDatesContainer.post {
175-
rvDatesContainer.horizontalSmoothScrollWithOffset(
176-
snapPreference = LinearSmoothScroller.SNAP_TO_END,
177-
position = actualPosition,
178-
calculateOffset = { recyclerView, view ->
179-
// center of the recycler.
180-
-recyclerView.width / 2 + view.width / 2
181-
},
182-
)
171+
val layoutManager = rvDatesContainer.layoutManager as? LinearLayoutManager ?: return@with
172+
173+
if (animate) {
174+
// To long to scroll with animation if scroll distance is long,
175+
// in this case scrollToPosition closer, and than smoothScroll with animation.
176+
rvDatesContainer.scrollToPosition(actualPosition)
177+
178+
rvDatesContainer.post {
179+
rvDatesContainer.horizontalSmoothScrollWithOffset(
180+
snapPreference = LinearSmoothScroller.SNAP_TO_END,
181+
position = actualPosition,
182+
calculateOffset = { recyclerView, view ->
183+
// center of the recycler.
184+
-recyclerView.width / 2 + view.width / 2
185+
},
186+
)
187+
}
188+
} else {
189+
rvDatesContainer.post {
190+
val view = rvDatesContainer.children.firstOrNull() ?: return@post
191+
val offset = rvDatesContainer.width / 2 - view.width / 2
192+
layoutManager.scrollToPositionWithOffset(actualPosition, offset)
193+
}
183194
}
184195
}
185196

core/src/main/java/com/example/util/simpletimetracker/core/delegates/dateSelector/viewModelDelegate/DateSelectorViewModelDelegate.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import androidx.lifecycle.MutableLiveData
55
import com.example.util.simpletimetracker.core.base.SingleLiveEvent
66
import com.example.util.simpletimetracker.core.base.ViewModelDelegate
77
import com.example.util.simpletimetracker.core.delegates.dateSelector.mapper.DateSelectorMapper
8+
import com.example.util.simpletimetracker.core.delegates.dateSelector.viewData.DateSelectorScrollViewData
89
import com.example.util.simpletimetracker.core.extension.set
910
import com.example.util.simpletimetracker.domain.prefs.interactor.PrefsInteractor
1011
import com.example.util.simpletimetracker.feature_base_adapter.InfiniteRecyclerAdapter
@@ -15,11 +16,13 @@ class DateSelectorViewModelDelegate @Inject constructor(
1516
private val prefsInteractor: PrefsInteractor,
1617
) : ViewModelDelegate() {
1718

18-
val dateScrollPosition: LiveData<Int> = SingleLiveEvent<Int>()
19+
val dateScrollPosition: LiveData<DateSelectorScrollViewData> =
20+
SingleLiveEvent<DateSelectorScrollViewData>()
1921
val updateDatesViewData: LiveData<Unit> = SingleLiveEvent<Unit>()
2022
val borderShadowsVisibility: LiveData<Boolean> = MutableLiveData()
2123

2224
private var parent: Parent? = null
25+
private var animateScroll: Boolean = true
2326

2427
fun attach(parent: Parent) {
2528
this.parent = parent
@@ -38,6 +41,7 @@ class DateSelectorViewModelDelegate @Inject constructor(
3841
if (parent?.currentPosition == item.position) {
3942
throttle { parent?.onDateClick() }.invoke()
4043
} else {
44+
animateScroll = false
4145
parent?.updatePosition(item.position)
4246
}
4347
}
@@ -59,7 +63,9 @@ class DateSelectorViewModelDelegate @Inject constructor(
5963
fun updatePosition(shift: Int) {
6064
dataProvider.currentSelectedPosition = shift
6165
updateDatesViewData.set(Unit)
62-
dateScrollPosition.set(shift)
66+
val scrollData = DateSelectorScrollViewData(position = shift, animate = animateScroll)
67+
animateScroll = true
68+
dateScrollPosition.set(scrollData)
6369
}
6470

6571
private suspend fun setupDatesSelector() {

0 commit comments

Comments
 (0)