我最近实现了这样一个功能,这是我的代码:
首先定义一个 ThumbTextView,它位于您的TextView 上方的Seekbar:
public class ThumbTextView extends TextView {
private LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
private int width = 0;
public ThumbTextView(Context context) {
super(context);
}
public ThumbTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void attachToSeekBar(SeekBar seekBar) {
String content = getText().toString();
if (TextUtils.isEmpty(content) || seekBar == null)
return;
float contentWidth = this.getPaint().measureText(content);
int realWidth = width - seekBar.getPaddingLeft() - seekBar.getPaddingRight();
int maxLimit = (int) (width - contentWidth - seekBar.getPaddingRight());
int minLimit = seekBar.getPaddingLeft();
float percent = (float) (1.0 * seekBar.getProgress() / seekBar.getMax());
int left = minLimit + (int) (realWidth * percent - contentWidth / 2.0);
left = left <= minLimit ? minLimit : left >= maxLimit ? maxLimit : left;
lp.setMargins(left, 0, 0, 0);
setLayoutParams(lp);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (width == 0)
width = MeasureSpec.getSize(widthMeasureSpec);
}
}
然后定义您自己的 ThumbTextSeekBar 类,它是 Seekbar 和 ThumbSeekbar 的包装器:
public class ThumbTextSeekBar extends LinearLayout {
public ThumbTextView tvThumb;
public SeekBar seekBar;
private SeekBar.OnSeekBarChangeListener onSeekBarChangeListener;
public ThumbTextSeekBar(Context context) {
super(context);
init();
}
public ThumbTextSeekBar(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
LayoutInflater.from(getContext()).inflate(R.layout.view_thumb_text_seekbar, this);
setOrientation(LinearLayout.VERTICAL);
tvThumb = (ThumbTextView) findViewById(R.id.tvThumb);
seekBar = (SeekBar) findViewById(R.id.sbProgress);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
if (onSeekBarChangeListener != null)
onSeekBarChangeListener.onStopTrackingTouch(seekBar);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
if (onSeekBarChangeListener != null)
onSeekBarChangeListener.onStartTrackingTouch(seekBar);
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (onSeekBarChangeListener != null)
onSeekBarChangeListener.onProgressChanged(seekBar, progress, fromUser);
tvThumb.attachToSeekBar(seekBar);
}
});
}
public void setOnSeekBarChangeListener(SeekBar.OnSeekBarChangeListener l) {
this.onSeekBarChangeListener = l;
}
public void setThumbText(String text) {
tvThumb.setText(text);
}
public void setProgress(int progress) {
if (progress == seekBar.getProgress() && progress == 0) {
seekBar.setProgress(1);
seekBar.setProgress(0);
} else {
seekBar.setProgress(progress);
}
}
}
最后,以如下方式使用它:
thumbTextSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
thumbTextSeekbar.setThumbText(seekBar.getProgress()));
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
thumbTextSeekbar.showTxt();
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
thumbTextSeekbar.hideTxt();
}
});
为了确保一切都完整,这里是R.layout.view_thumb_text_seekbar:
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<xxx.ui.widget.ThumbTextView
android:id="@+id/tvThumb"
style="@style/Textview.White.MediumSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/round_rect_black_trans"
android:padding="4dp"
android:visibility="gone" />
<SeekBar
android:id="@+id/sbProgress"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="-16dp"
android:layout_marginRight="-16dp"
android:layout_marginTop="5dp"
android:minHeight="20dp" />
</merge>
输出: