使用系统 Seekbar 来表示浮点数

作者: 未见哥哥 | 来源:发表于2017-12-04 23:47 被阅读600次

    使用 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 竖直显示。

    相关文章

      网友评论

        本文标题:使用系统 Seekbar 来表示浮点数

        本文链接:https://www.haomeiwen.com/subject/wwafixtx.html