From 9949f329090fb67f55e9476d0ec9b9d83c62c55a Mon Sep 17 00:00:00 2001 From: HapeLee <1321903405@qq.com> Date: Thu, 12 Jun 2025 01:27:36 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kazusa/lib/theme/view/ThemeSlider.kt | 45 +++++++++++++++++-- .../legato/kazusa/ui/widget/DetailSeekBar.kt | 35 ++++++++++++--- .../main/res/layout/view_detail_seek_bar.xml | 3 +- 3 files changed, 72 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/io/legato/kazusa/lib/theme/view/ThemeSlider.kt b/app/src/main/java/io/legato/kazusa/lib/theme/view/ThemeSlider.kt index fa18b5088..3cdc62f3c 100644 --- a/app/src/main/java/io/legato/kazusa/lib/theme/view/ThemeSlider.kt +++ b/app/src/main/java/io/legato/kazusa/lib/theme/view/ThemeSlider.kt @@ -1,18 +1,57 @@ package io.legato.kazusa.lib.theme.view +import android.annotation.SuppressLint import android.content.Context import android.util.AttributeSet +import android.view.MotionEvent import com.google.android.material.slider.Slider +import kotlin.math.abs + //import io.legado.app.lib.theme.accentColor /** * @author Aidan Follestad (afollestad) */ + + class ThemeSlider(context: Context, attrs: AttributeSet) : Slider(context, attrs) { -// init { -// if (!isInEditMode) { -// applyTint(context.accentColor) +// private var isDragging = false + +// @SuppressLint("ClickableViewAccessibility") +// override fun onTouchEvent(event: MotionEvent): Boolean { +// when (event.action) { +// MotionEvent.ACTION_DOWN -> { +// // 检查是否点击在滑块上 +// isDragging = isPointOnThumb(event.x, event.y) +// if (!isDragging) { +// // 如果点击不在滑块上,不处理事件 +// return false +// } +// } +// MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> { +// isDragging = false +// } // } +// +// // 只有在拖动状态下或者在滑块上点击时才处理事件 +// return (isDragging || isPointOnThumb(event.x, event.y)) && super.onTouchEvent(event) +// } +// +// // 检查触摸点是否在滑块上 +// private fun isPointOnThumb(x: Float, y: Float): Boolean { +// // 计算滑块位置 +// val valueRange = valueTo - valueFrom +// val proportion = if (valueRange != 0f) (value - valueFrom) / valueRange else 0f +// +// // 计算滑块中心X坐标 +// val sliderWidth = width +// val sliderLeft = paddingLeft.toFloat() +// val thumbCenterX = sliderLeft + proportion * sliderWidth +// +// +// // 检查触摸点是否在滑块区域内 +// return x >= thumbCenterX - thumbRadius && x <= thumbCenterX + thumbRadius // } } + diff --git a/app/src/main/java/io/legato/kazusa/ui/widget/DetailSeekBar.kt b/app/src/main/java/io/legato/kazusa/ui/widget/DetailSeekBar.kt index db06c4a24..c01bd28f4 100644 --- a/app/src/main/java/io/legato/kazusa/ui/widget/DetailSeekBar.kt +++ b/app/src/main/java/io/legato/kazusa/ui/widget/DetailSeekBar.kt @@ -1,10 +1,14 @@ package io.legato.kazusa.ui.widget +import android.annotation.SuppressLint import android.content.Context +import android.os.Build import android.util.AttributeSet import android.view.LayoutInflater +import android.view.MotionEvent import android.widget.FrameLayout import android.widget.SeekBar +import androidx.annotation.RequiresApi import androidx.appcompat.widget.TooltipCompat import com.google.android.material.slider.Slider import io.legato.kazusa.R @@ -12,8 +16,11 @@ import io.legato.kazusa.databinding.ViewDetailSeekBarBinding //import io.legado.app.lib.theme.bottomBackground //import io.legado.app.lib.theme.getPrimaryTextColor import io.legato.kazusa.ui.widget.seekbar.SeekBarChangeListener +import kotlin.math.abs +@RequiresApi(Build.VERSION_CODES.O) +@SuppressLint("ClickableViewAccessibility") class DetailSeekBar @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null @@ -46,10 +53,13 @@ class DetailSeekBar @JvmOverloads constructor( isBottomBackground = typedArray.getBoolean(R.styleable.DetailSeekBar_isBottomBackground, false) val title = typedArray.getText(R.styleable.DetailSeekBar_title) + + binding.tvSeekTitle.apply { text = title TooltipCompat.setTooltipText(this, title) } + binding.slider.valueTo = typedArray.getInteger(R.styleable.DetailSeekBar_max, 0).toFloat() typedArray.recycle() binding.ivSeekPlus.setOnClickListener { @@ -82,6 +92,24 @@ class DetailSeekBar @JvmOverloads constructor( onChanged?.invoke(slider.value.toInt()) } }) + + binding.slider.setOnTouchListener { _, event -> + if (event.action == MotionEvent.ACTION_DOWN) { + val slider = binding.slider + val sliderWidth = slider.width - slider.paddingStart - slider.paddingEnd + val touchX = event.x - slider.paddingStart + + val proportion = (slider.value - slider.valueFrom) / (slider.valueTo - slider.valueFrom) + val thumbCenterX = proportion * sliderWidth + + val thumbRadiusPx = slider.thumbRadius * 2f // 可适当扩大滑块判断区域 + + val isTouchNearThumb = kotlin.math.abs(touchX - thumbCenterX) <= thumbRadiusPx + return@setOnTouchListener !isTouchNearThumb // 拦截不是点在滑块上的点击 + } + return@setOnTouchListener false + } + } private fun upValue(progress: Int = binding.slider.value.toInt()) { @@ -96,11 +124,4 @@ class DetailSeekBar @JvmOverloads constructor( upValue(progress) } -// override fun onStartTrackingTouch(seekBar: SeekBar) { -// -// } -// -// override fun onStopTrackingTouch(seekBar: SeekBar) { -// onChanged?.invoke(binding.slider.progress) -// } } \ No newline at end of file diff --git a/app/src/main/res/layout/view_detail_seek_bar.xml b/app/src/main/res/layout/view_detail_seek_bar.xml index 50ec680a8..ae0ccef0e 100644 --- a/app/src/main/res/layout/view_detail_seek_bar.xml +++ b/app/src/main/res/layout/view_detail_seek_bar.xml @@ -56,11 +56,12 @@ android:contentDescription="@string/reduce" app:icon="@drawable/ic_reduce" /> -