Android Recyclerview列表自动播放视频

Android仿微博实现列表滑动播放/暂停视频 本文仿照新浪微博/QQ空间实现了滑动自动播放视频的功能。 本文来自个人博客:http://www.zhangliwei.date 如有疑问欢迎讨论,感谢您的关注。 先上效果图 关键代码1.监听滚动事件首先要给listview添加setOnScrollListener监听,注意这个监听在recyclerView上是addOnScrollListener,也就是说下面代码同时支持r 阅读详情

前言:最近项目比较忙很久没写博客了,一个月迭代了三个版本也是醉了。。。谁叫我们是苦逼的程序猿呢,回归正传;最近主要在弄一个跟视频有关的项目,里面也学到一些东西,现在记录一下;其中一个是仿微博的视频列表自动播放功能,具体可以看下图:

这里写图片描述

项目中视频使用的是GSYVideoPlayer 这个开源库。
ps:作者很热心,nice。

废话不多说,直接进入重点;既然要实现类似微博那种滚动列表时,处于当前屏幕的项自动播放,那么肯定得监听列表的滚动事件,好在Recyclerview中给我们提供了接口:

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                switch (newState) {
                    case SCROLL_STATE_IDLE: //滚动停止
                        break;
                    case SCROLL_STATE_DRAGGING: //手指拖动
                        break;
                    case SCROLL_STATE_SETTLING: //惯性滚动
                        break;
                }
            }

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

如上onScrollStateChanged 方法 给我们返回了三种状态:
SCROLL_STATE_DRAGGING: 手指按住屏幕拖动
SCROLL_STATE_SETTLING: 手指快速在屏幕滑一下后的惯性滑动
SCROLL_STATE_IDLE: 屏幕处于禁止状态

而onScrolled 方法给我们返回了 dx:水平滚动距离、dy:垂直滚动距离。这两个值都是用手指开始触摸的位置减去移动后的位置,所以:
dx > 0 时为手指向左滑动,列表滚动显示右面的内容
dx < 0 时为手指向右滑动,列表滚动显示左面的内容
dy > 0 时为手指向上滑动,列表滚动显示下面的内容
dy < 0 时为手指向下滑动,列表滚动显示上面的内容
项目中暂时没用到这些,但是这些值很有用。

在这个方法中我们需要获取三个值:
(1) 在屏幕可见区域的第一项位置 : 通过findFirstVisibleItemPosition()方法获取
(2) 在屏幕可见区域的最后一项位置 : 通过findLastVisibleItemPosition() 方法获取
(3)屏幕可见项的数目 : 用(2)减去(1)即可

为什么需要以上值,这里说下整体思路:
(1)获取当前处于屏幕可见的列表
(2)滑出屏幕的视频我们需要回收掉
(3)当屏幕处于静止状态时我们才开始播放视频

第一点:获取可见列表;上面获取的三个值已经解决了,直接看代码:

        public int firstVisibleItem, lastVisibleItem, visibleCount;

             @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                firstVisibleItem = layoutManager.findFirstVisibleItemPosition();
                lastVisibleItem = layoutManager.findLastVisibleItemPosition();
                visibleCount = lastVisibleItem - firstVisibleItem;
            }


第二点:回收滑出屏幕的视频,获取到当前播放的位置(开源库中有相关方法)判断是否在屏幕可见,不可见就回收;具体看代码

@Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                //大于0说明有播放
                if (GSYVideoManager.instance().getPlayPosition() >= 0) {
                    //当前播放的位置
                    int position = GSYVideoManager.instance().getPlayPosition();
                    //对应的播放列表TAG
                    if (GSYVideoManager.instance().getPlayTag().equals(HomeAdapter.TAG) && (position < firstVisibleItem || position > lastVisibleItem)) {
                        GSYVideoManager.releaseAllVideos();
                    }
                }
            }

第三点:屏幕处于静止时才开始播放,只要播放的逻辑写在onScrollStateChanged 的 SCROLL_STATE_IDLE 状态下即可;

@Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                switch (newState) {
                    case SCROLL_STATE_IDLE: //滚动停止
                        autoPlayVideo(recyclerView);
                        break;
                }
            }

