【问题标题】:Android Material Slider OnChangeListener Response Delay/Skip ProblemAndroid Material Slider OnChangeListener 响应延迟/跳过问题
【发布时间】:2021-01-16 22:25:27
【问题描述】:

所以我有一个 "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(重要),我将行为设置为

当在both 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 的反应有点慢(我猜),并跳过一些点:

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

【问题讨论】:

  • 您的听众被调用的频率可能比您想象的要少。也就是说,如果滑块在 50 并且您很快将其拖动到 70,它可能会调用 ~3 次,而不是 20 次。
  • @Ben P. 如果是这样,解决方案是什么?

标签: android material-design material-components-android android-slider


【解决方案1】:

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

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

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

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

    previousValue = value
}

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

【讨论】:

  • 这要优雅得多,但初始偏移量的问题仍然存在。
  • 感谢您的解决方案,我刚刚发现我的previousValue 与xml初始值不匹配……真是愚蠢的错误,抱歉。
【解决方案2】:

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

但实际上它是创建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"/> 

【讨论】:

  • 感谢您的解决方案,我刚刚发现我的previousValue 与 xml 初始值 (100) 不匹配...如此愚蠢的错误,抱歉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 2011-10-23
  • 1970-01-01
  • 2023-03-03
  • 2022-06-27
相关资源
最近更新 更多