Android 个固定数字的滑块

Android sliders with fixed numbers

我正在尝试实现一个具有固定值的离散滑块,但我唯一可以设置的是 valueFrom、valueTo 和 stepSize。

这是我的代码,我正在尝试如何做

<com.google.android.material.slider.Slider
        android:id="@+id/slider"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:padding="8dp"
        app:tickColor="@color/colorSecondaryLight"
        app:tickColorActive="@color/colorSecondary" />

有没有办法在滑块上设置固定值? (我将使用 2、5、10、25、50 和 100 的值)

你最好使用 SeekBar

<SeekBar
     android:id="@+id/sb"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:max="10"
     android:thumb="@drawable/ic_location"
     android:theme="@style/Widget.AppCompat.SeekBar.Discrete" />

您可以使用 SeekBar 并定义值的范围,为了移除 smoothness/refining 滚动,设置 OnSeekBarChangeListener 并覆盖 onProgressChanged()通过如下再次设置进度,您需要的 SeekBar 值的有效范围。

例子

使用最大值为 100、步长为 10 的 SeekBar;所以总有效值为 10.

SeekBar seekBar = findViewById(R.id.seekbar);
seekBar.setMax(100);

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean
            fromUser) {

        seekBar.setProgress((progress / 10) * 10);

    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {

    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {

    }
});

对我有用的解决方案是这个名为 BubbleSeekBar

的库

第 1 步 - 添加对 Gradle 的依赖项。

implementation "com.xw.repo:bubbleseekbar:3.20-lite"

第 2 步 - 在 XML 上创建 BubbleSeekBar 并添加您需要的属性。对于我的情况,下面的示例有效。

<com.xw.repo.BubbleSeekBar
        android:id="@+id/bubbleSeekBar"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:bsb_auto_adjust_section_mark="true"
        app:bsb_hide_bubble="true"
        app:bsb_min="2"
        app:bsb_section_count="5"
        app:bsb_section_text_position="below_section_mark"
        app:bsb_seek_by_section="true" />

第 3 步 - 因为我需要自定义选项,所以我使用 string.xml

上声明的值数组在 onCreate 上进行了初始化
bubbleSeekBar.setCustomSectionTextArray { sectionCount, array ->
            array.clear()
            for ((index, value) in resources.getStringArray(R.array.xxxx)
                .withIndex()) {
                array.put(index, value)
            }
            array
        }

第 4 步 - 您可以使用以下方法捕获更改或设置值。

bubbleSeekBar.onProgressChangedListener
bubbleSeekBar.setProgress()

这个库非常好,对我有用。有关详细信息,请查看此答案顶部的 link。