|
ファイル名「Sound1Activity.java」 package and.roid.sound1; import android.app.Activity; import android.graphics.PixelFormat; import android.os.Bundle; import android.view.Display; import android.view.Window; import android.view.WindowManager; public class Sound1Activity extends Activity { public float disp_w,disp_h; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFormat(PixelFormat.TRANSLUCENT); Window window = getWindow(); getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); WindowManager manager = window.getWindowManager(); Display disp = manager.getDefaultDisplay(); disp_w = disp.getWidth(); disp_h = disp.getHeight(); setContentView(new MainLoop(this)); } //強制終了したら public void onStop(){ super.onPause(); System.exit(0); } } ファイル名「MainLoop.java」 package and.roid.sound1; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.media.MediaPlayer; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; public class MainLoop extends SurfaceView implements SurfaceHolder.Callback,Runnable{ private SurfaceHolder holder;//お決まり private Thread thread;//お決まり //どのActivityを使用しているかのための変数 private Sound1Activity s2a; private float disp_w,disp_h; //サウンド再生用ボタン2つ private Rect soundbtn1,soundbtn2; //再生サウンド3つ private MediaPlayer test1,test2,test3; //表示テキスト private String btnp = "PUSH再生"; private String str1 = "青いボタンを押せばtest1.mp3が再生されます"; private String str2 = "赤いボタンを押せばtest2.mp3が再生されます"; private String str3 = "常時test3.mp3が再生されています"; //コンストラクタが二つあるけど気にしないように //こちらのコンストラクタは、自前でViewを実装するときに //呼ばれるコンストラクタっぽい public MainLoop(Context context) { super(context); init(context); } //こちらはxml方式でViewを呼び出すときに呼ばれるぽい public MainLoop(Context context, AttributeSet attrs) { super(context, attrs); init(context); } public void init(Context context){ holder = getHolder();//お決まり holder.addCallback(this);//お決まり holder.setFixedSize(getWidth(), getHeight());//お決まり s2a = (Sound1Activity)context; disp_w = s2a.disp_w; disp_h = s2a.disp_h; //サウンド再生用ボタン用座標 soundbtn1 = new Rect(50,50,150,150); soundbtn2 = new Rect(300,50,400,150); //サウンド取り込み test1 = MediaPlayer.create(context, R.raw.test1); test2 = MediaPlayer.create(context, R.raw.test2); test3 = MediaPlayer.create(context, R.raw.test3); //test3だけ色々設定 //サウンドをループさせるかどうか設定しなければfalse(しない) test3.setLooping(true); // サウンド音量設定0.0から1.0で設定 test3.setVolume(0.5f, 0.5f); /* * サウンド使用準備 * サウンド取り込みと同時に設定すると * うまくいかなかったので別にしました */ try{ test1.prepare(); test2.prepare(); test3.prepare(); }catch (Exception e){} } //implements Runnableを実装するとこのメソッドが自動追加 //ここがメインループとなります public void run() {//お決まり Canvas c; Paint p = new Paint(); p.setAntiAlias(true); /* * ここでtest3だけ再生 * while文の中で再生してしまうとカオスなのでここで再生 */ playSound(test3); while(thread != null){ c = holder.lockCanvas();//お決まり c.drawColor(Color.BLACK); Soundbtn(c,p,Color.BLUE,soundbtn1); Soundbtn(c,p,Color.RED,soundbtn2); setTextDraw(c,p,str1,0,400,Color.WHITE,20); setTextDraw(c,p,str2,0,450,Color.WHITE,20); setTextDraw(c,p,str3,0,500,Color.WHITE,20); holder.unlockCanvasAndPost(c);//お決まり try { Thread.sleep(50);//お決まり } catch (Exception e){} } } //サウンド再生ボタン表示メソッド public void Soundbtn(Canvas c, Paint p,int col,Rect rec){ p.setColor(col); c.drawRect(rec, p); setTextDraw(c,p,btnp,rec.left,(rec.bottom-rec.top)/2,Color.WHITE,30); } //テキスト表示メソッド public void setTextDraw(Canvas c,Paint p,String str,int x,int y,int col,int size){ p.setColor(col); p.setTextSize(size); c.drawText(str, x, y, p); } public boolean onTouchEvent(MotionEvent event){ int action = event.getAction(); int x = (int)event.getX(); int y = (int)event.getY(); switch(action){ case MotionEvent.ACTION_DOWN: if(RectTap(x,y,soundbtn1)==true){ playSound(test1); } if(RectTap(x,y,soundbtn2)==true){ playSound(test2); } break; } return true; } /* * サウンド再生用メソッド * 停止などもしたい場合拡張できるように別メソッド * にしてみました */ public void playSound( MediaPlayer mp){ mp.seekTo(0); mp.start(); } public boolean RectTap(int x,int y,Rect gazou){ return gazou.left < x && gazou.top < y && gazou.right > x && gazou.bottom > y; } public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {}//お決まり public void surfaceCreated(SurfaceHolder arg0) {thread = new Thread(this);thread.start();}//お決まり public void surfaceDestroyed(SurfaceHolder arg0) {thread = null;}//お決まり } |
こんな感じです。 |
3つのサウンドファイルがあり、test1は青ボタン、test2は赤ボタン、test3はバックグラウンドで常時再生されます。 今回は停止する必要性がなかったのでtest3以外の2つは再生して自然に終了・・・て感じですね。もし停止する必要がある場合は、ちょっとした工夫が必要になるみたいです。停止メソッドは、test1.pause()、やtest1.stop()、あどがあるのですが、冒頭で書いた通りちょっとAndroidにはサウンド再生にクセがあるようで、メソッドを書いて試してみると、一旦停止すると再生できません。わたくしもボタン押す=再生、ボタン押す=停止をやってみたのですが最初はうまくいきませんでした。そこで停止する場合、 test1.setOnCompletionListener( null ); で停止させれば次回も再生されるようになるみたいです。意味?アハハハ・・ワケノワカラナイコトヲ・・・ しかしやってみるとわかると思うのですが、このメソッドを使っても、長文のtext2を再生>text1再生>text1停止 の順番でするとtext1が再生されない状態に陥ってしまいます。わけがわからないので今回の再生のみという形になりました。 そのうち使用するときにでももっと詳しく勉強することにします(逃げ) |