Android Material Slider OnChangeListener 响应延迟/跳过问题

问题描述

所以我有一个 "both" Slider 控制 "width" Slider"length" Slider,如下所示:

<com.google.android.material.slider.Slider
    android:id="@+id/width_slider"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:value="40"
    android:valueFrom="0"        <-
    android:valueto="200"        <-
    android:stepSize="1"/>       <-

<com.google.android.material.slider.Slider
    android:id="@+id/height_slider"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:value="40"
    android:valueFrom="0"        <-
    android:valueto="200"        <-
    android:stepSize="1"/>       <-

<com.google.android.material.slider.Slider
    android:id="@+id/both_slider"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:value="100"   
    android:valueFrom="0"        <-
    android:valueto="200"        <-
    android:stepSize="1"/>       <-

正如我在上面标记的,它们都有相同的范围(从 & 到)和 stepSize 到 1(重要),我设置了

两者 Slider上加/减值1时,其他两个也会加/减值1。

代码如下:

private var prevIoUsValue = 50f        //initial value,same as on xml

binding.bothSlider.addOnchangelistener { slider,value,fromUser ->
    if (value > prevIoUsValue) {
        binding.widthSlider.value++
        binding.heightSlider.value++
    }

    if (value < prevIoUsValue) {
        binding.widthSlider.value--
        binding.heightSlider.value--
    }

    prevIoUsValue = value
}

奇怪的事情发生了,似乎 widthheight Slider 的反应有点慢(我猜),并跳过某些点:

enter image description here

它们应该是同步的,因为它们具有相同的 stepSize 和取值范围(只是初始值不同)。任何帮助将不胜感激。

解决方法

使用“both”滑块的当前值来设置其他滑块的值。

binding.bothSlider.addOnChangeListener { _,value,_->
    binding.widthSlider.value = value
    binding.heightSlider.value = value
}

要确切地知道您要做什么有点困难。你也可以做一些类似的事情,但使用 diff 而不仅仅是 1:

binding.bothSlider.addOnChangeListener { slider,fromUser ->
    val diff = value - previousValue
    binding.widthSlider.value += diff
    binding.heightSlider.value += diff

    previousValue = value
}

这将使滑块发散,但仍将解决您遇到的“速度”问题。

,

那些滑块似乎有不同的比例...

但实际上是初始值产生了 60 的偏移量:

<com.google.android.material.slider.Slider
    android:id="@+id/both_slider"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:value="40" <-- 100 != 40
    android:valueFrom="0"
    android:valueTo="200"
    android:stepSize="1"/>