Switching "disable zoom" setting to "enable zoom out"

which will be off by default
This commit is contained in:
Jay 2020-05-25 20:25:55 -04:00
parent f7b10463f7
commit cac18f16ab
10 changed files with 32 additions and 29 deletions

View File

@ -53,7 +53,7 @@ object PreferenceKeys {
const val webtoonSidePadding = "webtoon_side_padding" const val webtoonSidePadding = "webtoon_side_padding"
const val webtoonDisableZoom = "webtoon_disable_zoom" const val webtoonEnableZoomOut = "webtoon_enable_zoom_out"
const val updateOnlyNonCompleted = "pref_update_only_non_completed_key" const val updateOnlyNonCompleted = "pref_update_only_non_completed_key"

View File

@ -99,7 +99,7 @@ class PreferencesHelper(val context: Context) {
fun webtoonSidePadding() = flowPrefs.getInt(Keys.webtoonSidePadding, 0) fun webtoonSidePadding() = flowPrefs.getInt(Keys.webtoonSidePadding, 0)
fun webtoonDisableZoom() = flowPrefs.getBoolean(Keys.webtoonDisableZoom, false) fun webtoonEnableZoomOut() = flowPrefs.getBoolean(Keys.webtoonEnableZoomOut, false)
fun readWithTapping() = flowPrefs.getBoolean(Keys.readWithTapping, true) fun readWithTapping() = flowPrefs.getBoolean(Keys.readWithTapping, true)

View File

@ -150,7 +150,7 @@ class ReaderSettingsSheet(private val activity: ReaderActivity) :
pager_prefs_group.gone() pager_prefs_group.gone()
crop_borders_webtoon.bindToPreference(if (hasMargins) preferences.cropBorders() else preferences.cropBordersWebtoon()) crop_borders_webtoon.bindToPreference(if (hasMargins) preferences.cropBorders() else preferences.cropBordersWebtoon())
webtoon_side_padding.bindToIntPreference(preferences.webtoonSidePadding(), R.array.webtoon_side_padding_values) webtoon_side_padding.bindToIntPreference(preferences.webtoonSidePadding(), R.array.webtoon_side_padding_values)
webtoon_disable_zoom.bindToPreference(preferences.webtoonDisableZoom()) webtoon_enable_zoom_out.bindToPreference(preferences.webtoonEnableZoomOut())
} }
/** /**

View File

@ -19,7 +19,7 @@ class WebtoonConfig(preferences: PreferencesHelper = Injekt.get()) : ViewerConfi
var sidePadding = 0 var sidePadding = 0
private set private set
var disableZoom = false var enableZoomOut = false
private set private set
var zoomPropertyChangedListener: ((Boolean) -> Unit)? = null var zoomPropertyChangedListener: ((Boolean) -> Unit)? = null
@ -33,7 +33,7 @@ class WebtoonConfig(preferences: PreferencesHelper = Injekt.get()) : ViewerConfi
preferences.webtoonSidePadding() preferences.webtoonSidePadding()
.register({ sidePadding = it }, { imagePropertyChangedListener?.invoke() }) .register({ sidePadding = it }, { imagePropertyChangedListener?.invoke() })
preferences.webtoonDisableZoom() preferences.webtoonEnableZoomOut()
.register({ disableZoom = it }, { zoomPropertyChangedListener?.invoke(it) }) .register({ enableZoomOut = it }, { zoomPropertyChangedListener?.invoke(it) })
} }
} }

View File

@ -25,10 +25,10 @@ class WebtoonFrame(context: Context) : FrameLayout(context) {
*/ */
private val flingDetector = GestureDetector(context, FlingListener()) private val flingDetector = GestureDetector(context, FlingListener())
var disableZoom = true var enableZoomOut = false
set(value) { set(value) {
field = value field = value
recycler?.canZoom = !value recycler?.canZoomOut = value
} }
/** /**

View File

@ -32,14 +32,17 @@ open class WebtoonRecyclerView @JvmOverloads constructor(
private var firstVisibleItemPosition = 0 private var firstVisibleItemPosition = 0
private var lastVisibleItemPosition = 0 private var lastVisibleItemPosition = 0
private var currentScale = DEFAULT_RATE private var currentScale = DEFAULT_RATE
var canZoom = false var canZoomOut = false
set(value) { set(value) {
field = value field = value
if (!value) { if (!value) {
zoom(currentScale, DEFAULT_RATE, x, 0f, y, 0f, true) zoom(currentScale, DEFAULT_RATE, x, 0f, y, 0f)
} }
} }
private val minRate
get() = if (canZoomOut) MIN_RATE else DEFAULT_RATE
private val listener = GestureListener() private val listener = GestureListener()
private val detector = Detector() private val detector = Detector()
@ -100,10 +103,8 @@ open class WebtoonRecyclerView @JvmOverloads constructor(
fromX: Float, fromX: Float,
toX: Float, toX: Float,
fromY: Float, fromY: Float,
toY: Float, toY: Float
force: Boolean = false
) { ) {
if (!canZoom && !force) return
isZooming = true isZooming = true
val animatorSet = AnimatorSet() val animatorSet = AnimatorSet()
val translationXAnimator = ValueAnimator.ofFloat(fromX, toX) val translationXAnimator = ValueAnimator.ofFloat(fromX, toX)
@ -138,7 +139,6 @@ open class WebtoonRecyclerView @JvmOverloads constructor(
} }
fun zoomFling(velocityX: Int, velocityY: Int): Boolean { fun zoomFling(velocityX: Int, velocityY: Int): Boolean {
if (!canZoom) return false
if (currentScale <= 1f) return false if (currentScale <= 1f) return false
val distanceTimeFactor = 0.4f val distanceTimeFactor = 0.4f
@ -167,7 +167,6 @@ open class WebtoonRecyclerView @JvmOverloads constructor(
} }
private fun zoomScrollBy(dx: Int, dy: Int) { private fun zoomScrollBy(dx: Int, dy: Int) {
if (!canZoom) return
if (dx != 0) { if (dx != 0) {
x = getPositionX(x + dx) x = getPositionX(x + dx)
} }
@ -182,10 +181,9 @@ open class WebtoonRecyclerView @JvmOverloads constructor(
} }
fun onScale(scaleFactor: Float) { fun onScale(scaleFactor: Float) {
if (!canZoom) return
currentScale *= scaleFactor currentScale *= scaleFactor
currentScale = currentScale.coerceIn( currentScale = currentScale.coerceIn(
MIN_RATE, minRate,
MAX_SCALE_RATE) MAX_SCALE_RATE)
setScaleRate(currentScale) setScaleRate(currentScale)
@ -205,14 +203,14 @@ open class WebtoonRecyclerView @JvmOverloads constructor(
} }
fun onScaleBegin() { fun onScaleBegin() {
if (detector.isDoubleTapping && canZoom) { if (detector.isDoubleTapping) {
detector.isQuickScaling = true detector.isQuickScaling = true
} }
} }
fun onScaleEnd() { fun onScaleEnd() {
if (scaleX < MIN_RATE && canZoom) { if (scaleX < minRate) {
zoom(currentScale, MIN_RATE, x, 0f, y, 0f) zoom(currentScale, minRate, x, 0f, y, 0f)
} }
} }
@ -229,7 +227,7 @@ open class WebtoonRecyclerView @JvmOverloads constructor(
} }
fun onDoubleTapConfirmed(ev: MotionEvent) { fun onDoubleTapConfirmed(ev: MotionEvent) {
if (!isZooming && canZoom) { if (!isZooming) {
if (scaleX != DEFAULT_RATE) { if (scaleX != DEFAULT_RATE) {
zoom(currentScale, DEFAULT_RATE, x, 0f, y, 0f) zoom(currentScale, DEFAULT_RATE, x, 0f, y, 0f)
} else { } else {
@ -262,7 +260,6 @@ open class WebtoonRecyclerView @JvmOverloads constructor(
override fun onTouchEvent(ev: MotionEvent): Boolean { override fun onTouchEvent(ev: MotionEvent): Boolean {
val action = ev.actionMasked val action = ev.actionMasked
val actionIndex = ev.actionIndex val actionIndex = ev.actionIndex
if (!canZoom) return super.onTouchEvent(ev)
when (action) { when (action) {
MotionEvent.ACTION_DOWN -> { MotionEvent.ACTION_DOWN -> {
scrollPointerId = ev.getPointerId(0) scrollPointerId = ev.getPointerId(0)
@ -309,12 +306,12 @@ open class WebtoonRecyclerView @JvmOverloads constructor(
startScroll = true startScroll = true
} }
if (startScroll && canZoom) { if (startScroll) {
isZoomDragging = true isZoomDragging = true
} }
} }
if (isZoomDragging && canZoom) { if (isZoomDragging) {
zoomScrollBy(dx, dy) zoomScrollBy(dx, dy)
} }
} }

View File

@ -124,7 +124,7 @@ class WebtoonViewer(val activity: ReaderActivity, val hasMargins: Boolean = fals
} }
config.zoomPropertyChangedListener = { config.zoomPropertyChangedListener = {
frame.disableZoom = it frame.enableZoomOut = it
} }
frame.layoutParams = ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT) frame.layoutParams = ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)

View File

@ -163,6 +163,12 @@ class SettingsReaderController : SettingsController() {
entryValues = listOf(0, 10, 15, 20, 25) entryValues = listOf(0, 10, 15, 20, 25)
defaultValue = "0" defaultValue = "0"
} }
switchPreference {
key = Keys.webtoonEnableZoomOut
titleRes = R.string.enable_zoom_out
defaultValue = false
}
} }
preferenceCategory { preferenceCategory {
titleRes = R.string.navigation titleRes = R.string.navigation

View File

@ -264,11 +264,11 @@
app:layout_constraintTop_toBottomOf="@id/crop_borders_webtoon" /> app:layout_constraintTop_toBottomOf="@id/crop_borders_webtoon" />
<com.google.android.material.switchmaterial.SwitchMaterial <com.google.android.material.switchmaterial.SwitchMaterial
android:id="@+id/webtoon_disable_zoom" android:id="@+id/webtoon_enable_zoom_out"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
android:text="@string/disable_zoom" android:text="@string/enable_zoom_out"
android:textColor="?android:attr/textColorSecondary" android:textColor="?android:attr/textColorSecondary"
app:layout_constraintTop_toBottomOf="@id/webtoon_side_padding" /> app:layout_constraintTop_toBottomOf="@id/webtoon_side_padding" />
@ -289,7 +289,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:visibility="gone" android:visibility="gone"
app:constraint_referenced_ids="webtoon_prefs,crop_borders_webtoon, app:constraint_referenced_ids="webtoon_prefs,crop_borders_webtoon,
webtoon_side_padding_text,webtoon_side_padding,webtoon_disable_zoom" /> webtoon_side_padding_text,webtoon_side_padding,webtoon_enable_zoom_out" />
<androidx.constraintlayout.widget.Guideline <androidx.constraintlayout.widget.Guideline
android:id="@+id/bottom_line" android:id="@+id/bottom_line"

View File

@ -288,7 +288,7 @@
<!-- Reader settings --> <!-- Reader settings -->
<string name="fullscreen">Fullscreen</string> <string name="fullscreen">Fullscreen</string>
<string name="page_transitions">Page transitions</string> <string name="page_transitions">Page transitions</string>
<string name="disable_zoom">Disable zoom</string> <string name="enable_zoom_out">Enable zoom out</string>
<string name="double_tap_anim_speed">Double tap animation speed</string> <string name="double_tap_anim_speed">Double tap animation speed</string>
<string name="show_page_number">Show page number</string> <string name="show_page_number">Show page number</string>
<string name="true_32bit_color">32-bit color</string> <string name="true_32bit_color">32-bit color</string>