Произвольно генерировать звук из событий onClick и onShake? - PullRequest
1 голос
/ 11 мая 2010

Я буквально посмотрел везде в сети и нашел очень мало разъяснение о том, как это сделать. В общем, у меня есть 8 звуковых файлов, расположенных в файле array.xml, и я нужно воспроизвести случайно выбранный файл ОДНАЖДЫ за или onClick или onShake. Прежде всего, какую технику я должен использовать для достижения этой цели? ARRAY-> RANDOM-

string-> ИГРАТЬ? СЛУЧАЙНО INT-> ИГРАТЬ? СЛУЧАЙНО INT-> STRING-> PLAY? Любой вид

направления очень поможет, потому что я стою почти 3 недели исследовать это.

* Примечание: MediaPlayer mp = MediaPlayer.create (JelloMan.this, R.raw.sound) ... это то, что я застрял в том, что ты не можешь заменить часть "R.raw" строкой ...

Вот весь код.

package com.cyphasignals.jelloman;

import java.util.Random;

import android.app.Activity;
import android.hardware.SensorManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;

public class JelloMan extends Activity {
/** Called when the activity is first created. */

   @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);        

    private final int NUM_SOUND_FILES = 3;
    //Modifier invalid here 
    private int mfile[] = new mfile[NUM_SOUND_FILES];
    //Modifier invalid here and SECOND "mfile" is wanting to create a class
    private Random rnd = new Random(3);
    //Modifier invalid here 
        mfile[0] = R.raw.sound1;
        mfile[1] = R.raw.sound2;
        mfile[2] = R.raw.sound3;
    int sndToPlay = rnd.nextInt(NUM_SOUND_FILES);

   ShakeListener MyShake = new ShakeListener((SensorManager) 
getSystemService(SENSOR_SERVICE)); 
    MyShake.setForceThreshHold(4.0); 
    MyShake.setOnShakeListener(new ShakeListener.OnShakeListener() {

        MediaPlayer mp = MediaPlayer.create(JelloMan.this, mfile[sndToPlay]);
        //[sndToPlay] wants me to change the modifier
         public void onShake() {
             mp.seekTo(0);
             mp.start();                 
         } 
    });
    ImageButton mouthbutton = (ImageButton)findViewById(R.id.billmouth);
    mouthbutton.setOnClickListener(new OnClickListener() {

        MediaPlayer mp = MediaPlayer.create(JelloMan.this, 
                mfile[sndToPlay]);
            //[sndToPlay] wants me to change the modifier
        public void onClick(View v) {
            mp.seekTo(0);
            mp.start(); 
            }
    });

} 
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {

    if (keyCode == KeyEvent.KEYCODE_BACK) {
        finish();
        return true;
    };
    return false;
}

}

Ответы [ 3 ]

2 голосов
/ 11 мая 2010

в полупсевдо-коде:

private final int NUM_SOUND_FILES = 3;

private int mSndFiles[] = new int[NUM_SOUND_FILES];
private Random rnd = new Random();   //import java.util.Random for this

mSndFiles[0] = R.raw.sound1;
mSndFiles[1] = R.raw.sound2;
mSndFiles[2] = R.raw.sound3;

int sndToPlay = rnd.nextInt(NUM_SOUND_FILES);

MediaPlayer mp = MediaPlayer.create(JelloMan.this, mSndFiles[sndToPlay]);

Если все имеющиеся у вас звуковые файлы невелики и вы хотите иметь низкую задержку, рассмотрите возможность использования SoundPool вместо MediaPlayer.

РЕДАКТИРОВАТЬ: Я не хотел, чтобы вы просто скопировали и вставили код выше в свое приложение, я предполагал, что вы разместите вещи в нужных местах. В любом случае, попробуйте это, запишите мои комментарии в коде. Я не проверял это и предполагаю, что вы также определили класс ShakeListener где-то еще, но это должно сработать.

package com.cyphasignals.jelloman;

import java.util.Random;
import android.app.Activity;
import android.hardware.SensorManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;

import com.cyphasignals.R;

public class JelloMan extends Activity {

    private final int NUM_SOUND_FILES = 3;  //*****REPLACE THIS WITH THE ACTUAL NUMBER OF SOUND FILES YOU HAVE*****

    private int mfile[] = new int[NUM_SOUND_FILES];
    private Random rnd = new Random();
    private MediaPlayer mp;

   @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);        

        mfile[0] = R.raw.sound1;  //****REPLACE THESE WITH THE PROPER NAMES OF YOUR SOUND FILES
        mfile[1] = R.raw.sound2;  //PLACE THE SOUND FILES IN THE /res/raw/ FOLDER IN YOUR PROJECT*****
        mfile[2] = R.raw.sound3;

       ShakeListener MyShake = new ShakeListener((SensorManager.getSystemService(SENSOR_SERVICE)); 
       MyShake.setForceThreshHold(4.0); 
       MyShake.setOnShakeListener(new ShakeListener.OnShakeListener() {
          public void onShake() {
             mp = MediaPlayer.create(JelloMan.this, mfile[rnd.nextInt(NUM_SOUND_FILES)]);
             mp.seekTo(0);
             mp.start();                 
       }});

       ImageButton mouthbutton = (ImageButton)findViewById(R.id.billmouth);
       mouthbutton.setOnClickListener(new OnClickListener() {
          public void onClick(View v) {
             mp = MediaPlayer.create(JelloMan.this, mfile[rnd.nextInt(NUM_SOUND_FILES)]);
             mp.seekTo(0);
             mp.start(); 
       }});

   } 
   @Override
   public boolean onKeyDown(int keyCode, KeyEvent event)  {
      if (keyCode == KeyEvent.KEYCODE_BACK) {
         finish();
         return true;
      }
   return false;
   }
}

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

1 голос
/ 04 октября 2010

Храните звуки так:

    private static final int[] SOUNDS = new int[] {
    R.drawable.abort,  R.drawable.aliens, R.drawable.annoying, R.drawable.better, 
    R.drawable.birth_control, R.drawable.bitchin, R.drawable.book_em, R.drawable.clean_up, 
    R.drawable.come_on, R.drawable.cry, R.drawable.damn_it, R.drawable.damn, R.drawable.game_over,
    R.drawable.good, R.drawable.gotta_hurt, R.drawable.hail, R.drawable.holy_cow, R.drawable.holy_sh,
    R.drawable.let_god, R.drawable.name, R.drawable.play, R.drawable.terminated,
    R.drawable.this_sux, R.drawable.ugly, R.drawable.wasted, R.drawable.you_suck,
    R.drawable.you_suck2, R.drawable.you_will_die
};

и вы можете играть в нее:

 int sndToPlay = rnd.nextInt(SOUNDS.length);
           MediaPlayer mp = MediaPlayer.create(main.this, SOUNDS[sndToPlay] );
         mp.seekTo(0);
         mp.start();  

это работа для меня

1 голос
/ 11 мая 2010

ну .. исходя из того что я понял из твоего вопроса ....

R.raw.sound является целым числом, поэтому, конечно, вы не можете заменить его строковым значением. почему бы вам не создать массив int и поместить в него каждый звуковой файл ... такие как ниже ...

file [0] = R.raw.sound_0 file [1] = R.raw.sound_1 : : : файл [n] = R.raw.sound_n

и теперь все, что вам нужно сделать, это получить случайное значение от 0 до n ....

MediaPlayer mp = MediaPlayer.create (JelloMan.this, файл [random_value]);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...