Android 视频列表(RecyclerView)实现自动播放

最近公司出了新的需求, 想让视频列表滑到哪里,哪里就自动播放.

于是乎,深海开始动手了:

第一步,先让视频可以手动点击播放

这个简单:就往ViewHolder里放一个视频播放器就可以了

播放器我用的这个第三方:https://blog.csdn.net/qq_39731011/article/details/90672491

着重说一下,因为播放器框架问题以及性能相关问题,播放完一个视频,播放下一个视频的时候要初始化播放器

让整个列表,始终只有一个播放器在播放视频.

重点代码: MediaPlayerManager.instance().releaseMediaPlayer();   初始化播放器

/*
         *作者:赵星海
         *时间:2019/7/30 16:31
         *用途: ViewHolder中,播放器点击事件
         */
mVideoView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mVideoView == null) return;

                if (isPlay) {
                    isPlay = false;
                    MediaPlayerManager.instance().pause(); // 停止播放
                    mVideoView.setVisibility(View.GONE);
                    play.setVisibility(View.VISIBLE);
                } else {
                    if (getPosition()!=Attention_Adapter.startPosition){
                        MediaPlayerManager.instance().releaseMediaPlayer();
                    }
                    isPlay = true;
                    MediaPlayerManager.instance().start();
                    mVideoView.setVisibility(View.VISIBLE);
                    play.setVisibility(View.GONE);
                }


            }
        });

我知道看这个代码你会有几点疑惑,我依次解释一下其用途,

然后你也可采用类似方式实现,毕竟可能你我用的播放器不同,或者业务逻辑不同

isPlay: →  boolean类型,这是一个是否正在播放的标记,因为要让播放器只运行一个,所以提成了全局

MediaPlayerManager;  →  这是我用的播放器的控制器类,负责暂停,初始化等功能

play.setVisibility(View.GONE) →  一个盖在播放器上面的一个小浮标,无需深究

第二步,让视频自动播放

实现RecyclerView的滑动监听:


       /*
         *作者:赵星海
         *时间:2019/7/30 15:35
         *用途: RecyclerView滑动监听_确定自动播放的位置和回收点
         */
        mRecycler.addOnScrollListener(new RecyclerView.OnScrollListener() {

            private int thisPosition = -1;

            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                switch (newState) {
                    case RecyclerView.SCROLL_STATE_IDLE: //滚动停止
                        LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
                        if (layoutManager != null) {
                            int firstVisibleItem = layoutManager.findFirstVisibleItemPosition();
                            int lastVisibleItem = layoutManager.findLastVisibleItemPosition();
                            int eddVisibleItem = layoutManager.findLastCompletelyVisibleItemPosition();
                            if (eddVisibleItem == thisPosition) return;
                            thisPosition = eddVisibleItem;
                            int thisVideoView = eddVisibleItem - firstVisibleItem;
                            if (layoutManager != null && layoutManager.getChildAt(thisVideoView) != null
                                    && layoutManager.getChildAt(thisVideoView).findViewById(R.id.attention_holder_video) != null) {
                                VideoView videoView = layoutManager.getChildAt(thisVideoView).findViewById(R.id.attention_holder_video);
                                videoView.start();
                                LogUtils.loge("开始播放新视频");
                            }
                        }
                        break;
                    case RecyclerView.SCROLL_STATE_DRAGGING: //手指拖动
                        break;
                    case RecyclerView.SCROLL_STATE_SETTLING: //惯性滚动
                        break;
                }
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);


            }
        });

 

这里要注意,在监听里的匿名内部类中定义了一个变量:

private int thisPosition = -1;       //代表当前屏幕中完整显示的Item

初次尝试:通过获取屏幕中显示的第一个Item最后一个Item来确定thisPosition:

两个核心方法:

                    int firstPosition = layoutManager.findFirstVisibleItemPosition();
                    int lastPosition = layoutManager.findLastVisibleItemPosition();

核心思想: (深海又要开始画图了...)

上图是当初深海取当前位置thisPosition的方案.

代码体现是这样的:

                if (lastPosition-firstPosition ==1){
                        thisPosition = firstPosition;
                    }else if(lastPosition-firstPosition >1){
                        thisPosition = firstPosition+1;
                    }

最后的左边减去最开始的坐标,获取到屏幕中显示Item的数量,然后通过这个来确定thisPosition的取值方法:

但是最终这个方案被废弃了,在实际的使用中遇到很多问题,比如遇到两个条目过大的时候 第一个条目仅仅滑上去一点点,也会直接

播放下面只露头的Item.....

后来,我去翻了一下layoutManager的源码. 当!当!当!当~!  我发现了这个方法 findLastCompletelyVisibleItemPosition()

这个方法可以直接获取当前屏幕中完整显示的Item,返回最下面的Item.

因为 layoutManager.getChildAt(thisVideoView) 方法参数是该条目在当前页的相对坐标,而不是所有控件的坐标

所以,用当前的坐标findLastCompletelyVisibleItemPosition(),减去第一个Item的坐标firstVisibleItem,就得到了当前完整显示的Item的相对坐标.

然后就可以用相对坐标作为 layoutManager.getChildAt(thisVideoView)的参数获取到当前完整显示的最后一个item的VideoVIew控件去控制播放 , 完毕!

如果大家还有什么不懂的地方,或者有更好的建议,欢迎大家评论区留言! 看到必回! 谢谢!

  • 14
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 22
    评论
Android可以通过使用网络请求获取远程视频列表,并实现远程视频播放功能。 首先,需要使用网络请求库(如OkHttp、Volley、Retrofit等)发送请求,获取远程视频列表的数据。可以使用HTTP协议的GET方法发送请求给服务器,服务器返回一个包含视频信息的JSON格式数据。 接下来,需要解析获取到的数据。可以使用JSON解析库(如Gson、JsonSmart等)将JSON数据转化为Java对象,例如一个视频对象包含视频的标题、地址、描述等信息。 一般来说,远程视频播放需要使用特定的视频播放库来实现。在Android系统,可以使用MediaPlayer类来实现视频的播放。创建一个MediaPlayer对象,设置数据源为远程视频的地址,然后调用prepare()方法准备播放,最后调用start()方法开始播放视频。 为了能够展示远程视频列表,可以使用RecyclerView控件展示视频的标题和描述等信息。创建一个RecyclerView对象,设置布局管理器,通常使用LinearLayoutManager或GridLayoutManager来管理RecyclerView的布局。然后创建一个适配器,继承自RecyclerView.Adapter,并在适配器设置数据源为解析得到的视频列表数据,重写onCreateViewHolder()方法创建ViewHolder实例,再重写onBindViewHolder()方法绑定数据。最后将适配器设置给RecyclerView对象。 当用户点击视频列表的某个视频时,可以根据视频对象的地址,将其作为数据源设置给MediaPlayer对象,实现远程视频播放。播放视频时,还可以为MediaPlayer设置相关的监听器,例如当视频播放完成时,可以设置一个OnCompletionListener监听器,当播放完成时触发相应的操作。 总结起来,实现远程视频播放和视频列表功能,需要进行网络请求获取远程视频列表数据,解析数据并展示在RecyclerView,点击列表项时实现视频的播放功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值