|
|
ファイル名「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が再生されない状態に陥ってしまいます。わけがわからないので今回の再生のみという形になりました。 そのうち使用するときにでももっと詳しく勉強することにします(逃げ) |
Androidプログラミング日記 (仮)

