前言
这段时间公司要做视频播放的项目,之前没有任何这方面的相关经验,经过多方查阅写出来一个demo,相对而言还是比较完整的,在这边记录一下,顺便能够帮助更多的人来学习视频的播放,也顺便作为自己的一个笔记。
源码下载地址:
http://download.csdn.net/download/huang3513/9776971
首先看一下效果图:
1.首先要在SDCard中放置一个视频文件(咱们示例本地的视频播放)
String path = Environment.getExternalStorageDirectory().getAbsolutePath()+"/cjyx.mp4";
2.由于使用源生的VideoView在播放的时候,屏幕会出现空白的情况,为了从新测量屏幕的尺寸我们自定义一个VideoView,其实就是重写onMeasure()方法。
/**
* @author :huangxianfeng on 2017/3/9.
* 自定义一个VideoView
*/
public class CustomVideoView extends VideoView{
int defaultWidth = 1920;
int defaultHeight = 1080;
public CustomVideoView(Context context) {
super(context);
}
public CustomVideoView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomVideoView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
/**
* 测量方法
* 作用是强行设置他的宽度和高度
* @param widthMeasureSpec
* @param heightMeasureSpec
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = getDefaultSize(defaultWidth,widthMeasureSpec);
int height = getDefaultSize(defaultHeight,heightMeasureSpec);
setMeasuredDimension(width, height);
}
}
3.由于我们在改变屏幕的亮度和改变音量的大小,我们要根据手势在屏幕上的滑动距离来判断,所以我要拿到屏幕的尺寸、音量、和亮度的最大值和当前值。
/**
* 获取的当前的屏幕的宽度和高度
*/
screen_width = getResources().getDisplayMetrics().widthPixels;
screen_hright = getResources().getDisplayMetrics().heightPixels;
/**
* 当前设备的最大音量
*/
int streamMaxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
/**
* 获取设备的当前音量
*/
int streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
//屏幕的当前亮度
WindowManager.LayoutParams attributes = getWindow().getAttributes();
mBrightness = attributes.screenBrightness;//当前的亮度
4.视频播放我们避免不了会横屏播放视频,那么在播放时,会遇到从竖屏变换到横屏的时候,每次视频都会从头开始播放,因为在横竖屏切换的时候,系统把Activity给销毁了,并创建了一个新的Activity播放导致。
但在Manifest.xml中注册Activity的时,添加属性:
android:configChanges="orientation|screenSize|keyboard|keyboardHidden"
即可避免Activity的销毁。
但仅仅是上面的那些还是不够的,我们接下来要监听横竖屏的改变,当屏幕发生改变的时候,我们进行相对于的屏幕设置:
/**
* 1.此系统方法是监听屏幕的改变
* 监听到屏幕的方向的改变
* @param newConfig
*/
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
/**
* 当屏幕方向为横屏的时候
*/
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
setVideoViewScale(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);
volume_img.setVisibility(View.VISIBLE);
volume_seek.setVisibility(View.VISIBLE);
isFullScreen = true;
//移出半屏的状态
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
//设置全屏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
}else{//为竖屏的时候
setVideoViewScale(ViewGroup.LayoutParams.MATCH_PARENT, ScreenUtil.getInstance().px2Dp(MainActivity.this, 240));
volume_img.setVisibility(View.GONE);
volume_seek.setVisibility(View.GONE);
isFullScreen = false;
//设置全屏
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
//移出半屏的状态
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
}
}
5.如效果图所示,左下角有一个播放进度时间,还一个总时间,实现方法的计算如下代码:
/**
* 时间格式的转换 并设置播放时间和总时间
* @param textview
* @param millsecond
*/
private void updateTextViewWithTimeFormat(TextView textview,int millsecond){
int second = millsecond/1000;
int hh = second/3600;//小时
int mm = second%3600/60;//分钟
int ss = second%60;//秒
String str = null;
if (hh!=0){
str = String.format("%02d:%02d:%02d",hh,mm,ss);
}else{
str = String.format("%02d:%02d",mm,ss);
}
textview.setText(str);
}
上面代码还要依赖一个对屏幕宽度和高度重新赋值的方法:
/**
* 对屏幕宽度和高度从新赋值
* @param width
* @param height
*/
private void setVideoViewScale(int width,int height){
ViewGroup.LayoutParams layoutParams = mVideoView.getLayoutParams();
layoutParams.width = width;
layoutParams.height = height;
mVideoView.setLayoutParams(layoutParams);
ViewGroup.LayoutParams layoutParams1 = videoLayout.getLayoutParams();
layoutParams1.width = width;
layoutParams1.height = height;
videoLayout.setLayoutParams(layoutParams1);
}
6.在不断更新时间变换时,我们采用Handler自己更新自己的方式,来实现时间进度的变换:
/**
* 实时更新视频的时间
*/
private Handler UIHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == UPDATEUI) {
//获取视频当前的播放时间
int currentPosition = mVideoView.getCurrentPosition();
//获取视频播放的总时间
int totalDuration = mVideoView.getDuration();
//格式化视频播放时间
updateTextViewWithTimeFormat(tiem_current_tv,currentPosition);
updateTextViewWithTimeFormat(time_total_tv,totalDuration);
//设置视频总时间
play_seek.setMax(totalDuration);
play_seek.setProgress(currentPosition);
//自己更新自己来实现UI时间界面的更新
UIHandler.sendEmptyMessageDelayed(UPDATEUI,500);
}
}
};
7.然后播放进度时,我们可以通过对SeekBar的监听,来拖动视频的播放进度:
/**
* Seekbar设置监听事件
*/
play_seek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
updateTextViewWithTimeFormat(tiem_current_tv, progress);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
UIHandler.removeMessages(UPDATEUI);
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
int progress = seekBar.getProgress();
//另视频播放的进度遵循SeekBar停止拖动的这一刻进度
mVideoView.seekTo(progress);
UIHandler.sendEmptyMessage(UPDATEUI);
}
});
8.如上我们获取到了屏幕亮度和音量的大小接下来我们就可以根据对VideoView的手势监听setOnTouchListener来控制亮度和音量:
/**
* 控制VideoView的手势事件
*/
mVideoView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
float x = event.getX();
float y = event.getY();
Log.e("Main", "x=" + x + ";y=" + y);
// float lastX=0, lastY=0;
switch (event.getAction()) {
/**
* 手指落下屏幕的那一刻调用(只调用一次)
*/
case MotionEvent.ACTION_DOWN:
lastX = x;
lastY = y;
break;
/**
* 手指在屏幕上移动(调用多次)
*/
case MotionEvent.ACTION_MOVE:
//计算偏移量
float detlaX = x - lastX;
float detlaY = y - lastY;
//计算滑动时x轴和y轴的偏移量的绝对值
float absdetlaX = Math.abs(detlaX);
float absdetlaY = Math.abs(detlaY);
//滑动的绝对值与之前设定的临界值进行比较
if (absdetlaX > threshold && absdetlaY > threshold) {
if (absdetlaX < absdetlaY) {//y轴大于x轴的滑动,滑动是有效的
isAdjust = true;
} else {
isAdjust = false;
}
} else if (absdetlaX < threshold && absdetlaY > threshold) {
isAdjust = true;
} else if (absdetlaX > threshold && absdetlaY < threshold) {
isAdjust = false;
}
Log.e("Main", "手势是否合法" + isAdjust);
if (isAdjust) {
/**
* 在判断当前手势是否和发的情况下,去区分此时的手势是调节亮度还是调节音量
*/
if (x < screen_width / 2) {
/**
* 调节亮度
*/
// if (detlaY > 0) {
// /**
// * 降低亮度
// */
//// Log.e("Main", "降低亮度" + detlaY);
// } else {
// /**
// * 升高亮度
// */
//// Log.e("Main", "升高亮度" + detlaY);
// }
changeBrightness(-detlaY);
} else {
// /**
// * 调节音量
// */
// if (detlaY > 0) {
// /**
// * 减小音量
// */
//// Log.e("Main", "减小音量" + detlaY);
// } else {
// /**
// * 增加音量
// */
//// Log.e("Main", "增加音量" + detlaY);
// }
changeVolume(-detlaY);
}
}
lastX = x;
lastY = y;
break;
/**
* 手指离开屏幕的那一刻(调用一次)
*/
case MotionEvent.ACTION_UP:
//抬起的时候进行对调节亮度的和音量的图标进行隐藏
progress_layout.setVisibility(View.GONE);
break;
}
return true;
}
});
根据手势判断出用户左屏幕和右屏幕,再判断出上滑还是下滑来实现音量的改变(此方法包含音量图标的显示和隐藏):
/**
* 改变音量
*/
private void changeVolume(float detlaY){
//最大
int max = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
//当前音量
int current = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
int index = (int)(detlaY/screen_hright*max*3);
int volume =Math.max(current + index, 0);
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, volume, 0);
//当处于隐藏状态的时候,进行显示
if (progress_layout.getVisibility() == View.GONE){
progress_layout.setVisibility(View.VISIBLE);
}
/**
* 1.设置音量图标的显示
* 2.并且从新进行参数的设置
*/
operation_bg.setImageResource(R.drawable.video_volume_bg);
ViewGroup.LayoutParams layoutParams = operation_percent.getLayoutParams();
layoutParams.width = (int) (ScreenUtil.getInstance().dp2Px(MainActivity.this,94)*(float)volume/max);
operation_percent.setLayoutParams(layoutParams);
volume_seek.setProgress(volume);
}
根据手势判断出用户左屏幕和右屏幕,再判断出上滑还是下滑来实现亮度的改变(此方法包含亮度图标的显示和隐藏):
/**
* 改变屏幕的显示亮度
* @param detlaY
*/
private void changeBrightness(float detlaY){
WindowManager.LayoutParams attributes = getWindow().getAttributes();
mBrightness = attributes.screenBrightness;//当前的亮度
float index = detlaY/screen_hright/3;
mBrightness +=index;
if (mBrightness > 1.0f){
mBrightness= 1.0f;
}
if (mBrightness < 0.01f){
mBrightness= 0.01f;
}
attributes.screenBrightness = mBrightness;
//当处于隐藏状态的时候,进行显示
if (progress_layout.getVisibility() == View.GONE){
progress_layout.setVisibility(View.VISIBLE);
}
/**
* 1.设置亮度图标的显示
* 2.并且从新进行参数的设置
*/
operation_bg.setImageResource(R.drawable.video_brightness_bg);
ViewGroup.LayoutParams layoutParams = operation_percent.getLayoutParams();
layoutParams.width = (int) (ScreenUtil.getInstance().dp2Px(MainActivity.this,94)*mBrightness);
operation_percent.setLayoutParams(layoutParams);
getWindow().setAttributes(attributes);
}
以上是对主要方法的介绍,那么贴出主Activity的所有代码如下:
/**
* @author :huangxianfeng on 2017/3/9.
* 自定义视频播放器
* 说明:以下这行代码可以实现,在横竖屏切换的时候,Activity不进行销毁,而是继续变换之前的进度播放
* android:configChanges="orientation|screenSize|keyboard|keyboardHidden"
*/
public class MainActivity extends Activity {
private CustomVideoView mVideoView;
/**
* 底部整个布局,控制布局显示和隐藏
*/
private LinearLayout controllerLayout;
/**
* 暂停的Img按钮
*/
private ImageView play_controller_img;
/**
* 显示总时间和单独时间
*/
private TextView tiem_current_tv,time_total_tv;
/**
* 总的SeekBar和音量的SeekBar
*/
private SeekBar play_seek,volume_seek;
/**
* 控制全屏的Img
*/
private ImageView screen_img;
public static final int UPDATEUI = 1;
/**
* 获取的当前的屏幕的宽度和高度
*/
private int screen_width,screen_hright;
private RelativeLayout videoLayout;
/**
* 音频管理器
*/
private AudioManager mAudioManager;
/**
* 音量
*/
private ImageView volume_img;
/**
* 设置屏幕是竖屏还是横屏开关
*/
private boolean isFullScreen = false;
/**
* 在手机屏幕上的滑动是否合法
*/
private boolean isAdjust = false;
//防止手势误触的临界值(可修改)
private int threshold = 30;
//调节亮度
private float mBrightness;
//触摸时当前的x轴和y轴的滑动距离
private float lastX,lastY;
/**
* 音量的图像变化
*/
private ImageView operation_bg,operation_percent;
/**
* 音量布局隐藏控制
*/
private FrameLayout progress_layout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mAudioManager = (AudioManager)getSystemService(AUDIO_SERVICE);
initUI();
setPlayerEvent();
String path = Environment.getExternalStorageDirectory().getAbsolutePath()+"/cjyx.mp4";
/**
* 本地视频播放
*/
mVideoView.setVideoPath(path);
mVideoView.start();
UIHandler.sendEmptyMessage(UPDATEUI);
}
/**
* 初始化UI布局
*/
private void initUI() {
mVideoView = (CustomVideoView)findViewById(R.id.videoview);
controllerLayout = (LinearLayout)findViewById(R.id.controllerbar_layout);
play_controller_img = (ImageView)findViewById(R.id.pause_img);
screen_img = (ImageView)findViewById(R.id.screen_img);
tiem_current_tv = (TextView)findViewById(R.id.time_current_tv);
time_total_tv = (TextView)findViewById(R.id.time_total_tv);
play_seek = (SeekBar)findViewById(R.id.play_seek);
volume_seek = (SeekBar)findViewById(R.id.volume_seek);
videoLayout = (RelativeLayout)findViewById(R.id.video_layout);
volume_img = (ImageView)findViewById(R.id.volume_img);
operation_bg = (ImageView)findViewById(R.id.operation_bg);
operation_percent = (ImageView)findViewById(R.id.operation_percent);
progress_layout = (FrameLayout)findViewById(R.id.progress_layout);
/**
* 获取的当前的屏幕的宽度和高度
*/
screen_width = getResources().getDisplayMetrics().widthPixels;
screen_hright = getResources().getDisplayMetrics().heightPixels;
/**
* 当前设备的最大音量
*/
int streamMaxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
/**
* 获取设备的当前音量
*/
int streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
volume_seek.setMax(streamMaxVolume);
volume_seek.setProgress(streamVolume);
}
/**
* 时间格式的转换 并设置播放时间和总时间
* @param textview
* @param millsecond
*/
private void updateTextViewWithTimeFormat(TextView textview,int millsecond){
int second = millsecond/1000;
int hh = second/3600;//小时
int mm = second%3600/60;//分钟
int ss = second%60;//秒
String str = null;
if (hh!=0){
str = String.format("%02d:%02d:%02d",hh,mm,ss);
}else{
str = String.format("%02d:%02d",mm,ss);
}
textview.setText(str);
}
/**
* 实时更新视频的时间
*/
private Handler UIHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == UPDATEUI) {
//获取视频当前的播放时间
int currentPosition = mVideoView.getCurrentPosition();
//获取视频播放的总时间
int totalDuration = mVideoView.getDuration();
//格式化视频播放时间
updateTextViewWithTimeFormat(tiem_current_tv,currentPosition);
updateTextViewWithTimeFormat(time_total_tv,totalDuration);
//设置视频总时间
play_seek.setMax(totalDuration);
play_seek.setProgress(currentPosition);
//自己更新自己来实现UI时间界面的更新
UIHandler.sendEmptyMessageDelayed(UPDATEUI,500);
}
}
};
@Override
protected void onPause() {
super.onPause();
//暂停的时候要停止UI时间界面的刷新
UIHandler.removeMessages(UPDATEUI);
}
@Override
protected void onDestroy() {
super.onDestroy();
}
private void setPlayerEvent() {
/**
* 控制视频的播放和暂停
*/
play_controller_img.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mVideoView.isPlaying()) {
play_controller_img.setImageResource(R.drawable.play_btn_style);
//暂停播放
mVideoView.pause();
} else {
play_controller_img.setImageResource(R.drawable.pause_btn_style);
//开始播放
mVideoView.start();
UIHandler.sendEmptyMessage(UPDATEUI);
}
}
});
/**
* Seekbar设置监听事件
*/
play_seek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
updateTextViewWithTimeFormat(tiem_current_tv, progress);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
UIHandler.removeMessages(UPDATEUI);
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
int progress = seekBar.getProgress();
//另视频播放的进度遵循SeekBar停止拖动的这一刻进度
mVideoView.seekTo(progress);
UIHandler.sendEmptyMessage(UPDATEUI);
}
});
/**
* 音量Seekbar设置监听事件
*/
volume_seek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
/**
* 设置当前设备的音量
*/
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
/**
* 手动横竖屏的切换
*/
screen_img.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isFullScreen) {
//调用系统切换为竖屏状态
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else {
//调用系统切换为横屏或全屏状态
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
}
});
/**
* 控制VideoView的手势事件
*/
mVideoView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
float x = event.getX();
float y = event.getY();
Log.e("Main", "x=" + x + ";y=" + y);
// float lastX=0, lastY=0;
switch (event.getAction()) {
/**
* 手指落下屏幕的那一刻调用(只调用一次)
*/
case MotionEvent.ACTION_DOWN:
lastX = x;
lastY = y;
break;
/**
* 手指在屏幕上移动(调用多次)
*/
case MotionEvent.ACTION_MOVE:
//计算偏移量
float detlaX = x - lastX;
float detlaY = y - lastY;
//计算滑动时x轴和y轴的偏移量的绝对值
float absdetlaX = Math.abs(detlaX);
float absdetlaY = Math.abs(detlaY);
//滑动的绝对值与之前设定的临界值进行比较
if (absdetlaX > threshold && absdetlaY > threshold) {
if (absdetlaX < absdetlaY) {//y轴大于x轴的滑动,滑动是有效的
isAdjust = true;
} else {
isAdjust = false;
}
} else if (absdetlaX < threshold && absdetlaY > threshold) {
isAdjust = true;
} else if (absdetlaX > threshold && absdetlaY < threshold) {
isAdjust = false;
}
Log.e("Main", "手势是否合法" + isAdjust);
if (isAdjust) {
/**
* 在判断当前手势是否和发的情况下,去区分此时的手势是调节亮度还是调节音量
*/
if (x < screen_width / 2) {
/**
* 调节亮度
*/
// if (detlaY > 0) {
// /**
// * 降低亮度
// */
//// Log.e("Main", "降低亮度" + detlaY);
// } else {
// /**
// * 升高亮度
// */
//// Log.e("Main", "升高亮度" + detlaY);
// }
changeBrightness(-detlaY);
} else {
// /**
// * 调节音量
// */
// if (detlaY > 0) {
// /**
// * 减小音量
// */
//// Log.e("Main", "减小音量" + detlaY);
// } else {
// /**
// * 增加音量
// */
//// Log.e("Main", "增加音量" + detlaY);
// }
changeVolume(-detlaY);
}
}
lastX = x;
lastY = y;
break;
/**
* 手指离开屏幕的那一刻(调用一次)
*/
case MotionEvent.ACTION_UP:
//抬起的时候进行对调节亮度的和音量的图标进行隐藏
progress_layout.setVisibility(View.GONE);
break;
}
return true;
}
});
}
/**
* 改变音量
*/
private void changeVolume(float detlaY){
//最大
int max = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
//当前音量
int current = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
int index = (int)(detlaY/screen_hright*max*3);
int volume =Math.max(current + index, 0);
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, volume, 0);
//当处于隐藏状态的时候,进行显示
if (progress_layout.getVisibility() == View.GONE){
progress_layout.setVisibility(View.VISIBLE);
}
/**
* 1.设置音量图标的显示
* 2.并且从新进行参数的设置
*/
operation_bg.setImageResource(R.drawable.video_volume_bg);
ViewGroup.LayoutParams layoutParams = operation_percent.getLayoutParams();
layoutParams.width = (int) (ScreenUtil.getInstance().dp2Px(MainActivity.this,94)*(float)volume/max);
operation_percent.setLayoutParams(layoutParams);
volume_seek.setProgress(volume);
}
/**
* 改变屏幕的显示亮度
* @param detlaY
*/
private void changeBrightness(float detlaY){
WindowManager.LayoutParams attributes = getWindow().getAttributes();
mBrightness = attributes.screenBrightness;//当前的亮度
float index = detlaY/screen_hright/3;
mBrightness +=index;
if (mBrightness > 1.0f){
mBrightness= 1.0f;
}
if (mBrightness < 0.01f){
mBrightness= 0.01f;
}
attributes.screenBrightness = mBrightness;
//当处于隐藏状态的时候,进行显示
if (progress_layout.getVisibility() == View.GONE){
progress_layout.setVisibility(View.VISIBLE);
}
/**
* 1.设置亮度图标的显示
* 2.并且从新进行参数的设置
*/
operation_bg.setImageResource(R.drawable.video_brightness_bg);
ViewGroup.LayoutParams layoutParams = operation_percent.getLayoutParams();
layoutParams.width = (int) (ScreenUtil.getInstance().dp2Px(MainActivity.this,94)*mBrightness);
operation_percent.setLayoutParams(layoutParams);
getWindow().setAttributes(attributes);
}
/**
* 1.此系统方法是监听屏幕的改变
* 监听到屏幕的方向的改变
* @param newConfig
*/
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
/**
* 当屏幕方向为横屏的时候
*/
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
setVideoViewScale(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);
volume_img.setVisibility(View.VISIBLE);
volume_seek.setVisibility(View.VISIBLE);
isFullScreen = true;
//移出半屏的状态
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
//设置全屏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
}else{//为竖屏的时候
setVideoViewScale(ViewGroup.LayoutParams.MATCH_PARENT, ScreenUtil.getInstance().px2Dp(MainActivity.this, 240));
volume_img.setVisibility(View.GONE);
volume_seek.setVisibility(View.GONE);
isFullScreen = false;
//设置全屏
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
//移出半屏的状态
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
}
}
/**
* 对屏幕宽度和高度从新赋值
* @param width
* @param height
*/
private void setVideoViewScale(int width,int height){
ViewGroup.LayoutParams layoutParams = mVideoView.getLayoutParams();
layoutParams.width = width;
layoutParams.height = height;
mVideoView.setLayoutParams(layoutParams);
ViewGroup.LayoutParams layoutParams1 = videoLayout.getLayoutParams();
layoutParams1.width = width;
layoutParams1.height = height;
videoLayout.setLayoutParams(layoutParams1);
}
}
主Activity的布局activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:id="@+id/video_layout"
android:layout_width="match_parent"
android:layout_height="240dp">
<com.zhjy.hxf.hzvideoview.view.CustomVideoView
android:id="@+id/videoview"
android:layout_width="match_parent"
android:layout_height="240dp" />
<include layout="@layout/layout_progress"></include>
<LinearLayout
android:id="@+id/controllerbar_layout"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:orientation="vertical">
<SeekBar
android:id="@+id/play_seek"
android:layout_width="match_parent"
android:layout_height="5dp"
android:layout_marginLeft="-20dp"
android:clickable="true"
android:layout_marginRight="-20dp"
android:indeterminate="false"
android:max="100"
android:progress="20"
android:progressDrawable="@drawable/seekbar_style2"
android:thumb="@null" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#101010"
android:gravity="center_vertical">
<LinearLayout
android:id="@+id/left_layout"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="horizontal">
<ImageView
android:id="@+id/pause_img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:src="@drawable/pause_btn_style" />
<TextView
android:id="@+id/time_current_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="32dp"
android:text="00:00:00"
android:textColor="#ffffff"
android:textSize="14sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:text="/"
android:textColor="#4c4c4c"
android:textSize="14sp" />
<TextView
android:id="@+id/time_total_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:text="00:00:00"
android:textColor="#4c4c4c"
android:textSize="14sp" />
</LinearLayout>
<LinearLayout
android:layout_width="10dp"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:layout_toRightOf="@id/left_layout"
android:gravity="center_vertical|right"
android:orientation="horizontal">
<ImageView
android:id="@+id/volume_img"
android:layout_width="23dp"
android:layout_height="23dp"
android:src="@drawable/ic_yinliang"
android:visibility="gone" />
<SeekBar
android:id="@+id/volume_seek"
android:layout_width="100dp"
android:layout_height="5dp"
android:indeterminate="false"
android:max="100"
android:progress="20"
android:progressDrawable="@drawable/seekbar_style"
android:thumb="@null"
android:visibility="gone" />
<View
android:layout_width="1dp"
android:layout_height="match_parent"
android:layout_marginBottom="5dp"
android:layout_marginLeft="32dp"
android:layout_marginTop="5dp"
android:background="#1e1e1e" />
<ImageView
android:id="@+id/screen_img"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:src="@drawable/screen" />
</LinearLayout>
</RelativeLayout>
</LinearLayout>
</RelativeLayout>
</RelativeLayout>
源码下载地址:
http://download.csdn.net/download/huang3513/9776971
转载请注明出处,如有好的意见和建议欢迎留言。