仿网易/QQ空间视频列表滚动连播炫酷效果(V2.0 填坑之路)

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

仿网易/QQ空间视频列表滚动连播炫酷效果(V2.0 填坑之路)_第1张图片
Android O

视频列表滚动连播技术探究系列

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版本呢?要填坑啊

这是上一篇的升级版本,并且可以稳定运行可以用到项目中,另外根据广大网友的需求,今天决定放出源码,不要着急,源码地址在后面。


仿网易/QQ空间视频列表滚动连播炫酷效果(V2.0 填坑之路)_第2张图片
填坑啊

有哪些坑呢?下面总结一下问题

  1. Activity 在前台播放时,进入后台暂停播放,再进入前台时 自动播放视频。
  2. Activity 在前台暂停播放时,进入后台,再进入前台时 还是暂停播放之前的视频状态。
  3. Activity finish 的时候,停止播放 销毁。
  4. 播放视频,当控制器隐藏时,播放器底边播放进度条显示。
  5. item 暂停移除屏幕,再回来播放不显示播放控制器的问题。
  6. 播放列表到最后一个时的操作判断。
    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);
       }
   }

好,坑已经填完,下面就是放大招的时刻,源码放出 ,如果帮助你了,多多star。

仿网易/QQ空间视频列表滚动连播炫酷效果(V2.0 填坑之路)_第3张图片
专题封面

你可能感兴趣的:(仿网易/QQ空间视频列表滚动连播炫酷效果(V2.0 填坑之路))