新年一発目の訓練!
三が日だけどバンバンコード書くぜ!
っていうか年末年始家でほとんどPCに向かってたZE!!
では早速新年初訓練アプリ。
目次
サブ画面で入力させたテキストをメイン画面に表示するアプリ
一発目なのでまるっとメイン&サブのコード載せちゃう。
メイン
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
import 色々; public class MainActivity extends Activity { public static final int RC = 1; TextView tv; Button btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findView(); addEvent(); } private void findView() { tv = (TextView) findViewById(R.id.textView1); btn = (Button) findViewById(R.id.button1); } private void addEvent() { btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, SubActivity.class); intent.putExtra("string", tv.getText().toString()); startActivityForResult(intent, RC); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode==RC && resultCode==RESULT_OK) { tv.setText(data.getStringExtra("edit")); } } } |
サブ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
import 色々; public class SubActivity extends Activity { EditText et; Button btn; String string; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sub); findView(); addEvent(); } private void findView() { et = (EditText) findViewById(R.id.editText1); btn = (Button) findViewById(R.id.button1); Intent intent = this.getIntent(); string = intent.getStringExtra("string"); if (string.equals("ここに編集画面で入力した内容が表示されます")) { et.setHint(string); } else { et.setText(string); } } private void addEvent() { btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.putExtra("edit", et.getText().toString()); setResult(RESULT_OK, intent); finish(); } }); } } |
メインで最初に表示されている文字列の時はその文字列がヒントになるように条件分岐。一度でも入力したら相互に文字列を引き継ぐ。
音を出す
音声ファイルはwav,ogg推奨(一部端末ではmp3に不具合があるらしい)
resにrawフォルダを作ってそこに鳴らせたい音を格納する。
レイアウト
コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
import 色々; public class MainActivity extends Activity { Button btn; SeekBar sb; SoundPool sp; int sound_id; float vol = 0.5F; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findView(); loodSp(); addEvent(); } private void findView() { btn = (Button) findViewById(R.id.button1); sb = (SeekBar) findViewById(R.id.seekBar1); sb.setMax(10); sb.setProgress(5); } private void loodSp() { sp = new SoundPool(1, AudioManager.STREAM_MUSIC, 0); sp.setOnLoadCompleteListener(new OnLoadCompleteListener() { @Override public void onLoadComplete(SoundPool soundPool, int sampleId, int status) { Toast.makeText(MainActivity.this, "soundOK", Toast.LENGTH_SHORT).show(); } }); sound_id = sp.load(this, R.raw.ファイル名, 1); } private void addEvent() { sb.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { vol = progress/10F; } }); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { sp.play(sound_id, vol, vol, 0, 0, 1.0F); } }); } @Override protected void onPause() { super.onPause(); sp.release(); } } |
SoundPool
オーディオリソースを管理、再生するクラス。
一つのインスタンスで複数の音声を再生できる。
再生時間の短い効果音などに向いている。
BGM等の長い音を流すならMediaPlayerクラスを使うといいらしい。
コンストラクタは下記の通り。
public SoundPool(int maxStreams, int streamType, int srcQuality)
- 第一引数:ロードするファイルの最大数(maxStreams)
- 第二引数:ストリームのタイプ(streamType)
通常はSTREAM_MUSIC(音楽再生用ストリーム)を利用する。
その他にSTREAM_ALARM,STREAM_DTMF,STREAM_NOTIFICATION,STREAM_RING,STREAM_SYSTEM,STREAM_VOICE_CALLがある。 - 第三引数:サンプリングレートのクオリティ(リファレンスによると現在は効果が無いとのことなのでデフォルト値として0を使用するよう勧告されている)
setOnLoadCompleteListener
public void setOnLoadCompleteListener(OnLoadCompleteListener listener)
ロード完了通知を受け取る為のリスナー。
抽象メソッドonLoadCompleteはロード完了時に呼び出される。
今回はToastを呼び出している。onLoadCompleteの引数が気になる方はコチラで。
load
public int load(Context context, int resId, int priority)
音楽ファイルをロードするメソッド。
- 第一引数:context
- 第二引数:リソースID(リファレンスにも書いてあるが拡張子が削除されることに注意する example.wavの場合はR.raw.example)
- 第三引数:音の優先順位。現在は効果が無いが将来の互換性のために1を指定しておくようにリファレンスに書いてある。
再生時に戻り値を指定する為、sound_idに代入している。
今回は1ファイルだけしかロードしていないので1。
play
public final int play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)
音楽を再生するメソッド。
- 第一引数:loadによって返された戻り値
- 第二引数:左の音量(範囲:0.0~1.0)
- 第三引数:右の音量(範囲は左に同じ)
- 第四引数:優先度(0が最も高い)
- 第五引数:ループ(0はループしない、1は無限ループ)
- 第六引数:再生速度(範囲:0.5~2.0,1.0が等倍)
release
SoundPoolを解放するメソッド。
SoundPoolオブジェクトに使用されているメモリとネイティブリソースを全て解放する。
ライフサイクル的にOnPauseで行うのが好ましいらしい。
いちいち突っ込んで調べるのって労力いるね・・・・
今後は詳細はしょるかも・・・・
コメント
No Trackbacks.