package com.eighteengray.procameralibrary.video; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import android.content.Context; import android.media.MediaPlayer; import android.os.Handler; import android.os.SystemClock; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; import android.view.View.OnClickListener; import com.eighteengray.procameralibrary.R; public class VideoPlayerContainer extends LinearLayout implements OnClickListener, VideoPlayerView.PlayerListener, IVideoPlayerOperation { private final static String TAG = "VideoPlayerContainer"; private VideoPlayerView mVideoPlayerView; private LinearLayout mBottomBar; private TextView mCurrentTimeView; private TextView mDurationView; private ImageView mPauseButton; private SeekBar mProgressBar; private Handler mHandler; private SimpleDateFormat mTimeFormat; public VideoPlayerContainer(Context context, AttributeSet attrs) { super(context, attrs); initView(context); mHandler = new Handler(); mTimeFormat = new SimpleDateFormat("mm:ss", Locale.getDefault()); } private void initView(Context context) { inflate(context, R.layout.video_bottom_bar, this); mVideoPlayerView = (VideoPlayerView) findViewById(R.id.videoPlayerView); mVideoPlayerView.setPalyerListener(this); mBottomBar = (LinearLayout) findViewById(R.id.llVideoDetailPlayerBottom); mCurrentTimeView = (TextView) mBottomBar .findViewById(R.id.tvVideoPlayTime); mDurationView = (TextView) mBottomBar .findViewById(R.id.tvVideoPlayRemainTime); mPauseButton = (ImageView) mBottomBar .findViewById(R.id.btnVideoPlayOrPause); mProgressBar = (SeekBar) mBottomBar .findViewById(R.id.sbVideoDetailPlayer); mPauseButton.setOnClickListener(this); mProgressBar.setOnSeekBarChangeListener(onSeekBarChangeListener); } OnSeekBarChangeListener onSeekBarChangeListener = new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { seekPosition(seekBar.getProgress() * 1000); } @Override public void onStartTrackingTouch(SeekBar seekBar) { pausedPlay(); } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { mCurrentTimeView.setText(mTimeFormat.format(new Date( progress * 1000))); } }; @Override public void playVideo(String path) throws IllegalArgumentException, SecurityException, IllegalStateException, IOException { mVideoPlayerView.playVideo(path); } @Override public void onCompletion(MediaPlayer mp) { // 播放结束,隐藏该控件 setVisibility(View.GONE); mProgressBar.setProgress(0); mCurrentTimeView.setText("00:00"); mp.reset(); } @Override public void onSeekComplete(MediaPlayer mp) { // 跳转至指定时间后,恢复播放 resumePlay(); } @Override public boolean onTouchEvent(MotionEvent event) { // 由于在使用了framelayout布局,为了防止点击事件下发给下方的view,在此处捕获掉点击事件。 return true; } @Override public void onPrepared(MediaPlayer mp) { // 准备播放,显示该控件 setVisibility(View.VISIBLE); int duration = mp.getDuration(); // 设置最大事件,单位秒 mDurationView.setText(mTimeFormat.format(new Date(duration))); mProgressBar.setMax((int) Math.floor(duration / 1000)); mp.start(); mHandler.removeCallbacks(null, null); mHandler.post(playerRunnable); } Runnable playerRunnable = new Runnable() { @Override public void run() { // TODO Auto-generated method stub if (mVideoPlayerView.isPlaying()) { int current = getCurrentPosition(); current = (int) Math.floor(current / 1000); mProgressBar.setProgress(current); mHandler.postAtTime(this, mCurrentTimeView, SystemClock.uptimeMillis() + 500); } } }; @Override public void onClick(View v) { if (mVideoPlayerView.isPlaying()) { pausedPlay(); } else { resumePlay(); } } /** * 恢复播放 */ @Override public void resumePlay() { mVideoPlayerView.resumePlay(); mHandler.removeCallbacks(null, null); mHandler.postDelayed(playerRunnable, 500); mPauseButton.setImageResource(R.drawable.video_detail_player_pause); } /** * 暂停播放 */ @Override public void pausedPlay() { mVideoPlayerView.pausedPlay(); mPauseButton.setImageResource(R.drawable.video_detail_player_start); } @Override public void seekPosition(int position) { mVideoPlayerView.seekPosition(position); } @Override public void stopPlay() { mVideoPlayerView.stopPlay(); setVisibility(View.GONE); } @Override public boolean isPlaying() { return mVideoPlayerView.isPlaying(); } @Override public int getCurrentPosition() { return mVideoPlayerView.getCurrentPosition(); } }