Android 列表视频滑动自动播放(实现思路)

发布于:2024-06-16 ⋅ 阅读:(24) ⋅ 点赞:(0)

1、列表(RecyclerView)中内容包含视频,列表在快速滑动时候,如果每个视频自动播放,会导致页面卡顿。我们优化思路,通过监听RecyclerView滑动状态,来实现当停止滑动时候,来播放视频

滑动监听:recyclerView.addOnScrollListener(this)

实现具体方法:onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState)

newState:

RecyclerView.SCROLL_STATE_IDLE: //滑动停止

RecyclerView.SCROLL_STATE_DRAGGING: //手指拖动

RecyclerView.SCROLL_STATE_SETTLING: //惯性滚动

这里只介绍SCROLL_STATE_IDLE来处理滑动停止,自动播放相关思路和逻辑

 public void startVideo() {
        //第一步:获取LinearLayoutManager
        LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
        if (layoutManager != null) {
            //第二步:获取当前第一个显示itemView的position,并得到这条数据是否有视频
            int findFirstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition();
            //第三步:获取当前itemView的 ViewHolder,并通过获取视频播放控件
            ViewHolder viewHolder = (ViewHolder) recyclerView.findViewHolderForAdapterPosition(findFirstVisibleItemPosition);
            VideoView videoView = viewHolder.itemView.findViewById(R.id.videoView);
            //计算视频播放控件,显示比例,当>=50%,则播放当前,否则寻找下一条显示item,播放
            Rect itemRect = new Rect();
            videoView.getLocalVisibleRect(itemRect);
            int visibleHeight = itemRect.bottom - itemRect.top;
            int totalHeight = videoView.getHeight();
            float visibleRatio = (float) visibleHeight / totalHeight;
            if (visibleRatio >= 0.5f) {
                //播放视频

            } else {
                //第二个显示视频
                //获取已显示最后一条数据position
                int lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();
                int firstPosition = findFirstVisibleItemPosition + 1;
                if (firstPosition <= lastVisibleItemPosition) {
                    //遍历,找到有视频的position
                    for (int i = firstPosition; i < lastVisibleItemPosition; i++) {
                        //当前有视频播放
                        //计算视频播放控件,显示比例,当>=50%,则播放当前,否则寻找下一条显示item,播放
                         viewHolder = (ViewHolder) recyclerView.findViewHolderForAdapterPosition(i);
                         videoView = viewHolder.itemView.findViewById(R.id.videoView);
                         itemRect = new Rect();
                        videoView.getLocalVisibleRect(itemRect);
                         visibleHeight = itemRect.bottom - itemRect.top;
                         totalHeight = videoView.getHeight();
                         visibleRatio = (float) visibleHeight / totalHeight;
                        if (visibleRatio >= 0.5f) {
                            //播放视频,结束循环

                            return;
                        }
                    }
                }
            }

        }
    }

SCROLL_STATE_DRAGGING(SCROLL_STATE_DRAGGING)我们需要暂停已经在播放的视频,我已经知道播放的是哪个position

  public void stopVideo() {
        //当前播放视频角标,是否在播放,
        if (startPosition >= 0) {
            ViewHolder viewHolder = (ViewHolder) recyclerView.findViewHolderForAdapterPosition(startPosition);
            if (viewHolder != null) {
                VideoView videoView = viewHolder.itemView.findViewById(R.id.videoView);
                if (videoView != null) {
                    videoView.pause();
                }
                //停止播放,设置再播放未-1,表示未有播放视频
                startPosition = -1;
            }
        }
    }