private void autoPlayVideo(RecyclerView view) {
        RecyclerView.LayoutManager layoutManager = view.getLayoutManager();
        for (int i = 0; i < visibleCount; i++) {
            if (layoutManager != null && layoutManager.getChildAt(i) != null && layoutManager.getChildAt(i).findViewById(R.id.video_item_player) != null) {
                HomeGSYVideoPlayer homeGSYVideoPlayer = (HomeGSYVideoPlayer) layoutManager.getChildAt(i).findViewById(R.id.video_item_player);
                Rect rect = new Rect();
                homeGSYVideoPlayer.getLocalVisibleRect(rect);
                int videoheight = homeGSYVideoPlayer.getHeight();
                if (rect.top == 0 && rect.bottom == videoheight) {
                    if (homeGSYVideoPlayer.getCurrentState() == homeGSYVideoPlayer.CURRENT_STATE_NORMAL || homeGSYVideoPlayer.getCurrentState() == homeGSYVideoPlayer.CURRENT_STATE_ERROR) {
                        homeGSYVideoPlayer.getStartButton().performClick();
                    }
                    return;
                }

            }
        }
        GSYVideoPlayer.releaseAllVideos();
    }

autoPlayVideo方法里面就是通过 循环遍历 可见区域的播放器 然后通过 getLocalVisibleRect(rect) 方法计算出谁完全显示出来,对应方法可以查看getLocalVisibleRect 写的很详细;其中getChildAt() 获取的是屏幕可见范围下标从0开始的view,例如当前屏幕只够显示三个view,对应的下标就是0、1、2;与滑动的item的position没有关系。 最后判断如果播放器处于可播放的状态即调用start按钮播放。

因为是公司代码,所以很多地方不能开放出来,忘见谅。最后附上主要完整代码:

 public int firstVisibleItem, lastVisibleItem, visibleCount;

    public void loadListener() {

        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {

            boolean scrollState = false;

            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                switch (newState) {
                    case SCROLL_STATE_IDLE: //滚动停止
                        scrollState = false;
//                        autoPlayVideo(recyclerView);
                        break;
                    case SCROLL_STATE_DRAGGING: //手指拖动
                        scrollState = true;
                        break;
                    case SCROLL_STATE_SETTLING: //惯性滚动
                        scrollState = true;
                        break;
                }
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                firstVisibleItem = layoutManager.findFirstVisibleItemPosition();
                lastVisibleItem = layoutManager.findLastVisibleItemPosition();
                visibleCount = lastVisibleItem - firstVisibleItem;

                //大于0说明有播放
                if (GSYVideoManager.instance().getPlayPosition() >= 0) {
                    //当前播放的位置
                    int position = GSYVideoManager.instance().getPlayPosition();
                    //对应的播放列表TAG
                    if (GSYVideoManager.instance().getPlayTag().equals(HomeAdapter.TAG) && (position < firstVisibleItem || position > lastVisibleItem)) {
                        GSYVideoManager.onPause();
                    }
                }
            }


        });
    }

    private void autoPlayVideo(RecyclerView view) {
        RecyclerView.LayoutManager layoutManager = view.getLayoutManager();

        for (int i = 0; i < visibleCount; i++) {
            if (layoutManager != null && layoutManager.getChildAt(i) != null && layoutManager.getChildAt(i).findViewById(R.id.video_item_player) != null) {
                HomeGSYVideoPlayer homeGSYVideoPlayer = (HomeGSYVideoPlayer) layoutManager.getChildAt(i).findViewById(R.id.video_item_player);
                Rect rect = new Rect();
                homeGSYVideoPlayer.getLocalVisibleRect(rect);
                int videoheight = homeGSYVideoPlayer.getHeight();
                if (rect.top == 0 && rect.bottom == videoheight) {
                    if (homeGSYVideoPlayer.getCurrentState() == homeGSYVideoPlayer.CURRENT_STATE_NORMAL || homeGSYVideoPlayer.getCurrentState() == homeGSYVideoPlayer.CURRENT_STATE_ERROR) {
                        homeGSYVideoPlayer.getStartButton().performClick();
                    }
                    return;
                }

            }
        }
        GSYVideoPlayer.releaseAllVideos();
    }

说到这里还有一点可以说下,就是给视频弄圆角的时候,具体效果可以看上图,这里需要给TextureView设置圆角,一般的通过写shape设置background已经不适用了,好在网上找到一个方法:

public class TextureVideoViewOutlineProvider extends ViewOutlineProvider {
    private float mRadius;

    public TextureVideoViewOutlineProvider(float radius) {
        this.mRadius = radius;
    }

    @Override
    public void getOutline(View view, Outline outline) {
        Rect rect = new Rect();
        view.getGlobalVisibleRect(rect);
        int leftMargin = 0;
        int topMargin = 0;
        Rect selfRect = new Rect(leftMargin, topMargin,
                rect.right - rect.left - leftMargin, rect.bottom - rect.top - topMargin);
        outline.setRoundRect(selfRect, mRadius);
    }
}

