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);}

}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