Android seekbar具有自定义拇指,内置动态文本
我想创建一个android自定义Android seekbar具有自定义拇指,内置动态文本,android,seekbar,Android,Seekbar,我想创建一个android自定义SeekBar,它有一个拇指,拇指里面有文本来显示当前的搜索位置 这是我的密码: SeekBar sb; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.custom_seek_bar_activity); sb = (SeekBar)findVie
SeekBar
,它有一个拇指,拇指里面有文本来显示当前的搜索位置
这是我的密码:
SeekBar sb;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.custom_seek_bar_activity);
sb = (SeekBar)findViewById(R.id.slider);
sb.setMax(100);
sb.setProgress(10);
BitmapDrawable bd = writeOnDrawable(R.drawable.star2, Double.toString(50));
sb.setThumb(bd);
sb.setOnSeekBarChangeListener(new OnSeekBarChangeListener(){
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
{
int pos = sb.getProgress();
double star = pos/(20.0);
TextView tv = (TextView)findViewById(R.id.percent);
tv.setText(Double.toString(star)+"%");
BitmapDrawable bd = writeOnDrawable(R.drawable.star2, Double.toString(star));
bd.setBounds(new Rect(0,0,
bd.getIntrinsicWidth(),
bd.getIntrinsicHeight()
));
seekBar.setThumb(bd);
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {
// TODO Auto-generated method stub
}
@Override
public void onStopTrackingTouch(SeekBar arg0) {
// TODO Auto-generated method stub
}
});
}
public BitmapDrawable writeOnDrawable(int drawableId, String text){
Bitmap bm = BitmapFactory.decodeResource(getResources(), drawableId).copy(Bitmap.Config.ARGB_8888, true);
Paint paint = new Paint();
paint.setStyle(Style.FILL);
paint.setColor(Color.BLACK);
paint.setTextSize(10);
Canvas canvas = new Canvas(bm);
canvas.drawText(text, 0, bm.getHeight()/2, paint);
return new BitmapDrawable(bm);
}
但当我移动拇指时,它会转到搜索栏的开头。
有人有办法用seekbar位置移动自定义拇指吗?我现在有办法了,在
setBound()
方法中,我将左上角作为0
传递,这就是为什么它在开始时显示搜索栏。在做了以下改变后,我让它工作了
调用onProgressChanged()
事件中的setThumbPos()
方法
public void setThumbPosition(SeekBar seekBar){
int max = seekBar.getMax();
int available = seekBar.getWidth() - seekBar.getPaddingLeft() - seekBar.getPaddingRight();
float scale = max > 0 ? (float) seekBar.getProgress() / (float) max : 0;
//scale = 1;
int pos = sb.getProgress();
double star = pos/(20.0);
BitmapDrawable bd = writeOnDrawable(R.drawable.star2, Double.toString(star));
int thumbWidth = bd.getIntrinsicWidth();
int thumbHeight = bd.getIntrinsicHeight();
//available -= thumbWidth;
int thumbPos = (int) (scale * available);
if(thumbPos <= 0+thumbWidth){
thumbPos += (thumbWidth/2);
}else if(thumbPos >= seekBar.getWidth()-thumbWidth){
thumbPos -= (thumbWidth/2);
}
bd.setBounds(new Rect(thumbPos,0,
thumbPos+bd.getIntrinsicWidth(),
bd.getIntrinsicHeight()
));
seekBar.setThumb(bd);
TextView tv = (TextView)findViewById(R.id.percent);
tv.setText(Double.toString(star)+"%");
}
public void setThumbPosition(SeekBar-SeekBar){
int max=seekBar.getMax();
int available=seekBar.getWidth()-seekBar.getPaddingLeft()-seekBar.getPaddingRight();
浮动比例=最大值>0?(浮动)请参见kbar.getProgress()/(浮动)最大值:0;
//比例=1;
int pos=sb.getProgress();
双星=位置/(20.0);
BitmapDrawable bd=writeOnDrawable(R.drawable.star2,Double.toString(star));
int thumbWidth=bd.getIntrinsicWidth();
int thumbHeight=bd.getIntrinsicHeight();
//可用-=指宽;
int thumbPos=(int)(刻度*可用);
if(thumbPos=seekBar.getWidth()-thumbWidth){
拇指位置-=(拇指宽度/2);
}
bd.setBounds(新矩形)(拇指位置,0,
thumbPos+bd.getIntrinsicWidth(),
bd.getIntrinsicHeight()
));
seekBar.setThumb(bd);
TextView tv=(TextView)findViewById(R.id.percent);
tv.setText(Double.toString(星形)+“%”;
}
我使用SeekBar在我的应用程序中显示计时器倒计时。在计时器拇指中,我使用以下代码显示当前SeekBar进度编号:
SeekBar timerBar = (SeekBar) findViewById(R.id.seekBarTimer);
if (timerBar != null) {
timerBar.setMax((int) (Settings.countdownSeconds + 1));
timerBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar arg0) {
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {
}
@Override
public void onProgressChanged(SeekBar timerBar, int arg1, boolean arg2) {
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.seek_thumb);
Bitmap bmp = bitmap.copy(Bitmap.Config.ARGB_8888, true);
Canvas c = new Canvas(bmp);
String text = Integer.toString(timerBar.getProgress());
Paint p = new Paint();
p.setTypeface(Typeface.DEFAULT_BOLD);
p.setTextSize(14);
p.setColor(0xFFFFFFFF);
int width = (int) p.measureText(text);
int yPos = (int) ((c.getHeight() / 2) - ((p.descent() + p.ascent()) / 2));
c.drawText(text, (bmp.getWidth()-width)/2, yPos, p);
timerBar.setThumb(new BitmapDrawable(getResources(), bmp));
}
});
timerBar.setProgress(0);
}
R.drawable.seek\u thumb drawable是我的thumb drawable。我最终使用了这个简单的解决方案。它的性能可能不如一个合适的定制SeekBar那么高,但是它很容易插入到现有的布局中,并在SeekBar拇指上使用任何标签或其他视图
protected void positionThumbLabel(SeekBar seekBar, TextView label)
{
Rect tr = seekBar.getThumb().getBounds();
label.setWidth(tr.width());
label.setX(tr.left + seekBar.getPaddingLeft());
}
通过一些细微的更改,您可以相对于拇指中心定位覆盖:
protected void positionThumbOverlayCenter(SeekBar seekBar, View overlay)
{
Rect tr = seekBar.getThumb().getBounds();
overlay.setX(tr.centerX() - (overlay.getWidth() * 0.5f) + seekBar.getPaddingLeft());
}
在此处选择与您的情况相匹配的解决方案:链接已断开。你能提供一个替代方案吗?