/procameralibrary/src/main/java/com/eighteengray/procameralibrary/video/VideoPlayerContainer.java

https://github.com/18Gray/ProCamera · Java · 211 lines · 172 code · 27 blank · 12 comment · 2 complexity · ca9ab0fccb4cc8cc0208f9a0c46c9b83 MD5 · raw file

  1. package com.eighteengray.procameralibrary.video;
  2. import java.io.IOException;
  3. import java.text.SimpleDateFormat;
  4. import java.util.Date;
  5. import java.util.Locale;
  6. import android.content.Context;
  7. import android.media.MediaPlayer;
  8. import android.os.Handler;
  9. import android.os.SystemClock;
  10. import android.util.AttributeSet;
  11. import android.view.MotionEvent;
  12. import android.view.View;
  13. import android.widget.ImageView;
  14. import android.widget.LinearLayout;
  15. import android.widget.SeekBar;
  16. import android.widget.SeekBar.OnSeekBarChangeListener;
  17. import android.widget.TextView;
  18. import android.view.View.OnClickListener;
  19. import com.eighteengray.procameralibrary.R;
  20. public class VideoPlayerContainer extends LinearLayout implements
  21. OnClickListener, VideoPlayerView.PlayerListener, IVideoPlayerOperation
  22. {
  23. private final static String TAG = "VideoPlayerContainer";
  24. private VideoPlayerView mVideoPlayerView;
  25. private LinearLayout mBottomBar;
  26. private TextView mCurrentTimeView;
  27. private TextView mDurationView;
  28. private ImageView mPauseButton;
  29. private SeekBar mProgressBar;
  30. private Handler mHandler;
  31. private SimpleDateFormat mTimeFormat;
  32. public VideoPlayerContainer(Context context, AttributeSet attrs)
  33. {
  34. super(context, attrs);
  35. initView(context);
  36. mHandler = new Handler();
  37. mTimeFormat = new SimpleDateFormat("mm:ss", Locale.getDefault());
  38. }
  39. private void initView(Context context)
  40. {
  41. inflate(context, R.layout.video_bottom_bar, this);
  42. mVideoPlayerView = (VideoPlayerView) findViewById(R.id.videoPlayerView);
  43. mVideoPlayerView.setPalyerListener(this);
  44. mBottomBar = (LinearLayout) findViewById(R.id.llVideoDetailPlayerBottom);
  45. mCurrentTimeView = (TextView) mBottomBar
  46. .findViewById(R.id.tvVideoPlayTime);
  47. mDurationView = (TextView) mBottomBar
  48. .findViewById(R.id.tvVideoPlayRemainTime);
  49. mPauseButton = (ImageView) mBottomBar
  50. .findViewById(R.id.btnVideoPlayOrPause);
  51. mProgressBar = (SeekBar) mBottomBar
  52. .findViewById(R.id.sbVideoDetailPlayer);
  53. mPauseButton.setOnClickListener(this);
  54. mProgressBar.setOnSeekBarChangeListener(onSeekBarChangeListener);
  55. }
  56. OnSeekBarChangeListener onSeekBarChangeListener = new OnSeekBarChangeListener()
  57. {
  58. @Override
  59. public void onStopTrackingTouch(SeekBar seekBar)
  60. {
  61. seekPosition(seekBar.getProgress() * 1000);
  62. }
  63. @Override
  64. public void onStartTrackingTouch(SeekBar seekBar)
  65. {
  66. pausedPlay();
  67. }
  68. @Override
  69. public void onProgressChanged(SeekBar seekBar, int progress,
  70. boolean fromUser)
  71. {
  72. mCurrentTimeView.setText(mTimeFormat.format(new Date(
  73. progress * 1000)));
  74. }
  75. };
  76. @Override
  77. public void playVideo(String path) throws IllegalArgumentException,
  78. SecurityException, IllegalStateException, IOException
  79. {
  80. mVideoPlayerView.playVideo(path);
  81. }
  82. @Override
  83. public void onCompletion(MediaPlayer mp)
  84. {
  85. // 播放结束,隐藏该控件
  86. setVisibility(View.GONE);
  87. mProgressBar.setProgress(0);
  88. mCurrentTimeView.setText("00:00");
  89. mp.reset();
  90. }
  91. @Override
  92. public void onSeekComplete(MediaPlayer mp)
  93. {
  94. // 跳转至指定时间后,恢复播放
  95. resumePlay();
  96. }
  97. @Override
  98. public boolean onTouchEvent(MotionEvent event)
  99. {
  100. // 由于在使用了framelayout布局,为了防止点击事件下发给下方的view,在此处捕获掉点击事件。
  101. return true;
  102. }
  103. @Override
  104. public void onPrepared(MediaPlayer mp)
  105. {
  106. // 准备播放,显示该控件
  107. setVisibility(View.VISIBLE);
  108. int duration = mp.getDuration();
  109. // 设置最大事件,单位秒
  110. mDurationView.setText(mTimeFormat.format(new Date(duration)));
  111. mProgressBar.setMax((int) Math.floor(duration / 1000));
  112. mp.start();
  113. mHandler.removeCallbacks(null, null);
  114. mHandler.post(playerRunnable);
  115. }
  116. Runnable playerRunnable = new Runnable()
  117. {
  118. @Override
  119. public void run()
  120. {
  121. // TODO Auto-generated method stub
  122. if (mVideoPlayerView.isPlaying())
  123. {
  124. int current = getCurrentPosition();
  125. current = (int) Math.floor(current / 1000);
  126. mProgressBar.setProgress(current);
  127. mHandler.postAtTime(this, mCurrentTimeView,
  128. SystemClock.uptimeMillis() + 500);
  129. }
  130. }
  131. };
  132. @Override
  133. public void onClick(View v)
  134. {
  135. if (mVideoPlayerView.isPlaying())
  136. {
  137. pausedPlay();
  138. } else
  139. {
  140. resumePlay();
  141. }
  142. }
  143. /**
  144. * 恢复播放
  145. */
  146. @Override
  147. public void resumePlay()
  148. {
  149. mVideoPlayerView.resumePlay();
  150. mHandler.removeCallbacks(null, null);
  151. mHandler.postDelayed(playerRunnable, 500);
  152. mPauseButton.setImageResource(R.drawable.video_detail_player_pause);
  153. }
  154. /**
  155. * 暂停播放
  156. */
  157. @Override
  158. public void pausedPlay()
  159. {
  160. mVideoPlayerView.pausedPlay();
  161. mPauseButton.setImageResource(R.drawable.video_detail_player_start);
  162. }
  163. @Override
  164. public void seekPosition(int position)
  165. {
  166. mVideoPlayerView.seekPosition(position);
  167. }
  168. @Override
  169. public void stopPlay()
  170. {
  171. mVideoPlayerView.stopPlay();
  172. setVisibility(View.GONE);
  173. }
  174. @Override
  175. public boolean isPlaying()
  176. {
  177. return mVideoPlayerView.isPlaying();
  178. }
  179. @Override
  180. public int getCurrentPosition()
  181. {
  182. return mVideoPlayerView.getCurrentPosition();
  183. }
  184. }