最后给view设置就行:

mVideoView.setOutlineProvider(new TextureVideoViewOutlineProvider(radius));
mVideoView.setClipToOutline(true);

好了,今天的分享就到这里了,也是百忙中抽空写完了,喜欢可以点播关注,不喜欢的可以提点意见 ~_~ 。

android RecyclerView列表自动播放实现 立即下载

相关推荐

SAP SD实战:用BADI_SLS_HEAD_SCR_CUS给销售订单VA01/VA02加自定义字段(附完整函数组代码)

本文详细解析了在SAP SD模块中如何利用BADI_SLS_HEAD_SCR_CUS实现销售订单(VA01/VA02)的屏幕增强,包括数据结构设计、函数组创建和BADI接口实现。通过实战案例和完整代码,帮助开发者掌握在SAPMV45A标准流程中添加自定义字段的关键技术,提升业务定制化能力。

weixin_27015733的博客 368

【Android -- UI 开发】RecyclerView 实现视频列表自动播放

关于 RecyclerView 列表自动播放视频。

Kevin Learn Android 2353

保姆级避坑指南:在Ubuntu 18.04上搞定速腾Helios雷达驱动与fast-LIO2的完整配置流程

本文提供了一份详细的速腾Helios雷达与fast-LIO2在Ubuntu 18.04上的配置避坑指南,涵盖驱动安装、数据格式转换到建图全流程。特别针对常见编译错误和数据转换问题提供了解决方案,帮助开发者高效完成环境搭建与建图任务。

weixin_27252001的博客 112

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

最近公司出了新的需求, 想让视频列表滑到哪里,哪里就自动播放. 于是乎,深海开始动手了: 第一步,先让视频可以手动点击播放 这个简单:就往ViewHolder里放一个视频播放器就可以了 播放器我用的这个第三方:https://blog.youkuaiyun.com/qq_39731011/article/details/90672491 着重说一下,因为播放器框架问题以及性能相关问题,播放完一个视频...

赵星海 1万+

SAP PP工艺路线Routing保姆级配置指南:从CA01创建到替代/并行顺序实战

本文详细解析SAP PP模块中工艺路线(Routing)的配置与应用,从基础创建(CA01)到高级功能如替代顺序和并行顺序的实战操作。通过真实案例演示,帮助用户掌握SAP PP工艺路线的精细化管理,提升生产流程效率。

weixin_30898555的博客 388

Simulink模块库介绍(一)——信号源模块

Simulink模块库介绍(一)——信号源模块库目录Clock模块Digital Clock模块Band-Limited White Noise模块 目录 simulink模块库中提供了丰富的信号源模块组。逐一介绍,算是对之前做个总结吧 Clock模块 通过时钟模块,输出的时间作为判断呢,如下图,前2s之前为高斯白噪声,后2s为正弦曲线,共计10s。 Digital Clock模块 数字时钟模块主要用于离散系统的计时,sample time表示采用时间,如下图:分别是1s和0.5s的采样时间 Band-

5万+

RecyclerView监听滑动,自动播放视频列表,有点意思

GitHub https://github.com/AnJiaoDe/RecyclerViewVideoPlayList APK_demo https://github.com/AnJiaoDe/RecyclerViewVideoPlayList/blob/master/app/build/outputs/apk/app-debug.apk 视频列表页自动播放 1自动播放功能-用户上滑流程图 ...

奋斗的IT青年 3717

如何解决Elsevier和IEEE期刊之间参考文献的转换问题

Elsevier期刊和IEEE旗下的期刊两者模版互相转换的时候,会发现Elsevier模版的参考文献是存放在.bib文件下的,然后在.tex文件中直接引用即可。3. 在IEEE的.tex文件中的\end{document}命令行之前,添加下面的这句话(ps:\bibliography{**}中的**名称即为.bib文件的名称)如何将Elsevier的参考文献快速的转成IEEE期刊可用的格式,是本博客需要解决的问题。2. 将下载好的.bib文件,上传到IEEE的latex文件中。

薰珞婷紫小亭子的博客 1674

android视频列表滑动自动播放,android recyclerview列表播放视频视频全屏翻页自动播放高仿微视之路...

