难点
这里的难点主要就在需要循环播放。
因为需要使用循环播放,就不能使用LISTVIEW/RECYCLERVIEW这种易于实现的控件。
本文还是使用VIERPAGER来做切换。
实现思路
一般来说VIEWPAGER的循环切换有几种方式
https://github.com/imbryk/LoopingViewPager
这是一种解决方案。但是在1->N的过程中会有实际的坐标跳变,内嵌播放器的话就会体验很差,还无法确定播放的时间点。
因此还是采用MAX_COUNT的循环解决方案。
设计
默认采用10个播放器轮询,那么问题来了?开十个播放器线程去等待START么?
这个方案明显不靠谱。
目前的做法是:
1.写一个包含SURFACE的自定义LAYOUT,里面包含目标URL,使用的MEDIAPLAYER等资源。
2.在VIEW创建的时候,去创建对应VIEW的MEDIAPLAYER。
3.在VIEW移除时,将对应的MEDIAPLAYER释放,这样保证同时只有3个活跃的MEDIAPLAYER。
4.使用VIEWPAGER的滑动监听,来处理内部MEDIA的播放状态。
需要填的坑
1.读取raw/asset的资源方法,请自行搜索。
2.默认当前页自动播放,第一个页面需要专门去触发播放,后续的页面由滑动来触发播放。这里需要特殊处理。
3.需要考虑旋屏和图像的适配。这里坑比较多
旋屏黑屏请自行处理,看看是不是走ONCREATE了。需要注册ACTIVITY的configChanges .
FIXSIZE是设置SURFACEVIEW分辨率不是SURFACEVIEW的控件大小。
SURFACEVIEW的控件大小由:
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) surface.getLayoutParams();
layoutParams.height = finalheight;
layoutParams.width = finalwidth;
surface.setLayoutParams(layoutParams);
设置surfaceview的LAYOUT来进行大小转换。
然后还有一个比较坑的,可用屏幕大小,不要使用上一层的FRAMELAYOUT属性,因为可能走进来的时候,FRAMELAYOUT渲染还没有结束,获取到的尺寸不对,还是用屏幕大小来适配。
未填完的坑
1.在快速滑动的时候,可能会出现播放器异常。用金山的播放器替换MEDIAPLAYER后稍有改善。这个涉及底层修改估计没戏了。
2.需要设计一下SURFACEVIEW有下滑内容的处理逻辑。
3. 中间有个CLICK的按钮,我懒了,暂时没有做成图形按钮。这个要跟COMPLETE一起来做。