2014-06-19 3 views
0

Я пишу приложение, использующее распознавание речи Android.Анимация начинается только после завершения распознавания речи

В моей RecognitionListener у меня есть что-то вроде этого:

@Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) 
public void onRmsChanged(float rmsdB) 
{ 
    if(mSpeakButtonBorder == null) mSpeakButtonBorder = (ImageView) findViewById(R.id.SpeakButtonBorder); 
    // Should continue growing in size each time onRmsChanged is called. 
    Animation animation = new ScaleAnimation(mSpeakButtonBorder.getScaleX(), mSpeakButtonBorder.getScaleX() + 0.1f, mSpeakButtonBorder.getScaleY(), mSpeakButtonBorder.getScaleY() + 0.1f); 
    animation.setDuration(1000); 
    animation.setFillAfter(true); 
    mSpeakButtonBorder.startAnimation(animation); 
} 

Почему анимация только начать после распознавания вернулся с результатом?

ответ

1

OnRmsChanged() обычно будет получать вызов, пока происходит распознавание речи. Поскольку вы установили fillAfter в true и продолжительность анимации до 1000 мс.

Так вы infact, , начиная новую анимацию в каждом вызове OnRmsChanged() (называемый каждые несколько мс или даже чаще) до того, как анимация на самом деле заканчивается. Теперь проблема в том, что применяемые преобразования НЕ применяются к представлению, они просто преобразуют способ его рисования.

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

Так что, когда вы используете якобы ток Scalex в следующий раз, он фактически приводит то же значение, что и оригинального (который 1,0).

Вы можете использовать ObjectAnimator для анимации, который фактически применяет преобразования к представлению или самостоятельно вычисляет относительные значения шкалы ввода, а затем передает их в ScaleAnimation.

+0

Использование ObjectAnimator, похоже, имеет такой же эффект. –

+0

Вы поставили журналы, чтобы проверить значения, возвращаемые getScaleX? –

+0

Возможно также, что OnRmsChanged получает вызов слишком часто, чтобы позволить фреймворку выполнить анимацию. Попробуйте вместо этого включить OnBufferReceived или может быть в OnPartialResults. –

Смежные вопросы