前言
这段时间公司要做视频播放的项目,之前没有任何这方面的相关经验,经过多方查阅写出来一个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("d:d:d",hh,mm,ss); }else{ str = String.format("d:d",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("d:d:d",hh,mm,ss); }else{ str = String.format("d:d",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 转载请注明出处,如有好的意见和建议欢迎留言。