我这文章暂时是打广告的,要使用列表播放的朋友要做2件事情,第一 要监听recyclerview的滚动状态变为空闲的时候寻找videoview 进行播放第二 ,要再recyclerview的布局改变的时候也寻找videoview进行播放第三 让视频无缝无白屏闪屏播放所以我就不用国内的这些第三方了,感觉摸不着头脑,y因为搞不到为何findview之后调用播放按钮竟然毛线反应没有,于是找到了一个国外的,...

weixin_39636540的博客 886

【GLM5】手把手教你在openclaw中白嫖英伟达羊毛

openclaw很强,但是也很贵,每一次请求都会消耗大量的token。而英伟达平台正好可以白嫖免费的模型,于是,我们一拍即合。

Science prince的博客 3820

Vue3 - 详细实现安装西瓜视频 xgplayer 插件详细配置及使用教程,利用西瓜视频播放器播放 mp4、flv、hls 格式视频文件及视频推流(直播或监控摄像头画面),支持移动端H5及PC网站!

vue3,nuxt3,西瓜视频,xgplayer,插件组件,xgplayer-hls,xgplayer-flv,xgplayer-mp4,播放视频点播和直播视频流,监控实时播放推流,倍速播放,在线flv在线推流地址,HLS播放,vue3西瓜播放器,vue如何使用西瓜视频插件做直播推流回流,视频点播,flv在线视频流播放,截图功能,自定义播放器样式,截屏,监控视频,vue3使用西瓜播放器播放flv、hls、mp4视频,截屏按钮,直播流,报错,黑屏,加载失败,苹果ios不兼容,重连,怎么改样式,很卡,详细教程,

🏆 前端领域优质创作者 1万+

android 滑动自动播放,android recyclerview列表播放视频视频全屏翻页自动播放高仿微视之路...

我这文章暂时是打广告的,要使用列表播放的朋友要做2件事情,第一 要监听recyclerview的滚动状态变为空闲的时候寻找videoview 进行播放第二 ,要再recyclerview的布局改变的时候也寻找videoview进行播放第三 让视频无缝无白屏闪屏播放所以我就不用国内的这些第三方了,感觉摸不着头脑,y因为搞不到为何findview之后调用播放按钮竟然毛线反应没有,于是找到了一个国外的,...

weixin_39746241的博客 515

★教程1:matlab学习教程入门100例目录

★基础入门 1.为什么要学习MATLAB 2.MATLAB安装 持续更新....... ★MATLAB基础编程语言熟悉

FPGA/MATLAB学习教程/源码/项目合作开发 4万+

android recyclerview列表播放视频视频全屏翻页自动播放高仿微视之路

我这文章暂时是打广告的,要使用列表播放的朋友 http://github.com/qssq/videoplayer 视频效果http://www.iqiyi.com/w_19rxx2xtg5.html 要做2件事情,第一 要监听recyclerview的滚动状态变为空闲的时候寻找videoview 进行播放 第二 ,要再recyclerview的布局改变的时候也寻找videoview进行播放 第三...

情随事迁个人博客 720

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Android在滚动列表中实现视频的播放(RecyclerView)

新版的百度贴吧,网易新闻中有看视频的界面。 是随着view的滚动自动加载的。 如图所示,很方便查看。 因为项目需要,我在开发一个APP,也需要查看视频,便想实现一个差不多功能的。 经过搜索,我发现GITHUB上有这个开源的东西,可以很方便的实现这样的效果 VideoPlayerManager 试着做了个Demo,在此记录下,以后自己查起来也方便。 ...

bahunj93679的博客 1314

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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

在GitHub上面看了GSYVideoPlayer的demo代码,发现视频列表自动播放势必是不是很准确,然后结合了饺子播放器的demo代码整理了相关自动播放的代码。* @param percent 当item被遮挡percent/1时释放,percent取值0-1。* @param lastVisiblePosition 最后一个可见item位置。* @param lastVisiblePosition 最后一个可见item位置。//释放之前的view。

lun123451的博客 640

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Android kotlin 实现仿西瓜视频自动播放列表功能(横屏没有上下滑动)(RecyclerView+BRVAH3.0.6+androidx+jiaozivideoplayer+glide)

RecyclerView+BRVAH3.0.6+androidx+jiaozivideoplayer+glide

彬sir哥的博客 2439

Android 列表视频滑动自动播放—1—实现思路

我们优化思路,通过监听RecyclerView滑动状态,来实现当停止滑动时候,来播放视频。当SCROLL_STATE_DRAGGING我们需要暂停已经在播放的视频,我已经知道播放的事position。RecyclerView.SCROLL_STATE_DRAGGING: //手指拖动。RecyclerView.SCROLL_STATE_SETTLING: //惯性滚动。RecyclerView.SCROLL_STATE_IDLE: //滑动停止。

