原创 2017-07-31 认真的 小苏

视频列表滚动连播技术探究系列
1、仿网易/QQ空间视频列表滚动连播炫酷效果(V1.0 挖坑之路)。
2、仿网易/QQ空间视频列表滚动连播炫酷效果(V2.0 填坑之路) 想看源码的,看这篇文章。
3、仿网易视频列表滚动连播炫酷效果(v3.0 稳定版-思想改变及优化) 稳定版-进行优化和思想上的改变。
4、RecyclerView 平滑滚动可控制滚动速度的终极解决方案。
5、仿网易视频列表连播炫酷效果 - v3.1 升级版-细节优化(网络状态切换、item点击事件等)
持续更新中.....
技术前沿
Android DP4 来了,O 还会远吗?期待已久的 Android O 预览版 4 (Developer Preview 4) 终于来了,这是在发布 Android O 最终版本之前的最后一个预览版,开发者可以借此机会尽快展开 Android O 系统的适配和测试并发布更新,等到 Android O 正式版发布之后可以让用户平稳过渡到 Android O 系统。
如果你有一个设备已经加入了 Android 测试计划,那么最近几天你的设备将会收到 DP 4 系统的更新,如果还没加入可以去 Android 测试计划官网加入并获得更新。
来个段子压压惊
一个农民工在北京打工,买不到回家火车票,十分着急,灵机一动,花20元制作一个“我要上访”横幅!还没出火车站就被2名便衣警察摁倒遣送回老家。算了一下……省去火车票280元、汽车票60元、三轮车票10元、路上吃饭30元,这次净赚380元,而且还是专车送到家门口;村长、乡长迎接,找他谈心,后乡长又拨付2000元扶贫款,村长又送1000元慰问金。这叫思路一变 市场一片,不是市场不景气,而是自己不努力
为何要出v2.0版本呢?要填坑啊
这是上一篇的升级版本,并且可以稳定运行可以用到项目中,另外根据广大网友的需求,今天决定放出源码,不要着急,源码地址在后面。

有哪些坑呢?下面总结一下问题
- Activity 在前台播放时,进入后台暂停播放,再进入前台时 自动播放视频。
- Activity 在前台暂停播放时,进入后台,再进入前台时 还是暂停播放之前的视频状态。
- Activity finish 的时候,停止播放 销毁。
- 播放视频,当控制器隐藏时,播放器底边播放进度条显示。
- item 暂停移除屏幕,再回来播放不显示播放控制器的问题。
- 播放列表到最后一个时的操作判断。
7.视频列表自动播放位置跳转问题。
先看如何解决1、2、3的问题,直接一段代码抛给你
/**
* Activity 不在前台时 停止播放并销毁
*/
@Override
protected void onPause() {
super.onPause();
if (!isPause) {
Log.e("linksu MainActivity",
"onPause(MainActivity.java:210)" + isThrumePause);
if (!isThrumePause) { //若不是手动暂停,Activity进入后台自动暂停
Log.e("linksu MainActivity",
"onPause(MainActivity.java:192) onPause");
VideoHolder childViewHolder = (VideoHolder) rl_video.findViewHolderForAdapterPosition(itemPosition);
if (childViewHolder != null) {
childViewHolder.pausePlayer();
childViewHolder.unRegisterVideoPlayerListener();// 注意我们需要解除上一个item的监听,不然会注册多个监听
}
isPause = true;
}
}
}
/**
* Activity 重新进入前台
*/
@Override
protected void onResume() {
super.onResume();
if (isThrumePause) { //手动暂停且从后台进入前台
Log.e("linksu MainActivity",
"onResume(MainActivity.java:229) isThrumePause");
VideoHolder childViewHolder = (VideoHolder) rl_video.findViewHolderForAdapterPosition(itemPosition);
if (childViewHolder != null) {
childViewHolder.registerVideoPlayerListener(this);
childViewHolder.goneMasked();
childViewHolder.thumbPlayer();
}
} else {
if (isPause) {
Log.e("linksu MainActivity",
"onResume(MainActivity.java:241) onResume");
VideoHolder childViewHolder = (VideoHolder) rl_video.findViewHolderForAdapterPosition(itemPosition);
if (childViewHolder != null) {
childViewHolder.registerVideoPlayerListener(this);
childViewHolder.goneMasked();
childViewHolder.player(itemPosition);
}
isPause = false;
}
}
}
/**
* Activity 退出时停止播放
*/
@Override
public void finish() {
super.finish();
isPause = true;
Log.e("linksu MainActivity",
"finish(MainActivity.java:218) finish");
VideoHolder childViewHolder = (VideoHolder) rl_video.findViewHolderForAdapterPosition(itemPosition);
if (childViewHolder != null) {
childViewHolder.stopPlayer();
childViewHolder.unRegisterVideoPlayerListener();// 注意我们需要解除上一个item的监听,不然会注册多个监听
}
}
/**
* 销毁播放器
*/
@Override
protected void onDestroy() {
super.onDestroy();
Log.e("linksu MainActivity",
"onDestroy(MainActivity.java:232) onDestroy");
VideoHolder childViewHolder = (VideoHolder) rl_video.findViewHolderForAdapterPosition(itemPosition);
if (childViewHolder != null) {
childViewHolder.removePlayer();
}
}
上面代码很清晰明了,主要就是对生命周期的理解和运用,如果你还不是很理解生命周期可以看这篇文章。
4和5 的问题主要是改播放器的封装问题,直接看源码吧。
6和7 的问题recyclerview的坑啊,跳转不准确,我是这么解决的,用LinearLayoutManager 来跳转位置
@Override
public void videoCompletion() { //播放完成 播放下一个
Log.e("linksu MainActivity",
"videoCompletion(MainActivity.java:155)");
if (itemPosition != lastItemPosition) { //若播放的不是最后一个
Log.e("linksu MainActivity",
"videoCompletion(MainActivity.java:158) itemPosition --> " + (itemPosition + 1));
itemPosition = itemPosition + 1;
((LinearLayoutManager) rl_video.getLayoutManager()).scrollToPositionWithOffset(itemPosition, 20);
aoutPlayVideo(rl_video);
}
}
网友评论