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