From c2353c9e718f05cd8b798347dd4829131fe1bc81 Mon Sep 17 00:00:00 2001 From: HapeLee <1321903405@qq.com> Date: Fri, 25 Jul 2025 18:03:48 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=9C=87=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 1 - .../legato/kazusa/ui/book/read/MangaMenu.kt | 3 ++ .../io/legato/kazusa/ui/book/read/ReadMenu.kt | 10 ++++ .../io/legato/kazusa/ui/main/MainActivity.kt | 5 ++ .../io/legato/kazusa/utils/VibrationUtils.kt | 50 +++++++++++++++++++ 5 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/io/legato/kazusa/utils/VibrationUtils.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a8a45fa1c..aec8790c4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -115,7 +115,6 @@ android:name=".ui.main.MainActivity" android:alwaysRetainTaskState="true" android:enableOnBackInvokedCallback="true" - android:configChanges="locale|keyboardHidden|smallestScreenSize|screenLayout" android:exported="true"> diff --git a/app/src/main/java/io/legato/kazusa/ui/book/read/MangaMenu.kt b/app/src/main/java/io/legato/kazusa/ui/book/read/MangaMenu.kt index 03de20a96..11702a39b 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/read/MangaMenu.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/read/MangaMenu.kt @@ -19,6 +19,7 @@ import io.legato.kazusa.model.ReadBook import io.legato.kazusa.model.ReadManga import io.legato.kazusa.ui.browser.WebViewActivity import io.legato.kazusa.utils.ConstraintModify +import io.legato.kazusa.utils.VibrationUtils import io.legato.kazusa.utils.activity import io.legato.kazusa.utils.applyNavigationBarPadding import io.legato.kazusa.utils.gone @@ -220,12 +221,14 @@ class MangaMenu @JvmOverloads constructor( seekReadPage.addOnChangeListener { slider, value, fromUser -> if (fromUser) { + VibrationUtils.vibrate(context, 12) callBack.skipToPage(value.toInt() - 1) } } seekReadPage.addOnSliderTouchListener(object : Slider.OnSliderTouchListener { override fun onStartTrackingTouch(slider: Slider) { + VibrationUtils.vibrate(context, 16) vwMenuBg.setOnClickListener(null) } diff --git a/app/src/main/java/io/legato/kazusa/ui/book/read/ReadMenu.kt b/app/src/main/java/io/legato/kazusa/ui/book/read/ReadMenu.kt index 1c9a5aeb0..203395d95 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/read/ReadMenu.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/read/ReadMenu.kt @@ -26,6 +26,7 @@ import io.legato.kazusa.model.ReadBook import io.legato.kazusa.ui.browser.WebViewActivity import io.legato.kazusa.ui.widget.seekbar.SeekBarChangeListener import io.legato.kazusa.utils.ConstraintModify +import io.legato.kazusa.utils.VibrationUtils import io.legato.kazusa.utils.activity import io.legato.kazusa.utils.applyNavigationBarPadding import io.legato.kazusa.utils.dpToPx @@ -415,10 +416,19 @@ class ReadMenu @JvmOverloads constructor( AppConfig.brightnessVwPos = !AppConfig.brightnessVwPos upBrightnessVwPos() } + seekReadPage.addOnChangeListener { slider, value, fromUser -> + if (fromUser) { + VibrationUtils.vibrate(context, 12) + if (AppConfig.progressBarBehavior == "page") ReadBook.skipToPage(slider.value.toInt() - 1) + ReadBook.skipToPage(slider.value.toInt() - 1) + } + } + //阅读进度 seekReadPage.addOnSliderTouchListener(object : Slider.OnSliderTouchListener { override fun onStartTrackingTouch(slider: Slider) { vwMenuBg.setOnClickListener(null) + VibrationUtils.vibrate(context, 16) } override fun onStopTrackingTouch(slider: Slider) { diff --git a/app/src/main/java/io/legato/kazusa/ui/main/MainActivity.kt b/app/src/main/java/io/legato/kazusa/ui/main/MainActivity.kt index 92bf5cfd6..3d5a134df 100644 --- a/app/src/main/java/io/legato/kazusa/ui/main/MainActivity.kt +++ b/app/src/main/java/io/legato/kazusa/ui/main/MainActivity.kt @@ -90,6 +90,11 @@ class MainActivity : VMBaseActivity(), getNavigationBarView().getOrCreateBadge(R.id.menu_bookshelf) } + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + recreate() + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/java/io/legato/kazusa/utils/VibrationUtils.kt b/app/src/main/java/io/legato/kazusa/utils/VibrationUtils.kt new file mode 100644 index 000000000..f215fefef --- /dev/null +++ b/app/src/main/java/io/legato/kazusa/utils/VibrationUtils.kt @@ -0,0 +1,50 @@ +package io.legato.kazusa.utils + +import android.content.Context +import android.os.Build +import android.os.VibrationEffect +import android.os.Vibrator +import android.os.VibratorManager + +object VibrationUtils { + + /** + * 触发单次震动 + * @param context 上下文 + * @param milliseconds 震动时长(毫秒) + */ + fun vibrate(context: Context, milliseconds: Long) { + val vibrator = getVibrator(context) + vibrator.vibrate( + VibrationEffect.createOneShot( + milliseconds, + VibrationEffect.DEFAULT_AMPLITUDE + ) + ) + } + + /** + * 触发带模式的震动 + * @param context 上下文 + * @param pattern 震动模式数组(如 longArrayOf(0, 200, 100, 300)) + * @param repeat 重复次数(-1 为不重复) + */ + fun vibratePattern(context: Context, pattern: LongArray, repeat: Int = -1) { + val vibrator = getVibrator(context) + vibrator.vibrate(VibrationEffect.createWaveform(pattern, repeat)) + } + + /** + * 获取 Vibrator 实例(兼容 Android 12+) + */ + private fun getVibrator(context: Context): Vibrator { + return if (Build.VERSION.SDK_INT >= 31) { + val vibratorManager = + context.getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager + vibratorManager.defaultVibrator + } else { + @Suppress("DEPRECATION") + context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator + } + } +} \ No newline at end of file