android:
id="@+id/sv"
android:
layout_width="fill_parent"
android:
layout_height="fill_parent"/>
android:
id="@+id/rl"
android:
layout_width="fill_parent"
android:
layout_height="fill_parent"
android:
visibility="visible">
android:
id="@+id/sbar"
style="?
android:
attr/progressBarStyleHorizontal"
android:
layout_width="fill_parent"
android:
layout_height="wrap_content"
android:
layout_alignParentBottom="true"
android:
max="100"
android:
progress="0"/>
android:
id="@+id/play"
android:
layout_width="wrap_content"
android:
layout_height="wrap_content"
android:
layout_centerHorizontal="true"
android:
layout_centerVertical="true"
android:
onClick="click"
android:
src="@android:
drawable/ic_media_pause"/>
上述代码中使用FrameLayout布局,在该布局下方放置一个SurfaceView控件,在SurfaceView上方添加一个SeekBar用于控制视频的进度,添加一个ImageView用于控制视频的播放与暂停。
2.2视频播放器实现具体内容
2.2.1创建控件实例与变量
publicclassMainActivityextendsActivityimplementsOnSeekBarChangeListener,
Callback{
privateSurfaceViewsv;
privateSurfaceHolderholder;
privateMediaPlayermediaplayer;
privateintposition;
privateRelativeLayoutrl;
privateTimertimer;
privateTimerTasktask;
privateSeekBarsbar;
privateImageViewplay;
2.2.2初始化计时器
timer=newTimer();
task=newTimerTask(){
@Override
publicvoidrun(){
if(mediaplayer!
=null&&mediaplayer.isPlaying()){
intprogress=mediaplayer.getCurrentPosition();
inttotal=mediaplayer.getDuration();
sbar.setMax(total);
sbar.setProgress(progress);
}
}
};
timer.schedule(task,500,500);
rl=(RelativeLayout)findViewById(R.id.rl);
holder=sv.getHolder();//得到SurfaceView的容器,界面内容是显示在容器里面的。
//过时的api,必须写,如果4.0以上的系统,不写完全没问题,4.0一下的系统必须要写
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//surfaceView被创建是需要花费一定的时间的。
//在oncreate方法执行的时候surfaceViewHolder还没有完全创建出来。
holder.addCallback(this);
}
2.2.3onTouchEvent()方法
publicvoidclick(Viewview){
if(mediaplayer!
=null&&mediaplayer.isPlaying()){
mediaplayer.pause();
play.setImageResource(android.R.drawable.ic_media_play);
}else{
mediaplayer.start();
play.setImageResource(android.R.drawable.ic_media_pause);
}
}
2.2.4SeekBar的回调方法
//进度发生变化时触发
@Override
publicvoidonProgressChanged(SeekBarseekBar,intprogress,
booleanfromUser){
}
//进度条开始拖动时触发
@Override
publicvoidonStartTrackingTouch(SeekBarseekBar){
}
//进度条拖动停止时触发
@Override
publicvoidonStopTrackingTouch(SeekBarseekBar){
intposition=seekBar.getProgress();
if(mediaplayer!
=null&&mediaplayer.isPlaying()){
mediaplayer.seekTo(position);
}
}
2.2.5SurfaceHolder的回调方法
publicvoidsurfaceCreated(SurfaceHolderholder){
try{
mediaplayer=newMediaPlayer();
mediaplayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
//mediaplayer.create(this,R.raw.hahaha);
mediaplayer.setDataSource("/sdcard/hahaha.mp4");
mediaplayer.setDisplay(holder);
mediaplayer.prepareAsync();
mediaplayer.setOnPreparedListener(newOnPreparedListener(){
@Override
publicvoidonPrepared(MediaPlayermp){
mediaplayer.start();
if(position>0){
mediaplayer.seekTo(position);
}
}
});
}catch(Exceptione){
Toast.makeText(MainActivity.this,"播放失败",0).show();
e.printStackTrace();
}
}
2.3运行效果模拟(手机运行)