2015-10-26 2 views
0

У меня есть массив ImageView, который ImageViews будет масштабироваться друг другом. Теперь я хочу воспроизвести короткий звук дина (продолжительность меньше минуты) на onAnimationStart анимации в цикле.soundPool не играет внутри цикла at onAnimationStart

Все работает правильно , но звук воспроизводится только для первого.

public void AnimationAtEnd() { 

    for (ck = 0; ck < totalCount; ck++) { 

      ScaleAnimation scale = new ScaleAnimation(0f, 1.6f,0f,1.6f, 
        Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); 

      scale.setInterpolator(new LinearInterpolator()); 
      scale.setStartOffset(ck * 600); 
      scale.setDuration(600); 
      scale.setAnimationListener(new Animation.AnimationListener() { 
       @Override 
       public void onAnimationStart(Animation animation) {  
         mySoundPool.play(2, 1, 1, 1, 0, 1);   
       } 

       @Override 
       public void onAnimationEnd(Animation animation) { 

       } 

       @Override 
       public void onAnimationRepeat(Animation animation) { 

       } 
      }); 

      images_cen[ck].startAnimation(scale); 

     } 
    } 
} 

и вот как я определить Soundpool и нагрузки звуков.

mySoundPool = new SoundPool(
       3, 
       AudioManager.STREAM_MUSIC, 
       0 
     ); 
    mySoundPool.load(this, R.raw.circuit, 1); 
    mySoundPool.load(this, R.raw.ding, 1); 
    mySoundPool.load(this, R.raw.block, 1); 

Как я могу это сделать ??? или В чем проблема ???

PS1:

OK я добавить soundPool.play() к onAnimationEnd и работать нормально. Таким образом, нет ничего плохого в soundPool. Я думаю, что это из анимационных сторон

+0

ok. Я добавляю soundPool.play на onAnimationEnd, и все работает нормально !!! есть ли разница между структурой onAnimationStart и onAnimationEnd? – behrooz

+0

Я не знаю, связано ли это с вашей проблемой, но есть ли причина, по которой вы выбрасываете «soundID», возвращаемые «SoundPool.load», а затем используя твердое значение 2 в качестве «soundID» в вашей 'play()' call? –

+0

@MattGibson Вы правы. Правильный способ - это ваше предложение, но есть только 3 :) было проще для hardcoding вместо использования звукового идентификатора! Спасибо – behrooz

ответ

1

onAnimationStart будет называться вскоре после images_cen[ck].startAnimation(scale);, даже если вы установите startOffset в Animation.

Я предлагаю вместо этого использовать Animator.

ObjectAnimator scale = ObjectAnimator.ofPropertyValuesHolder(images_cen[ck], 
        PropertyValuesHolder.ofFloat(View.SCALE_X, 0, 1.6f), 
        PropertyValuesHolder.ofFloat(View.SCALE_Y, 0, 1.6f) 
        ); 
scale.setInterpolator(new LinearInterpolator()); 
scale.setStartDelay(ck * 600); 
scale.setDuration(600); 
final View view = images_cen[ck]; 
scale.addListener(new Animator.AnimatorListener() { 
       @Override 
       public void onAnimationStart(Animator animation) { 
        view.setVisibility(View.VISIBLE); 
        mySoundPool.play(2, 1, 1, 1, 0, 1); 
       } 

       @Override 
       public void onAnimationEnd(Animator animation) { 

       } 

       @Override 
       public void onAnimationCancel(Animator animation) { 

       } 

       @Override 
       public void onAnimationRepeat(Animator animation) { 

       } 
      }); 
scale.start(); 
+0

Вы правы. проблема была именно в том, что вы говорите, но теперь, где я должен добавить 'images_cen [ck] .setVisibility (View.VISIBLE)'. Я хочу установить видимость при запуске анимации. – behrooz

+0

В 'onAnimationStart'. – shhp

+0

Я делаю это, но я получил ошибку, и я думаю, что ее из-за значения ck изменится при вызове onAnimationStart. он достигнет количества массива – behrooz

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