本文共 3921 字,大约阅读时间需要 13 分钟。
需求是模仿今日头条短视频播放,过程中遇到的问题如下:
进入ListView中会看到一列视频,看到的视频仅仅是视频的封面,点击播放的图标,才会初始化播放器控件,进行播放视频的操作,保证了列表中视频播放时候的流程和操作体验。
优酷云SDK播放器点击全屏时候,播放器会充满他的父容器。ListView中的Item不是。进行自定义横竖屏操作,重写全屏按钮的实现方法,进行全屏操作时候,打开一个新的播放器页面,再进行全屏操作。
禁用播放器本身的横竖屏设置
youkuPlayerView.setUseOrientation(false);
然后再通过youkuPlayerView.setUIListener设置对横竖屏按钮的监听
...youkuPlayerView.setUIListener(new YoukuUIListener() { @Override public void onBackBtnClick() { } @Override public void onFullBtnClick() { // 打开全屏的Activity Intent intent = new Intent(); intent.setClass(mContext, VideoFullscreenActivity.class); startActivity(intent); } });...
重写播放器Activity的onConfigurationChanged,此处是监听手机旋转的地方,在这里加上自定义的横竖屏处理代码
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { // 即使响应为竖屏,也强制设置为横屏,这样可以始终保持横屏 this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } }
// 1.定义变量,用于记录当前的playerView控件 private YoukuPlayerView currentPlayerView; ... viewHolder.iv_bg.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 2.点击播放器浮层上的播放按钮,将上一个正在播放的视频控件释放掉 if (null!=currentPlayerView) { currentPlayerView.release(); } // 更新正在播放的currentPlayerView控件 currentPlayerView = viewHolder.ypv; initCheckedStatus(); isChecked.put(position, true); viewHolder.rl_bg.setVisibility(View.INVISIBLE); currentPlayerView.setVisibility(View.VISIBLE); // 播放器控件初始化 initPlayer(currentPlayerView); // 开始播放 currentPlayerView.playYoukuVideo(vid); notifyDataSetChanged(); } }); if (isChecked.get(position)) { viewHolder.rl_bg.setVisibility(View.INVISIBLE); viewHolder.ypv.setVisibility(View.VISIBLE); } else { viewHolder.iv_bg.setVisibility(View.VISIBLE); viewHolder.ypv.setVisibility(View.INVISIBLE); } return convertView; }
点击ListView中其中一个视频,进行全屏操作,然后返回。会发现视频出于黑屏,无法播放,优酷SDK报错误。将onResume()
中再次将控件进行初始化,并且调用控件的onPause()
方法
@Override protected void onResume() { super.onResume(); Log.i("MainActivity", "onResume()"); if(null!=currentPlayerView) { initPlayer(currentPlayerView); currentPlayerView.pause(); } } public void initPlayer(YoukuPlayerView youkuPlayerView) { youkuPlayerView.attachActivity(MainActivity.this); youkuPlayerView.setPreferVideoDefinition(VideoDefinition.VIDEO_HD); youkuPlayerView.setPlayerListener(new MyPlayerListener()); youkuPlayerView.setUseOrientation(false); youkuPlayerView.setUIListener(new YoukuUIListener() { @Override public void onBackBtnClick() { } @Override public void onFullBtnClick() { Toast.makeText(mContext, "竖屏", Toast.LENGTH_SHORT).show(); Intent intent = new Intent(); intent.setClass(mContext, VideoFullscreenActivity.class); startActivity(intent); } }); }
转载地址:http://anujl.baihongyu.com/