Explorar o código

fix: 底栏填充样式着色层半透明,修复模糊被完全遮住 (Closes #2044) (#2075)

- readerMenuHazeEffect 中 tint 的 alpha 由「菜单不透明度」直接决定,默认 100(=1.0 不透明),
  填充样式(progressive=null)下完全遮住底层模糊,表现为「填充无模糊、渐变才有模糊」
- 着色层不透明度封顶(MAX_MENU_TINT_ALPHA=60),保证模糊始终可见
- 新增 menuTintAlpha 纯函数 + ReaderMenuTintAlphaTest 3 个用例防回归
kungunier hai 2 meses
pai
achega
1814035fab

+ 13 - 1
app/src/main/java/io/legado/app/ui/widget/components/reader/ReaderMenuEffects.kt

@@ -26,7 +26,7 @@ fun Modifier.readerMenuHazeEffect(
     val style = HazeLegado.custom(
         containerColor = resolvedColor.copy(alpha = surfaceAlpha.coerceIn(0, 100) / 100f),
         blurRadius = blurRadius,
-        blurAlpha = surfaceAlpha,
+        blurAlpha = menuTintAlpha(surfaceAlpha),
     )
 
     return hazeEffect(state = state, style = style) {
@@ -40,3 +40,15 @@ fun Modifier.readerMenuHazeEffect(
         }
     }
 }
+
+/**
+ * 着色层(tint)的不透明度上限。
+ *
+ * HazeStyle 的 tint 绘制在模糊内容之上,其 alpha 由「菜单不透明度」readMenuBlurAlpha 决定
+ * (默认 100 → 1.0 完全不透明)。若填充样式(progressive = null)直接使用该值,tint 会
+ * 完全遮住底层模糊,表现为「填充无模糊、渐变才有模糊」。封顶到半透明可保证模糊始终可见。
+ */
+internal const val MAX_MENU_TINT_ALPHA = 60
+
+internal fun menuTintAlpha(blurAlpha: Int): Int =
+    blurAlpha.coerceIn(0, MAX_MENU_TINT_ALPHA)

+ 36 - 0
app/src/test/java/io/legado/app/ui/widget/components/reader/ReaderMenuTintAlphaTest.kt

@@ -0,0 +1,36 @@
+package io.legado.app.ui.widget.components.reader
+
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+/**
+ * 底栏菜单着色层(tint)不透明度封顶逻辑测试。
+ *
+ * 背景:HazeStyle 的 tint 绘制在模糊内容之上,「菜单不透明度」readMenuBlurAlpha 默认 100
+ * (= 1.0 完全不透明)。填充样式下若直接用该值,tint 会完全遮住模糊,表现为 issue #2044
+ * 「底栏填充样式无模糊效果,只有渐变才生效」。封顶到半透明可保证模糊始终可见。
+ */
+class ReaderMenuTintAlphaTest {
+
+    @Test
+    fun `clamps tint alpha at max to keep blur visible`() {
+        // 菜单不透明度拉满(100)时,着色层仍半透明,模糊可见
+        assertEquals(MAX_MENU_TINT_ALPHA, menuTintAlpha(100))
+        assertEquals(MAX_MENU_TINT_ALPHA, menuTintAlpha(80))
+        assertEquals(MAX_MENU_TINT_ALPHA, menuTintAlpha(Int.MAX_VALUE))
+    }
+
+    @Test
+    fun `clamps tint alpha at zero`() {
+        assertEquals(0, menuTintAlpha(0))
+        assertEquals(0, menuTintAlpha(-5))
+        assertEquals(0, menuTintAlpha(Int.MIN_VALUE))
+    }
+
+    @Test
+    fun `keeps in-range tint alpha unchanged`() {
+        assertEquals(30, menuTintAlpha(30))
+        assertEquals(50, menuTintAlpha(50))
+        assertEquals(60, menuTintAlpha(60))
+    }
+}