Fixed an issue where scrolling didn't work anymore after going to landscape

Because of the way linearlayout measures and because we never invalidated
our measure cache, the measuring of the view would be skipped, leading
to issues. We're now forcing the measurement to be invalidated
when changing the measuredState.

Fixes: 159719742
Test: use crosshatch, go to expanded qs, have 2 players. Rotate back and forth. Observe normal scrolling
Change-Id: I32fc904f884b1032d173c4811576cdb5818bad22
This commit is contained in:
Selim Cinek
2020-06-26 18:58:39 -07:00
parent 2b33bad9c2
commit f629b618a4
3 changed files with 20 additions and 3 deletions

View File

@@ -464,7 +464,7 @@ class MediaCarouselController @Inject constructor(
val width = desiredHostState?.measurementInput?.width ?: 0
val height = desiredHostState?.measurementInput?.height ?: 0
if (width != carouselMeasureWidth && width != 0 ||
height != carouselMeasureWidth && height != 0) {
height != carouselMeasureHeight && height != 0) {
carouselMeasureWidth = width
carouselMeasureHeight = height
val playerWidthPlusPadding = carouselMeasureWidth +

View File

@@ -243,7 +243,7 @@ class MediaCarouselScrollHandler(
}
val rotation = (1.0f - settingsOffset) * 50
settingsButton.rotation = rotation * -Math.signum(contentTranslation)
val alpha = MathUtils.map(0.5f, 1.0f, 0.0f, 1.0f, settingsOffset)
val alpha = MathUtils.saturate(MathUtils.map(0.5f, 1.0f, 0.0f, 1.0f, settingsOffset))
settingsButton.alpha = alpha
settingsButton.visibility = if (alpha != 0.0f) View.VISIBLE else View.INVISIBLE
settingsButton.translationX = newTranslationX

View File

@@ -47,12 +47,29 @@ class TransitionLayout @JvmOverloads constructor(
private var currentState: TransitionViewState = TransitionViewState()
private var updateScheduled = false
private var desiredMeasureWidth = 0
private var desiredMeasureHeight = 0
/**
* The measured state of this view which is the one we will lay ourselves out with. This
* may differ from the currentState if there is an external animation or transition running.
* This state will not be used to measure the widgets, where the current state is preferred.
*/
var measureState: TransitionViewState = TransitionViewState()
set(value) {
val newWidth = value.width
val newHeight = value.height
if (newWidth != desiredMeasureWidth || newHeight != desiredMeasureHeight) {
desiredMeasureWidth = newWidth
desiredMeasureHeight = newHeight
// We need to make sure next time we're measured that our onMeasure will be called.
// Otherwise our parent thinks we still have the same height
if (isInLayout()) {
forceLayout()
} else {
requestLayout()
}
}
}
private val preDrawApplicator = object : ViewTreeObserver.OnPreDrawListener {
override fun onPreDraw(): Boolean {
updateScheduled = false
@@ -158,7 +175,7 @@ class TransitionLayout @JvmOverloads constructor(
MeasureSpec.EXACTLY)
child.measure(measureWidthSpec, measureHeightSpec)
}
setMeasuredDimension(measureState.width, measureState.height)
setMeasuredDimension(desiredMeasureWidth, desiredMeasureHeight)
}
}