android制作视频播放器,用SurfaceView和MediaPlayer做一个Android视频播放器
public classVideoView extendsFrameLayout implementsView.OnClickListener,SeekBar.OnSeekBarChangeListener{privateSurfaceView surfaceView;privateMediaPlayer mediaPlayer=null;privateRelativeLayout pauseLa
public classVideoView extendsFrameLayout implementsView.OnClickListener,SeekBar.OnSeekBarChangeListener{
privateSurfaceView surfaceView;privateMediaPlayer mediaPlayer=null;privateRelativeLayout pauseLayout;privateTextView titleView;privateImageButton pauseButton;privateSeekBar seekBar;privateTextView progressDes;privateTextView progressTotal;privateImageButton fullScreen;privateTimer timer;privateTimerTask timeTask;private booleanpauseLayoutIsHide=true;privateUri uri;private booleanisFullScreen=false;privateHandler handler= newHandler(Looper.getMainLooper(), newHandler.Callback() {
@Overridepublic booleanhandleMessage(Message msg) {
if(msg.what==1)
progressDes.setText((String) msg.obj);else if(msg.what==2)
{
pauseLayout.setVisibility(INVISIBLE);pauseLayoutIsHide= true;}
return true;}
});publicVideoView(Context context) {
super(context);}
publicVideoView(Context context,AttributeSet attrs) {
super(context,attrs);}
publicVideoView(Context context,AttributeSet attrs, intdefStyleAttr) {
super(context,attrs,defStyleAttr);}
public voidinitUI()
{
surfaceView= (SurfaceView) findViewById(R.id.video_surface);pauseLayout= (RelativeLayout) findViewById(R.id.pause_layout);pauseButton= (ImageButton) findViewById(R.id.pause_btn);titleView= (TextView) findViewById(R.id.video_tv_title);seekBar= (SeekBar) findViewById(R.id.video_seekbar);progressDes= (TextView) findViewById(R.id.video_tv_progress);progressTotal= (TextView) findViewById(R.id.video_tv_progress_total);fullScreen= (ImageButton) findViewById(R.id.video_full_screen);pauseButton.setOnClickListener(this);surfaceView.setOnClickListener(this);fullScreen.setOnClickListener(this);seekBar.setOnSeekBarChangeListener(this);}
private intautoHideCount=0;public voidinitData(String url,String title) {
titleView.setText(title);uri= Uri.parse(url);SurfaceHolder surfaceHolder =surfaceView.getHolder();surfaceHolder.addCallback(newSurfaceHolder.Callback() {
@Overridepublic voidsurfaceCreated(finalSurfaceHolder holder) {
MainActivity.log("创建");try{
if(mediaPlayer==null) {
mediaPlayer= newMediaPlayer();mediaPlayer.reset();mediaPlayer.setDataSource(getContext(),uri);mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);mediaPlayer.prepare();}//设置mediaPlayer与当前surfaceView关联一起,这里是非全屏mediaPlayer.setDisplay(holder);} catch(IOException e) {
e.printStackTrace();}
intmax=mediaPlayer.getDuration();progressTotal.setText(getTime(max));seekBar.setMax(max);//定时器更新进度条timer=newTimer();timeTask=newTimerTask() {
@Overridepublic voidrun() {
if(mediaPlayer.isPlaying()) {
intcurrent = mediaPlayer.getCurrentPosition();seekBar.setProgress(current);handler.obtainMessage(1,getTime(current)).sendToTarget();}//自动隐藏布局隔4*500=两秒if(!pauseLayoutIsHide)
{
if(autoHideCount>4)
{
handler.obtainMessage(2,null).sendToTarget();}
autoHideCount++;}
else{
autoHideCount=0;}
}
};timer.schedule(timeTask,0,500);}
@Overridepublic voidsurfaceChanged(SurfaceHolder holder, intformat, intwidth, intheight) {
}
@Overridepublic voidsurfaceDestroyed(SurfaceHolder holder) {
//非全屏状态下销毁MediaPlayer,比如上下移动if(mediaPlayer!=null&&mediaPlayer.isPlaying()&&!isFullScreen) {
currentPosition=mediaPlayer.getCurrentPosition();mediaPlayer.stop();mediaPlayer.release();mediaPlayer=null;timer.cancel();timeTask.cancel();timer=null;timeTask=null;}
}
});}
public voidagainInitData(MediaPlayer media)
{
mediaPlayer=media;initUI();SurfaceHolder surfaceHolder =surfaceView.getHolder();surfaceHolder.addCallback(newSurfaceHolder.Callback() {
@Overridepublic voidsurfaceCreated(finalSurfaceHolder holder) {
//mediaPlayer.reset();//设置全屏sufracemediaPlayer.setDisplay(holder);intmax = mediaPlayer.getDuration();progressTotal.setText(getTime(max));seekBar.setMax(max);//定时器更新进度条timer= newTimer();timeTask= newTimerTask() {
@Overridepublic voidrun() {
if(mediaPlayer.isPlaying()) {
intcurrent = mediaPlayer.getCurrentPosition();seekBar.setProgress(current);handler.obtainMessage(1,getTime(current)).sendToTarget();}
if(!pauseLayoutIsHide) {
if(autoHideCount> 4) {
handler.obtainMessage(2, null).sendToTarget();}
autoHideCount++;} else{
autoHideCount= 0;}
}
};timer.schedule(timeTask,0,500);}
@Overridepublic voidsurfaceChanged(SurfaceHolder holder, intformat, intwidth, intheight) {
}
@Overridepublic voidsurfaceDestroyed(SurfaceHolder holder) {
if(mediaPlayer!=null&&mediaPlayer.isPlaying()) {
currentPosition=mediaPlayer.getCurrentPosition();//全屏和缩小屏共用一个MediaPlayer所以不能全屏surfaceview销毁时释放mediaplayer// mediaPlayer.stop();// mediaPlayer.release();mediaPlayer=null;timer.cancel();timeTask.cancel();timer=null;timeTask=null;}
}
});}
publicString getTime(intmillSeconds)
{
intseconds =millSeconds/1000;intminutes =seconds/60;intsecond = seconds%60;inthour = minutes/60;intminute =minutes%60;StringBuilder stringBuilder =newStringBuilder();if(hour!=0)
{
if(hour<10)
{
stringBuilder.append("0");}
stringBuilder.append(hour);stringBuilder.append(":");}
else{
stringBuilder.append("00:");}
if(minute!=0)
{
if(minute<10) {
stringBuilder.append("0");}
stringBuilder.append(minute);stringBuilder.append(":");}
else{
stringBuilder.append("00:");}
if(second!=0)
{
if(second<10)
{
stringBuilder.append("0");}
stringBuilder.append(second);}
else{
stringBuilder.append("00");}
returnstringBuilder.toString();}
@Overridepublic voidonClick(View v) {
switch(v.getId())
{
caseR.id.video_surface:
if(pauseLayoutIsHide) {
pauseLayout.setVisibility(VISIBLE);pauseLayoutIsHide=false;}
else{
pauseLayout.setVisibility(INVISIBLE);pauseLayoutIsHide=true;}
break;caseR.id.pause_btn:
if(mediaPlayer.isPlaying())
mediaPlayer.pause();else{
mediaPlayer.start();pauseLayout.setVisibility(INVISIBLE);pauseLayoutIsHide=false;}
break;caseR.id.video_full_screen:
Intent intent = newIntent(MainActivity.activityContext,VideoActivity.class);VideoActivity.mediaPlayer= mediaPlayer;isFullScreen=true;MainActivity.activityContext.startActivity(intent);break;}
}
private intcurrentPosition;@Overridepublic voidonProgressChanged(SeekBar seekBar, intprogress, booleanfromUser) {
currentPosition= progress;}
@Overridepublic voidonStartTrackingTouch(SeekBar seekBar) {
}
@Overridepublic voidonStopTrackingTouch(SeekBar seekBar) {
mediaPlayer.seekTo(currentPosition);}
}
更多推荐
所有评论(0)