2015-01-07 2 views
0

Как мы SeekBar, мы можем установить его SetMax() и setProgress к SeekBar ..Как разделить Прогресс динамически

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

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

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

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

, как я мог бы распространить эти успехи

I also check AbsSeekBar setMax method

Пусть выполнено

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

ответ

2

Используйте 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.floor и Math.round могут использоваться вместо Math.ceil, в зависимости от того, как вы хотите отображать диапазон [0,1000] на каждый дискретный уровень громкости.)

+0

Теперь я использую ту же формулу ((int) Math. ceil ((progress/100.0) * 15), но измените 1000.0 на 100.0. И теперь он возвращается только 1 и 2. Можете ли вы объяснить мне, что использовать, когда, Как вы сказали, в некоторых случаях мы должны использовать Math.floor и Math.round.Пожалуйста, объясните мне этот математический метод. – Nepster

+0

Формула, которую вы укажете в своем комментарии, должна генерировать целочисленные значения от 0 до 15, поскольку прогресс варьируется от 0,0 до 100,0. Если вы видите только значения 0, 1 и 2, возможно, прогресс только от 0,0 до 10,0 (потому что 10,0/100 * 15 = 1,5 будет округлено до 2). – stkent

+0

Что касается вопроса 'floor' /' round'/'ceil', вы не _have_ нам e любой, в частности - все будут выдавать одинаковые целочисленные значения в качестве вывода. Какой из них вы будете использовать, будет зависеть от того, как вы хотите обрабатывать показатели прогресса около 0.0 и 1000.0 (или независимо от вашего текущего максимального входного значения). 'ceil' будет стремиться округлить, так что вы получите только 0 выход, если входной сигнал равен 0,0.'floor' будет стремиться округлить, так что вы получите 0 выход для ряда входов, близких к 0.0 и включая 0.0. Раунд будет между этими двумя. Лучше всего экспериментировать с каждым, чтобы определить лучший выбор для UX. – stkent