package com.anthony.videolistplayer; import android.app.Activity; import android.content.Context; import android.content.pm.ActivityInfo; import android.graphics.Bitmap; import android.graphics.PointF; import android.graphics.Rect; import android.media.AudioManager; import android.os.Handler; import android.os.Message; import android.util.DisplayMetrics; import android.util.Log; import android.view.MotionEvent; import android.view.Surface; import android.view.View; import android.widget.ImageView; import android.widget.MediaController; import android.widget.ProgressBar; import android.widget.SeekBar; import android.widget.TextView; import com.anthony.videolistplayer.media.IMediaController; import com.anthony.videolistplayer.media.IjkVideoView; import tv.danmaku.ijk.media.player.IMediaPlayer; /** * @Description ${控制器} */ public class CustomMediaContoller implements IMediaController { private static final int SET_VIEW_HIDE = 1; private static final int TIME_OUT = 5000; private static final int MESSAGE_SHOW_PROGRESS = 2; private static final int PAUSE_IMAGE_HIDE=3; private View itemView; private View view; private boolean isShow; private IjkVideoView videoView; private boolean isScroll; private SeekBar seekBar; AudioManager audioManager; private ProgressBar progressBar; private boolean isSound; private boolean isDragging; private boolean isPause; private boolean isShowContoller; private ImageView sound, full, play; private TextView time, allTime; private PointF lastPoint; private Context context; private ImageView pauseImage; private Bitmap bitmap; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case SET_VIEW_HIDE: isShow = false; itemView.setVisibility(View.GONE); break; case MESSAGE_SHOW_PROGRESS: setProgress(); if (!isDragging && isShow) { msg = obtainMessage(MESSAGE_SHOW_PROGRESS); sendMessageDelayed(msg, 1000); } break; case PAUSE_IMAGE_HIDE: pauseImage.setVisibility(View.GONE); break; } } }; public CustomMediaContoller(Context context, View view) { this.view=view; itemView = view.findViewById(R.id.media_contoller); this.videoView = (IjkVideoView) view.findViewById(R.id.main_video); itemView.setVisibility(View.GONE); isShow = false; isDragging = false; isShowContoller=true; this.context=context; audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); initView(); initAction(); } public void initView() { progressBar = (ProgressBar) view.findViewById(R.id.loading); seekBar = (SeekBar) itemView.findViewById(R.id.seekbar); allTime = (TextView) itemView.findViewById(R.id.all_time); time = (TextView) itemView.findViewById(R.id.time); full = (ImageView) itemView.findViewById(R.id.full); sound = (ImageView) itemView.findViewById(R.id.sound); play = (ImageView) itemView.findViewById(R.id.player_btn); pauseImage = (ImageView) view.findViewById(R.id.pause_image); } public void start() { pauseImage.setVisibility(View.GONE); itemView.setVisibility(View.GONE); play.setImageResource(R.mipmap.video_stop_btn); progressBar.setVisibility(View.VISIBLE); } public void pause(){ play.setImageResource(R.mipmap.video_play_btn); videoView.pause(); bitmap = videoView.getBitmap(); if (bitmap != null) { pauseImage.setImageBitmap(bitmap); pauseImage.setVisibility(View.VISIBLE); } } public void reStart(){ play.setImageResource(R.mipmap.video_stop_btn); videoView.start(); if (bitmap != null) { handler.sendEmptyMessageDelayed(PAUSE_IMAGE_HIDE,100); bitmap.recycle(); bitmap = null; // pauseImage.setVisibility(View.GONE); } } private long duration; private void initAction() { isSound = false; seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { String string = generateTime((long) (duration * progress * 1.0f / 100)); time.setText(string); } @Override public void onStartTrackingTouch(SeekBar seekBar) { setProgress(); isDragging = true; audioManager.setStreamMute(AudioManager.STREAM_MUSIC, true); handler.removeMessages(MESSAGE_SHOW_PROGRESS); show(); handler.removeMessages(SET_VIEW_HIDE); } @Override public void onStopTrackingTouch(SeekBar seekBar) { isDragging = false; videoView.seekTo((int) (duration * seekBar.getProgress() * 1.0f / 100)); handler.removeMessages(MESSAGE_SHOW_PROGRESS); audioManager.setStreamMute(AudioManager.STREAM_MUSIC, false); isDragging = false; handler.sendEmptyMessageDelayed(MESSAGE_SHOW_PROGRESS, 1000); show(); } }); itemView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { Rect seekRect = new Rect(); seekBar.getHitRect(seekRect); if((event.getY() >= (seekRect.top-50)) && (event.getY()<= (seekRect.bottom+50))){ float y = seekRect.top + seekRect.height()/2; //seekBar only accept relative x float x = event.getX()-seekRect.left; if(x <0) { x=0; } else if(x > seekRect.width()) { x= seekRect.width(); } MotionEvent me = MotionEvent.obtain(event.getDownTime(), event.getEventTime(), event.getAction(), x, y, event.getMetaState()); return seekBar.onTouchEvent(me); } return false; } }); videoView.setOnInfoListener(new IMediaPlayer.OnInfoListener() { @Override public boolean onInfo(IMediaPlayer mp, int what, int extra) { Log.e("setOnInfoListener",what+""); switch (what) { case IMediaPlayer.MEDIA_INFO_BUFFERING_START: //开始缓冲 if (progressBar.getVisibility()==View.GONE) progressBar.setVisibility(View.VISIBLE); break; case IMediaPlayer.MEDIA_INFO_BUFFERING_END: //开始播放 progressBar.setVisibility(View.GONE); break; case IMediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START: // statusChange(STATUS_PLAYING); progressBar.setVisibility(View.GONE); break; case IMediaPlayer.MEDIA_INFO_AUDIO_RENDERING_START: progressBar.setVisibility(View.GONE); break; } return false; } }); sound.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (isSound) { //静音 sound.setImageResource(R.mipmap.sound_mult_icon); audioManager.setStreamMute(AudioManager.STREAM_MUSIC, true); } else { //取消静音 sound.setImageResource(R.mipmap.sound_open_icon); audioManager.setStreamMute(AudioManager.STREAM_MUSIC, false); } isSound = !isSound; } }); play.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (videoView.isPlaying()) { pause(); } else { reStart(); } } }); full.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.e("full","full"); if (getScreenOrientation((Activity) context) == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) { ((Activity)context).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } else { ((Activity)context).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } } }); } public void setShowContoller(boolean isShowContoller) { this.isShowContoller = isShowContoller; handler.removeMessages(SET_VIEW_HIDE); itemView.setVisibility(View.GONE); } public int getScreenOrientation(Activity activity) { int rotation = activity.getWindowManager().getDefaultDisplay().getRotation(); DisplayMetrics dm = new DisplayMetrics(); activity.getWindowManager().getDefaultDisplay().getMetrics(dm); int width = dm.widthPixels; int height = dm.heightPixels; int orientation; // if the device's natural orientation is portrait: if ((rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) && height > width || (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) && width > height) { switch (rotation) { case Surface.ROTATION_0: orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; break; case Surface.ROTATION_90: orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; break; case Surface.ROTATION_180: orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; break; case Surface.ROTATION_270: orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; break; default: orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; break; } } // if the device's natural orientation is landscape or if the device // is square: else { switch (rotation) { case Surface.ROTATION_0: orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; break; case Surface.ROTATION_90: orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; break; case Surface.ROTATION_180: orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; break; case Surface.ROTATION_270: orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; break; default: orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; break; } } return orientation; } @Override public void hide() { if (isShow) { handler.removeMessages(MESSAGE_SHOW_PROGRESS); isShow = false; handler.removeMessages(SET_VIEW_HIDE); itemView.setVisibility(View.GONE); } } @Override public boolean isShowing() { return isShow; } @Override public void setAnchorView(View view) { } @Override public void setEnabled(boolean enabled) { } @Override public void setMediaPlayer(MediaController.MediaPlayerControl player) { } @Override public void show(int timeout) { handler.sendEmptyMessageDelayed(SET_VIEW_HIDE, timeout); } @Override public void show() { if (!isShowContoller) return; isShow = true; progressBar.setVisibility(View.GONE); itemView.setVisibility(View.VISIBLE); handler.sendEmptyMessage(MESSAGE_SHOW_PROGRESS); show(TIME_OUT); } @Override public void showOnce(View view) { } private String generateTime(long time) { int totalSeconds = (int) (time / 1000); int seconds = totalSeconds % 60; int minutes = (totalSeconds / 60) % 60; int hours = totalSeconds / 3600; return hours > 0 ? String.format("%02d:%02d:%02d", hours, minutes, seconds) : String.format("%02d:%02d", minutes, seconds); } public void setVisiable(){ show(); } private long setProgress() { if (isDragging) { return 0; } long position = videoView.getCurrentPosition(); long duration = videoView.getDuration(); this.duration = duration; if (!generateTime(duration).equals(allTime.getText().toString())) allTime.setText(generateTime(duration)); if (seekBar != null) { if (duration > 0) { long pos = 100L * position / duration; seekBar.setProgress((int) pos); } int percent = videoView.getBufferPercentage(); seekBar.setSecondaryProgress(percent); } String string = generateTime((long) (duration * seekBar.getProgress() * 1.0f / 100)); time.setText(string); return position; } private VedioIsPause vedioIsPause; public interface VedioIsPause { void pause(boolean pause); } public void setPauseImageHide(){ pauseImage.setVisibility(View.GONE); } }