使用 Seekbar 来表示小数
需求来源
我们在日常开发中使用 seekbar 时可能更多的是表示整型数据的拖动条,但是在某一些场合如果数据类型是浮点数的话呢,我们该怎么办?
分析
我们都知道系统提供的 Seekbar 类的进度值 progress 是整型的,它无法表示浮点型数据。但是我们可以巧妙的利用系统的 API 实现 seekbar 表示浮点类型,具体看下面的代码片段。
Seekbar 表示整型数据
SeekBar seekBar = (SeekBar) findViewById(R.id.seekbar);
seekBar.setMax(5);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
Log.e("TAG","当前进度值:"+progress);
}
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
};
通过以上这段代码运行之后滑动 seekbar 会打印当前的进度值 progress。
当前进度值:0
当前进度值:1
当前进度值:2
当前进度值:3
当前进度值:4
当前进度值:5
使用 Seekbar 表示浮点型数据
先看看需求:使用 seekbar 表示 [0-1] 之间的值,保留 1 位小数。
我们看了 Seekbar 表示整型数据时,会在回调方法中 onProgressChanged 回调当前的 progress 值,那么我们能不能在这个方法做处理呢?
答案是可以的:因为 progress 不能设置浮点数,那么我们可以将每一个数放大 10 倍,不就可以表示在 seekbar 了吗?具体过程看下面
解决方案:
- 设置 Seekbar 最大值为 10
- 在 onProgressChanged 方法中,将 progress 值除 10 那么就可以得到 [0-1] 之间的值了
SeekBar seekBar = (SeekBar) findViewById(R.id.seekbar);
seekBar.setMax(5);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
Log.i("TAG","当前进度值:"+progress);
float value = convertProgress(progress);
Log.i("TAG","转化后的值:"+value);
}
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
};
private float convertProgress(int intVal) {
float result;
//这里/10 是因为前面每一个数都扩大10倍,因此这里需要/10还原
result = intVal/10f;
return result;
}
打印的结果值:
当前进度值:0
转化后的值:0
当前进度值:1
转化后的值:0.1
当前进度值:2
转化后的值:0.2
当前进度值:3
转化后的值:0.3
当前进度值:4
转化后的值:0.4
当前进度值:5
转化后的值:0.5
总结
这种方式是借助回调方法,在回调方法中处理 progress 的值,可以巧妙的将浮点数的值使用 seekbar 来表示。
好了,文章就分享到这里,下一篇分享一下如何让水平排版的 seekbar 竖直显示。