Android 列表视频滑动自动播放(实现思路)
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 =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;
}
}
}