Webtoon zoom out (#2892)

* Increased added support for zoom out on webtoons to help with horizontal layout reading

* Renamed var
This commit is contained in:
morcefaster 2020-04-18 21:43:54 +03:00 committed by Jay
parent 08cb46b145
commit 0629bf982c

View file

@ -27,6 +27,8 @@ open class WebtoonRecyclerView @JvmOverloads constructor(
private var atFirstPosition = false
private var halfWidth = 0
private var halfHeight = 0
private var originalHeight = 0
private var heightSet = false
private var firstVisibleItemPosition = 0
private var lastVisibleItemPosition = 0
private var currentScale = DEFAULT_RATE
@ -40,6 +42,10 @@ open class WebtoonRecyclerView @JvmOverloads constructor(
override fun onMeasure(widthSpec: Int, heightSpec: Int) {
halfWidth = MeasureSpec.getSize(widthSpec) / 2
halfHeight = MeasureSpec.getSize(heightSpec) / 2
if (!heightSet) {
originalHeight = MeasureSpec.getSize(heightSpec)
heightSet = true
}
super.onMeasure(widthSpec, heightSpec)
}
@ -66,11 +72,17 @@ open class WebtoonRecyclerView @JvmOverloads constructor(
}
private fun getPositionX(positionX: Float): Float {
if (currentScale < 1) {
return 0f
}
val maxPositionX = halfWidth * (currentScale - 1)
return positionX.coerceIn(-maxPositionX, maxPositionX)
}
private fun getPositionY(positionY: Float): Float {
if (currentScale < 1) {
return (originalHeight / 2 - halfHeight).toFloat()
}
val maxPositionY = halfHeight * (currentScale - 1)
return positionY.coerceIn(-maxPositionY, maxPositionY)
}
@ -161,11 +173,14 @@ open class WebtoonRecyclerView @JvmOverloads constructor(
fun onScale(scaleFactor: Float) {
currentScale *= scaleFactor
currentScale = currentScale.coerceIn(
DEFAULT_RATE,
MIN_RATE,
MAX_SCALE_RATE)
setScaleRate(currentScale)
layoutParams.height = if (currentScale < 1) { (originalHeight / currentScale).toInt() } else { originalHeight }
halfHeight = layoutParams.height / 2
if (currentScale != DEFAULT_RATE) {
x = getPositionX(x)
y = getPositionY(y)
@ -173,6 +188,8 @@ open class WebtoonRecyclerView @JvmOverloads constructor(
x = 0f
y = 0f
}
requestLayout()
}
fun onScaleBegin() {
@ -182,8 +199,8 @@ open class WebtoonRecyclerView @JvmOverloads constructor(
}
fun onScaleEnd() {
if (scaleX < DEFAULT_RATE) {
zoom(currentScale, DEFAULT_RATE, x, 0f, y, 0f)
if (scaleX < MIN_RATE) {
zoom(currentScale, MIN_RATE, x, 0f, y, 0f)
}
}
@ -309,6 +326,7 @@ open class WebtoonRecyclerView @JvmOverloads constructor(
private companion object {
const val ANIMATOR_DURATION_TIME = 200
const val MIN_RATE = 0.5f
const val DEFAULT_RATE = 1f
const val MAX_SCALE_RATE = 3f
}