Как динамически разделить прогресс

Поскольку у нас есть панель поиска, мы можем установить ее setMax() и setProgress в значение seekBar..

 seekBar .setMax(audioManager
                    .getStreamMaxVolume(AudioManager.STREAM_MUSIC));
                 
 seekBar .setProgress(audioManager.getStreamVolume(AudioManager.STREAM_MUSIC));

Теперь я создал собственный вид с 1000 прогрессами, как я могу динамически разделить его на объем.

Я хочу установить максимальный объем и текущий прогресс в своем представлении. но он должен динамически обрабатывать 1000 процентов, потому что некоторые мобильные устройства имеют уровень громкости 13, а некоторые - 11 или меньше. Как я могу разделить их динамически.

как я могу распределить этот прогресс

Я также проверяю метод AbsSeekBar setMax

Предположим

у меня уровень громкости 10, затем, когда громкость достигает 100 или выше, я добавляю один уровень вверх, а для уровня громкости выше 200 перехожу на 2 и так далее.


person AndroidGeek    schedule 07.01.2015    source источник


Ответы (1)


Используйте Math.ceil для достижения это. Например, если бы я хотел преобразовать значение v в диапазоне [0,1000] в один из 13 различных дискретных уровней, я мог бы сделать что-то вроде

int level = (int) Math.ceil((v/1000.0) * 13)

(Использование здесь 1000,0 позволяет избежать целочисленного деления v/1000, возвращающего 0 для всех значений v в [0,1000].)

Тогда для этого случая:

  • v = 0 --> level = 0
  • v = 1000 --> level = 13
  • v = 437 --> level = (int) Math.ceil(5.681) = 6

и т. д. (Обратите внимание, что на самом деле это 14 уровней, если вы включите 0, поэтому вы можете использовать

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

чтобы получить n уровней. Также обратите внимание, что вместо Math.ceil можно использовать Math.floor и Math.round, в зависимости от того, как именно вы хотите сопоставить диапазон [0,1000] с каждым дискретным уровнем громкости.)

person stkent    schedule 07.01.2015
comment
Теперь я использую ту же формулу ((int)Math.ceil((progress/100.0) *15), но меняю 1000.0 на 100.0 И теперь она возвращает только 1 и 2. Можете ли вы объяснить мне, что использовать, когда, как вы сказали, что в некоторых случаях мы должны использовать Math.floor и Math.round Пожалуйста, объясните мне эту математическую технику. - person AndroidGeek; 15.01.2015
comment
Формула, которую вы упомянули в своем комментарии, должна давать целочисленные значения от 0 до 15, поскольку прогресс варьируется от 0,0 до 100,0. Если вы видите только значения 0, 1 и 2, возможно, прогресс варьируется только от 0,0 до 10,0 (поскольку 10,0/100 * 15 = 1,5 будет округлено до 2). - person stkent; 15.01.2015
comment
Что касается проблемы floor/round/ceil, вам не должно использоваться какое-либо конкретное значение — все они будут давать одни и те же целочисленные значения в качестве вывода. Какой из них вы используете, будет зависеть от того, как вы хотите обрабатывать значения прогресса около 0,0 и 1000,0 (или независимо от вашего текущего максимального входного значения). ceil будет иметь тенденцию к округлению, так что вы получите 0 выходных данных только в том случае, если входные данные равны 0,0. floor будет иметь тенденцию к округлению в меньшую сторону, поэтому вы получите 0 выходных данных для диапазона входных данных, близкого к 0,0 включительно. Раунд будет между этими двумя. Лучше всего поэкспериментировать с каждым, чтобы определить лучший выбор для UX. - person stkent; 15.01.2015
comment
большое спасибо, ваш код работает правильно. Я ошибочно назначаю ему другую переменную. Спасибо - person AndroidGeek; 15.01.2015