qq_21467035的博客 1208

【Android 进阶】仿抖音系列之列表播放视频(二)

前言 上一篇中,我们实现了仿抖音上下翻页切换视频的效果,这一篇,我们来实现抖音列表播放视频。 【Android 进阶】仿抖音系列之翻页上下滑切换视频(一) 【Android 进阶】仿抖音系列之列表播放视频(二) 【Android 进阶】仿抖音系列之列表播放视频(三) 【Android 进阶】仿抖音系列之翻页上下滑切换视频(四) 【Android 进阶】仿抖音系列之视频预览和录制(五) 之前也在...

weixin_34248849的博客 1195

Toro:为RecyclerView量身打造的视频列表自动播放库

在移动应用开发中,视频内容的展示和播放是一个常见但复杂的需求。特别是在使用RecyclerView来展示视频列表时,如何实现流畅的自动播放功能,一直是开发者面临的挑战。今天,我们要介绍的Toro库,正是为了解决这一难题而生。 ## 项目介绍 Toro是一个专为RecyclerView设计的视频列表自动播放库。它简化了在RecyclerView中实现视频自动播放的复杂性,提供了丰富的功能和灵活的...

gitblog_01173的博客 374

告别卡顿与闪屏:Android视频列表自动播放的终极解决方案

你是否曾经在开发视频列表应用时,被那些烦人的滚动卡顿、视频闪屏和内存溢出问题搞得焦头烂额?😫 在当今这个短视频盛行的时代,用户对于流畅的视频浏览体验有着极高的要求。今天,我要向你介绍一个能够彻底解决这些痛点的神器——AutoplayVideos,这是一个专为Android开发者设计的RecyclerView视频自动播放库。 想象一下,你的应用能够像TikTok或Instagram那样,当用户滚

gitblog_01007的博客 592

推荐开源项目:Toro - 简化视频播放的利器

在移动开发中,特别是在社交应用和媒体平台上,我们经常需要处理视频列表的自动播放功能。这通常涉及到复杂的交互逻辑以及与UI组件如`RecyclerView`的协同工作。这就是[Toro](https://github.com/eneim/toro)派上用场的地方。 ## 项目介绍 Toro是一个专为`RecyclerView`设计的库,旨在简化视频列表的自动播放。它可以根据用户的滚动行为智能地控...

gitblog_00052的博客 334

Android 列表视频 自动播放

视频列表自动播放技术方案总结 该方案实现了推荐页和新用户页的视频列表自动播放功能,主要技术要点: 播放器管理:采用ExoPlayer实现,通过单例VideoAutoPlayManager统一管理播放逻辑,确保播放器在合适时机启动和暂停。 播放时机控制: 仅当Tab和列表可见时才播放 列表滑动时暂停当前播放,停止滑动后在新可见项中随机选择播放 宿主页面不可见时自动暂停 关键技术难点解决: 播放失败问题:改用ExoPlayer并优化播放流程 视图绘制问题:调整容器可见性和尺寸约束 视频尺寸适配:保持3:4比例,

Android 领域开发程序员,希望通过写博客的方式不断的总结提升自己,大家共同进步哦! 521

Toro:让RecyclerView视频列表自动播放变得如此简单!完整入门指南

你是否曾为RecyclerView中的视频自动播放功能而烦恼?手动管理视频播放状态、处理滑动冲突、优化性能...这些问题是不是让你头疼不已?今天我要向大家介绍一款专为RecyclerView打造的视频自动播放解决方案——Toro!它能让视频列表的自动播放变得前所未有的简单,让你轻松实现专业级的视频播放体验。 [![Toro设计理念图](https://raw.gitcode.com/gh_mir

gitblog_00940的博客 386

Penpot 系统架构深度解析:Clojure 全栈 SPA、协作协议与各应用模块划分

> 本文围绕 [docs/technical-guide/developer/architecture/index.md](https://link.gitcode.com/i/8b36d9f12ae333b30e06e8618572a66c) 及其四个子文档展开,梳理 Penpot 的整体架构——一个典型的单页应用(SPA)形态,但前后端统一使用 Clojure 系语言,从整体容器划分、前端应用

gitblog_00940的博客 855
上一篇: DELETE_FAILED_INTERNAL_ERROR 小米之殇
下一篇: 在 Windows 7上安装 TensorFlow
Mackkill
博客等级 码龄15年 65粉丝 39原创
评论 21
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值