2013年1月14日 星期一

[Android]一個簡單.3gp播放器+撥放棒 的製作[中階實作]

其實算高階了 thread 還是搞不太懂
只能求助http://bbs.chinaunix.net/forum.php?mod=viewthread&action=printable&tid=3633893
但希望多實作多寫幾個範例就能夠比較熟了
接下來會希望把listview那邊再摸多一點其他類型的實作
ex.依照xml清單來決定list的數量+超過五個 就必須點按鈕↓往下看
若是第一到五筆則 ↑ 反黑不能按 這些應用
就可以玩SQLite跟網路socket還有activity互傳 and Broadcast
好多 好渺小的自己...

------------------------------------分隔線----------------------------------------------------

public class MainActivity extends Activity implements SurfaceHolder.Callback {
//一開始是先弄thread阿...這邊主要是把執行時間跟seekbar綁在一塊 這邊沒寫還是可以撥 但seekbar就不會work 但...就這邊還搞不懂 偏偏也最重要 Orz
public class DelayThread extends Thread{
int milliseconds;
public DelayThread(int i){
milliseconds=i;
}
public void run(){
while(true){
try{
sleep(milliseconds);
}catch(InterruptedException e){
e.printStackTrace();
}
handler.sendEmptyMessage(0);
}}}
//這邊是implements 一個interface 主要是控制seekbar在拖曳他的行為
簡單來說 如果拉seekbar影片會跟著進度調 跳樂播放就是弄這邊
class SeekBarChangeEvent implements OnSeekBarChangeListener{
@Override
public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2){
}
@Override
public void onStartTrackingTouch(SeekBar arg0){
isChanging=true;
}
@Override
public void onStopTrackingTouch(SeekBar arg0){
mp.seekTo(arg0.getProgress());
isChanging=false;
}
}
很可惜其實一開始的這兩個 也有點霧煞煞



//宣告這兩個將當成訊息傳遞出來時的訊號識別
protected static final int GUI_STOP_NOTIFIER = 0X108;
protected static final int GUI_THREADING_NOTIFIER = 0X109;



上一篇有寫過一些重複的了,現在寫了新的功能接起來

               //設定系統PixelFormat為未知
getWindow().setFormat(PixelFormat.UNKNOWN);
//SurfaceView的layout物件宣告
sfv = (SurfaceView)this.findViewById(R.id.sfv);
//設定surfaceholder為Layout surfaceview全螢幕
sfh = sfv.getHolder();
sfh.addCallback(this);
//原影片的size為176x144
sfh.setFixedSize(176,144);
sfh.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//宣告各項layout物件及seekbar
home = (ImageView)this.findViewById(R.id.home);
back = (ImageView)this.findViewById(R.id.back);
play = (ImageView)this.findViewById(R.id.play);
pause = (Button)this.findViewById(R.id.pause);
   stop = (Button)this.findViewById(R.id.stop);
   reset = (Button)this.findViewById(R.id.reset);
   play.setClickable(true);
home.setClickable(true);
back.setClickable(true);
pause.setEnabled(false);
stop.setEnabled(false);
reset.setEnabled(false);
sbar = (SeekBar)this.findViewById(R.id.sb);
sbar.setOnSeekBarChangeListener(new SeekBarChangeEvent());



//按下play呼叫事件
play.setOnClickListener(new OnClickListener(){
public void onClick(View view){
playvideo(playpath);


}});





//讓棒棒更新的thread,會呼叫上面的public class DelayThread extends Thread
handler = new Handler(){
public void handleMessage(Message msg){
                                //seekbar設定進度取得現在的進度
sbar.setProgress(mp.getCurrentPosition());
}};
DelayThread delaythread = new DelayThread(100);
   delaythread.start();



private void playvideo(String playpath){
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
stop.setEnabled(true);
reset.setEnabled(true);
//設定影片用sfh播放
if(!isPlay){
   mp.reset();
mp.setDisplay(sfh);
try {
mp.setDataSource(playpath);
mp.prepare();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
mp.start();
                //將seekbar長度對應影片的長度
sbar.setMax(mp.getDuration());
pause.setEnabled(true);
isPlay = true;
}else{

mp.start();


}
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

@Override
public void onCompletion(MediaPlayer mp) {
mp.release();
}});



心虛...










沒有留言:

張貼留言