Double tap zoom toggle (#9384)

* Double tap zoom toggle

Implements a toggle that allows users to disable double tap zoom including QuickScaling for webtoons. Partially resolves #4145

* Update i18n/src/main/res/values/strings.xml

---------

Co-authored-by: arkon <arkon@users.noreply.github.com>
This commit is contained in:
Ken Swenson 2023-04-25 18:06:49 -04:00 committed by GitHub
parent a8f17a3fab
commit 3ce9a9ff97
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 44 additions and 1 deletions

View File

@ -317,6 +317,11 @@ object SettingsReaderScreen : SearchableSettings {
subtitle = stringResource(R.string.split_tall_images_summary), subtitle = stringResource(R.string.split_tall_images_summary),
enabled = !isReleaseBuildType, // TODO: Show in release build when the feature is stable enabled = !isReleaseBuildType, // TODO: Show in release build when the feature is stable
), ),
Preference.PreferenceItem.SwitchPreference(
pref = readerPreferences.webtoonDoubleTapZoomEnabled(),
title = stringResource(R.string.pref_double_tap_zoom),
enabled = true,
),
), ),
) )
} }

View File

@ -34,6 +34,8 @@ class ReaderPreferences(
// TODO: Enable in release build when the feature is stable // TODO: Enable in release build when the feature is stable
fun longStripSplitWebtoon() = preferenceStore.getBoolean("pref_long_strip_split_webtoon", !isReleaseBuildType) fun longStripSplitWebtoon() = preferenceStore.getBoolean("pref_long_strip_split_webtoon", !isReleaseBuildType)
fun webtoonDoubleTapZoomEnabled() = preferenceStore.getBoolean("pref_enable_double_tap_zoom_webtoon", true)
fun imageScaleType() = preferenceStore.getInt("pref_image_scale_type_key", 1) fun imageScaleType() = preferenceStore.getInt("pref_image_scale_type_key", 1)
fun zoomStart() = preferenceStore.getInt("pref_zoom_start_key", 1) fun zoomStart() = preferenceStore.getInt("pref_zoom_start_key", 1)

View File

@ -140,5 +140,7 @@ class ReaderReadingModeSettings @JvmOverloads constructor(context: Context, attr
binding.webtoonPrefsGroup.longStripSplit.isVisible = !isReleaseBuildType binding.webtoonPrefsGroup.longStripSplit.isVisible = !isReleaseBuildType
binding.webtoonPrefsGroup.longStripSplit.bindToPreference(readerPreferences.longStripSplitWebtoon()) binding.webtoonPrefsGroup.longStripSplit.bindToPreference(readerPreferences.longStripSplitWebtoon())
binding.webtoonPrefsGroup.doubleTapZoom.bindToPreference(readerPreferences.webtoonDoubleTapZoomEnabled())
} }
} }

View File

@ -37,6 +37,11 @@ class WebtoonConfig(
var longStripSplitChangedListener: ((Boolean) -> Unit)? = null var longStripSplitChangedListener: ((Boolean) -> Unit)? = null
var doubleTapZoom = true
private set
var doubleTapZoomChangedListener: ((Boolean) -> Unit)? = null
val theme = readerPreferences.readerTheme().get() val theme = readerPreferences.readerTheme().get()
init { init {
@ -71,6 +76,12 @@ class WebtoonConfig(
}, },
) )
readerPreferences.webtoonDoubleTapZoomEnabled()
.register(
{ doubleTapZoom = it },
{ doubleTapZoomChangedListener?.invoke(it) },
)
readerPreferences.readerTheme().changes() readerPreferences.readerTheme().changes()
.drop(1) .drop(1)
.distinctUntilChanged() .distinctUntilChanged()

View File

@ -25,6 +25,13 @@ class WebtoonFrame(context: Context) : FrameLayout(context) {
*/ */
private val flingDetector = GestureDetector(context, FlingListener()) private val flingDetector = GestureDetector(context, FlingListener())
var doubleTapZoom = true
set(value) {
field = value
recycler?.doubleTapZoom = value
scaleDetector.isQuickScaleEnabled = value
}
/** /**
* Recycler view added in this frame. * Recycler view added in this frame.
*/ */

View File

@ -37,6 +37,8 @@ class WebtoonRecyclerView @JvmOverloads constructor(
private val listener = GestureListener() private val listener = GestureListener()
private val detector = Detector() private val detector = Detector()
var doubleTapZoom = true
var tapListener: ((MotionEvent) -> Unit)? = null var tapListener: ((MotionEvent) -> Unit)? = null
var longTapListener: ((MotionEvent) -> Boolean)? = null var longTapListener: ((MotionEvent) -> Boolean)? = null
@ -209,7 +211,7 @@ class WebtoonRecyclerView @JvmOverloads constructor(
} }
fun onDoubleTapConfirmed(ev: MotionEvent) { fun onDoubleTapConfirmed(ev: MotionEvent) {
if (!isZooming) { if (!isZooming && doubleTapZoom) {
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 {

View File

@ -142,6 +142,10 @@ class WebtoonViewer(val activity: ReaderActivity, val isContinuous: Boolean = tr
ActivityCompat.recreate(activity) ActivityCompat.recreate(activity)
} }
config.doubleTapZoomChangedListener = {
frame.doubleTapZoom = it
}
config.navigationModeChangedListener = { config.navigationModeChangedListener = {
val showOnStart = config.navigationOverlayOnStart || config.forceNavigationOverlay val showOnStart = config.navigationOverlayOnStart || config.forceNavigationOverlay
activity.binding.navigationOverlay.setNavigation(config.navigator, showOnStart) activity.binding.navigationOverlay.setNavigation(config.navigator, showOnStart)

View File

@ -75,6 +75,15 @@
android:text="@string/pref_long_strip_split" android:text="@string/pref_long_strip_split"
android:textColor="?android:attr/textColorSecondary" /> android:textColor="?android:attr/textColorSecondary" />
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/double_tap_zoom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:text="@string/pref_double_tap_zoom"
android:textColor="?android:attr/textColorSecondary" />
<androidx.constraintlayout.widget.Group <androidx.constraintlayout.widget.Group
android:id="@+id/tapping_prefs_group" android:id="@+id/tapping_prefs_group"
android:layout_width="wrap_content" android:layout_width="wrap_content"

View File

@ -321,6 +321,7 @@
<string name="pref_page_rotate">Rotate wide pages to fit</string> <string name="pref_page_rotate">Rotate wide pages to fit</string>
<string name="pref_page_rotate_invert">Flip orientation of rotated wide pages</string> <string name="pref_page_rotate_invert">Flip orientation of rotated wide pages</string>
<string name="pref_long_strip_split">Split tall images (BETA)</string> <string name="pref_long_strip_split">Split tall images (BETA)</string>
<string name="pref_double_tap_zoom">Double tap to zoom</string>
<string name="pref_cutout_short">Show content in cutout area</string> <string name="pref_cutout_short">Show content in cutout area</string>
<string name="pref_page_transitions">Animate page transitions</string> <string name="pref_page_transitions">Animate page transitions</string>
<string name="pref_double_tap_anim_speed">Double tap animation speed</string> <string name="pref_double_tap_anim_speed">Double tap animation speed</string>