A highly customizable SeekBar library for Android.
-
You project should build against Android 4.2.x (minSdkVersion 17).
-
Add the JitPack repository to your project's build.gradle file:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
- Add the dependency in your app's build.gradle file:
dependencies {
implementation 'com.github.moisoni97:IndicatorSeekBar:3.0.0'
}
To create an IndicatorSeekBar
you can either do it via XML
or Java
:
XML implementation:
<com.warkiz.widget.IndicatorSeekBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:isb_max="100"
app:isb_min="-1.0"
app:isb_progress="25"
app:isb_seek_smoothly="true"
app:isb_tick_count="5"
app:isb_show_tick_mark_type="oval"
app:isb_tick_mark_size="13dp"
app:isb_tick_mark_drawable="@mipmap/ic_launcher"
app:isb_show_tick_text="true"
app:isb_tick_text_size="15sp"
app:isb_tick_text_color="@color/color_blue"
app:isb_thumb_color="@color/color_green"
app:isb_thumb_size="20dp"
app:isb_show_indicator="rounded_rectangle"
app:isb_indicator_color="@color/color_gray"
app:isb_indicator_text_color="@color/colorAccent"
app:isb_indicator_text_size="18sp"
app:isb_track_background_color="@color/color_gray"
app:isb_track_background_size="2dp"
app:isb_track_progress_color="@color/color_blue"
app:isb_track_progress_size="4dp"
app:isb_only_thumb_draggable="false"/>
Java code:
IndicatorSeekBar indicatorSeekBar = IndicatorSeekBar
.with(getContext())
.max(110)
.min(10)
.progress(53)
.tickCount(7)
.showTickMarkType(TickMarkType.OVAL)
.tickMarkColor(getResources().getColor(R.color.color_blue, null))
.tickMarkSize(13)
.showTickText(true)
.tickTextColor(getResources().getColor(R.color.color_pink))
.tickTextSize(13)
.tickTextTypeFace(Typeface.MONOSPACE)
.showIndicatorType(IndicatorType.ROUNDED_RECTANGLE)
.indicatorColor(getResources().getColor(R.color.color_blue))
.indicatorTextColor(Color.parseColor("#ffffff"))
.indicatorTextSize(13)
.thumbColor(getResources().getColor(R.color.colorAccent, null))
.thumbSize(14)
.trackProgressColor(getResources().getColor(R.color.colorAccent,null))
.trackProgressSize(4)
.trackBackgroundColor(getResources().getColor(R.color.color_gray))
.trackBackgroundSize(2)
.onlyThumbDraggable(false)
.build();
The indicator
of the SeekBar can be set to stay always visible. To achieve this, IndicatorSeekBar
must be placed inside of IndicatorStayLayout
XML implementation:
<com.warkiz.widget.IndicatorStayLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.warkiz.widget.IndicatorSeekBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:isb_show_indicator="rectangle" <!--indicator can not be type: NONE-->
....../>
</com.warkiz.widget.IndicatorStayLayout>
Java code:
IndicatorSeekBar indicatorSeekBar = IndicatorSeekBar
.with(getContext())
.max(50)
.min(10)
.showIndicatorType(IndicatorType.RECTANGLE) //indicator can not be type: NONE
...
.build();
new IndicatorStayLayout(getContext()).attachTo(indicatorSeekBar);
The indicator view
can be customized is different ways:
- To replace the
indicator view
top part:
indicatorSeekBar.getIndicator().setTopContentView(yourTopView);
- To set a custom
indicator view
:
indicatorSeekBar.getIndicator().setContentView(yourView);
Set a format string with placeholder ${PROGRESS}
, ${TICK_TEXT}
or ${EMPTY_TEXT}
to IndicatorSeekBar.
- To show the progress with suffix
%
:
Java
:
indicatorSeekBar.setIndicatorTextFormat("${PROGRESS} %")
Kotlin
:
indicatorSeekBar.setIndicatorTextFormat("\${PROGRESS} %")
- To show the tick text with prefix
I am
:
Java:
indicatorSeekBar.setIndicatorTextFormat("I am ${TICK_TEXT}")
Kotlin
:
indicatorSeekBar.setIndicatorTextFormat("I am \${TICK_TEXT}")
- To show custom text, excluding
progress
ortick text
:
Java:
indicatorSeekBar.setIndicatorTextFormat("Speed x0.25 ${EMPTY_TEXT}")
Kotlin:
indicatorSeekBar.setIndicatorTextFormat("Speed x0.25 \${EMPTY_TEXT}")
The color of every block in IndicatorSeekBar
can be customized:
seekBar.customSectionTrackColor(new ColorCollector() {
@Override
public boolean collectSectionTrackColor(int[] colorIntArr) {
//the length of colorIntArray equals section count
colorIntArr[0] = getResources().getColor(R.color.color_blue, null);
colorIntArr[1] = getResources().getColor(R.color.color_gray, null);
colorIntArr[2] = Color.parseColor("#FF4081");
...
return true; //true to apply color, otherwise no change
}
});
You can set the StateListDrawable
or ColorStateList
for the thumb and tick mark. Also, ColorStateList
for tick text is supported:
thumb
selector drawable:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!--drawable for thumb in pressed state-->
<item android:drawable="@mipmap/ic_launcher_round" android:state_pressed="true" />
<!--drawable for thumb in normal state-->
<item android:drawable="@mipmap/ic_launcher" />
</selector>
thumb
selector color:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!--color for thumb in pressed state-->
<item android:color="@color/colorAccent" android:state_pressed="true" />
<!--color for thumb in normal state-->
<item android:color="@color/color_blue" />
</selector>
tick mark
selector drawable:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!--drawable for tick mark at the left side of the thumb-->
<item android:drawable="@mipmap/ic_launcher_round" android:state_selected="true" />
<!--drawable for tick mark at the right side of the thumb-->
<item android:drawable="@mipmap/ic_launcher" />
</selector>
tick mark
selector color:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!--color for tick mark at the left side of the thumb-->
<item android:color="@color/colorAccent" android:state_selected="true" />
<!--color for tick mark at the right side of the thumb-->
<item android:color="@color/color_gray" />
</selector>
tick text
selector color:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!--color for tick text at the left side of the thumb-->
<item android:color="@color/colorAccent" android:state_selected="true" />
<!--color for tick text under the thumb-->
<item android:color="@color/color_blue" android:state_hovered="true" />
<!--color for tick text at the right side of the thumb-->
<item android:color="@color/color_gray" />
</selector>
- Implement the listener to handle
SeekParams
changes:
seekBar.setOnSeekChangeListener(new OnSeekChangeListener() {
@Override
public void onSeeking(SeekParams seekParams) {
Log.i(TAG, seekParams.seekBar);
Log.i(TAG, seekParams.progress);
Log.i(TAG, seekParams.progressFloat);
Log.i(TAG, seekParams.fromUser);
Log.i(TAG, seekParams.thumbPosition);
Log.i(TAG, seekParams.tickText);
}
@Override
public void onStartTrackingTouch(IndicatorSeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(IndicatorSeekBar seekBar) {
}
});
- Check all
IndicatorSeekBar
attributes here: attr.xml