安卓双滑块拖动条

57

这个问题的变种可以在互联网上找到很多,但没有答案。

我想要一个带有双拇指范围选择的SeekBar。我愿意自己编写程序,但我缺乏Android方面的经验。有人能给我一些指导从哪里开始吗?我的意思是,我知道我将不得不扩展某些东西(可能是ProgressBar),但我该如何去做呢?我真的必须重新创建标准SeekBar的所有功能,还是有更简单的方法吗?

当然,完整的解决方案也是欢迎的;)


1
为什么不尝试扩展SeekBar本身或者AbsSeekBar呢?这是SeekBar的源代码...http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.1_r2/android/widget/SeekBar.java 你可以查看该源代码以及AbsSeekBar源代码,了解如何添加和处理第二个拇指。 - Squonk
你好,MisterSquonk。我尝试了那个方法,但是扩展/修改 AbsSeekBar 非常复杂。我已经使用 ImageView 创建了自己的控件,它非常简单易用。 - KPBird
2
完全自定义SeekBar http://codingsignals.com/crystal-range-seekbar-in-android/ - Asif
5个回答

110

非常感谢您允许我们使用它。我有一个问题,关于如何将其放在布局上。在您的示例中,您有 // add RangeSeekBar to pre-defined layout ViewGroup layout = (ViewGroup) findViewById(<your-layout-id>); layout.addView(seekBar);但我不确定如何在布局中获取viewgroup。您能否举个例子说明如何在布局中设置视图?谢谢!(这真的很混乱..我很抱歉) - Brandon
1
@Brandon 这个例子旨在尽可能地通用。ViewGroup是大多数布局的超类。请将其替换为您选择的特定布局,例如RelativeLayout。 - Stephan Tittel
Stephan,晚上我意识到你可能是想用视图组而不是实际项。非常感谢你的快速回复! - Brandon
2
完全自定义带有双向 HTTP 的进度条 http://codingsignals.com/crystal-range-seekbar-in-android/ - Asif
1
这个库似乎无法正确构建了,而且已经被弃用了。我不知道为什么。 - John61590
显示剩余6条评论

27

我也在寻找这个功能,但没有找到。所以我制作了一个新的小部件,随意使用:https://code.google.com/p/range-seek-bar/

Stephan提供的示例很好用!但是用户必须按下任何一个滑块才能获得响应。我希望当用户按下滑动条时,最接近的滑块会移动到该位置并正常工作。

我在示例代码中实现了这一点:

private final Thumb getClosestThumb(float touchX)

{
    double xValue = screenToNormalized(touchX);        
    return (Math.abs(xValue - normalizedMinValue) < Math.abs(xValue - normalizedMaxValue)) ? Thumb.MIN : Thumb.MAX;
}

而在 "public boolean onTouchEvent(MotionEvent event)" 方法中,

if(pressedThumb == null),
   pressedThumb = getClosestThumb(mDownMotionX);

@StephanTittel,我也尝试过同样的事情。请将这个答案添加到您的项目中,这样就不会像我一样遇到问题了。感谢您。 - Noundla Sandeep
这是一篇相当老的帖子。我有一个疑问,我希望每次将最小值增加或减少10。如何实现? - AnswerDroid
这个组件是一个1000行的可怕代码和性能差的灾难,不应该使用。 - Paul Lammertsma

3

2
我使用了 anothem/android-range-seek-bar 库。

https://github.com/anothem/android-range-seek-bar

在 XML 中
<org.florescu.android.rangeseekbar.RangeSeekBar
            android:id="@+id/pricebar_with_label"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            rsb:absoluteMinValue="20"
            rsb:absoluteMaxValue="150"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            />

enter image description here


1
请在 README 中添加此示例 :) - Gelldur
如何移除标签min/max? - Jeff Bootsholz
@RajuGujarati 添加此属性 rsb:showLabels="false" - Sachin Tanpure
1
这个组件是一个1000行的可怕代码和性能差的灾难,不应该使用。 - Paul Lammertsma

2
如果您使用任何材料组件,例如: Snackbar, BottomNavigationView 等,则不必使用其他第三方库。
Material库还附带有RangeSlider,可用于选择一系列值。
材料库 - implementation 'com.google.android.material:material:latestVersion'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接