Android 如何动态划分进度

Android 如何动态划分进度,android,android-custom-view,android-seekbar,Android,Android Custom View,Android Seekbar,因为我们有seekbar,所以可以将其setMax()和setProgress设置为seekbar seekBar .setMax(audioManager .getStreamMaxVolume(AudioManager.STREAM_MUSIC)); seekBar .setProgress(audioManager.getStreamVolume(AudioManager.STREAM_MUSIC)); 现在

因为我们有seekbar,所以可以将其setMax()和setProgress设置为seekbar

 seekBar .setMax(audioManager
                    .getStreamMaxVolume(AudioManager.STREAM_MUSIC));
                 
 seekBar .setProgress(audioManager.getStreamVolume(AudioManager.STREAM_MUSIC));
现在我已经创建了一个自定义视图,它有1000个进度,我如何动态地为卷划分它呢

我想将最大音量和当前进度设置为我的视图。但它必须动态处理1000个百分比,因为有些手机的音量级别为13,有些手机的音量级别为11或更少。我如何动态地划分它们

我如何分配这些进度

假设

我有10个音量级别,当音量达到100或更大时,我加上一个音量级别,如果音量级别超过200,则转到2,依此类推。

使用以实现此目的。例如,如果我想将[01000]范围内的值
v
转换为13个不同离散级别中的一个,我可以执行以下操作

int level = (int) Math.ceil((v/1000.0) * 13)
(此处使用1000.0可避免整数除法
v/1000
对[01000]中的所有v值返回0。)

那么,对于这种情况:

  • v
    =0-->
    级别
    =0
  • v
    =1000-->
    级别
    =13
  • v
    =437-->
    level
    =
    (int)Math.ceil(5.681)
    =6
等等。(注意,如果包含0,则实际上是14个级别,因此您可能希望使用

int level = (int) Math.ceil((v/1000.0) * (n-1))

获取
n
级别。还要注意的是
Math.floor
Math.round
可以用来代替
Math.ceil
,具体取决于您希望如何将范围[01000]映射到每个离散的音量级别。

现在我使用相同的公式((int)Math.ceil((progress/100.0)*15)但是将1000.0改为100.0,现在它只返回1和2,你能解释一下什么时候使用吗,正如你所说的,在某些情况下,我们必须使用Math.floor和Math.round。请解释一下这种数学技巧。你在评论中提到的公式应该产生0到15之间的整数值,因为进度在0.0到100之间变化。0.如果只看到值0、1和2,则进度可能仅在0.0和10.0之间变化(因为10.0/100*15=1.5将四舍五入为2)。至于
floor
/
round
/
ceil
问题-您不必特别使用任何一个-所有问题都将产生与输出相同的整数值。使用哪一个将取决于您希望如何处理接近0.0和1000.0的进度值(或当前最大输入值)
ceil
将趋向于向上取整,因此,如果输入正好为0.0,您将只获得0输出。
floor
将趋向于向下取整,因此对于接近并包括0.0的一系列输入,您将获得0输出。取整将介于这两者之间。最好的做法是对每个输入进行实验,以确定UX的最佳选择。感谢l您的代码运行正常。我错误地为它分配了另一个变量。谢谢