HapeLee 1 год назад
Родитель
Сommit
c2353c9e71

+ 0 - 1
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">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />

+ 3 - 0
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)
             }
 

+ 10 - 0
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) {

+ 5 - 0
app/src/main/java/io/legato/kazusa/ui/main/MainActivity.kt

@@ -90,6 +90,11 @@ class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
         getNavigationBarView().getOrCreateBadge(R.id.menu_bookshelf)
     }
 
+    override fun onConfigurationChanged(newConfig: Configuration) {
+        super.onConfigurationChanged(newConfig)
+        recreate()
+    }
+
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
 

+ 50 - 0
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
+        }
+    }
+}