Проблемы с пульсирующим вибратором

Я пытаюсь реализовать функцию в своем приложении, где он может пульсировать вибратором. Пользователь может изменить 3 вещи: силу вибрации, длительность импульса и время между импульсами, используя ползунки.

Я думал о каком-то коде, например:

for(i=0; i<(pulse length * whatever)+(pulse gap * whatever); i+=1){
pattern[i]=pulse length*i;
patern[i+1]=pulse gap;

Однако, когда я использую этот код (когда он сделан правильно, это всего лишь быстрый пример), это приводит к сбою приложения. Кроме того, когда я меняю силу вибрации (что действительно работает), мне приходится перезапускать службу, чтобы сила изменилась. Способ, которым я изменяю силу, заключается в изменении времени включения и выключения вибратора по шаблону.

Это код, который я использую для определения того, как должен вибрировать телефон (код здесь немного отличается от того, что я бы предпочел):

if (rb == 3){
    z.vibrate(constant, 0);
} else if (rb == 2){
     smooth[0]=0;
     for (int i=1; i<100; i+=2){
           double angle = (2.0 * Math.PI * i) / 100;
           smooth[i] = (long) (Math.sin(angle)*127);
           smooth[i+1]=10;
     }
     z.vibrate(smooth, 0);
} else if (rb == 1){
     sharp[0]=0;
     for(int i=0; i<10; i+=2){
            sharp[i] = s*pl;
            sharp[i+1] = s+pg;
     }
     z.vibrate(sharp, 0);
}
} else {
        z.cancel();
}

Если кто-нибудь может указать мне направление кода, который может это сделать, или как я могу заставить его работать, я был бы очень признателен.


person DingleNutZ    schedule 23.04.2012    source источник
comment
Пожалуйста, опубликуйте трассировку ошибки.   -  person Sam    schedule 23.04.2012


Ответы (1)


Единственное предположение, которое у меня есть, это то, что вы получаете сообщение об ошибке ArrayIndexOutOfBounds.

Если это так, вам нужно определить длину ваших long массивов, прежде чем пытаться их заполнить.

long[] OutOfBounds = new long[];
OutOfBounds[0] = 100;
// this is an error, it's trying to access something that does not exist.

long[] legit = new long[3];
legit[0] = 0;
legit[1] = 500;
legit[2] = 1000;
// legit[3] = 0; Again, this will give you an error. 

vibrate() — умная функция. Ни один из этих примеров не вызывает ошибку:

v.vibrate(legit, 0);
// vibrate() combines both legit[0] + legit[2] for the 'off' time

long tooLegit = new long[100];
tooLegit[0] = 1000;
tooLegit[1] = 500;
tooLegit[10] = 100;
tooLegit[11] = 2000;
v.vibrate(tooLegit, 0);
// vibrate() skips over the values you didn't define, ie long[2] = 0, long[3] = 0, etc

Надеюсь, это поможет.

person Sam    schedule 23.04.2012