Skip to content
This repository has been archived by the owner on Aug 9, 2022. It is now read-only.

增加RecycleView 滑动监听,实现自动播放可见区域内的第一个视频Item #1671

Closed
wants to merge 7 commits into from
Closed
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
122 changes: 122 additions & 0 deletions app/src/main/java/cn/jzvd/demo/ActivityListViewRecyclerView.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package cn.jzvd.demo;

import android.graphics.Rect;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
Expand All @@ -13,6 +14,7 @@
import cn.jzvd.JZUtils;
import cn.jzvd.JZVideoPlayer;
import cn.jzvd.JZVideoPlayerManager;
import cn.jzvd.JZVideoPlayerStandard;

/**
* Created by yujunkui on 16/8/29.
Expand Down Expand Up @@ -52,6 +54,7 @@ public void onChildViewDetachedFromWindow(View view) {
}
}
});
recyclerView.addOnScrollListener(new FeedScrollListener());
}

@Override
Expand All @@ -78,4 +81,123 @@ public boolean onOptionsItemSelected(MenuItem item) {
return super.onOptionsItemSelected(item);
}

/**
* 监听recycleView滑动状态,
* 自动播放可见区域内的视频
*/
private static class FeedScrollListener extends RecyclerView.OnScrollListener {

private int firstVisibleItem = 0;
private int lastVisibleItem = 0;
private int visibleCount = 0;

/**
* 视频状态标签
*/
private enum VideoTagEnum {

/**
* 自动播放视频
*/
TAG_AUTO_PLAY_VIDEO,

/**
* 暂停视频
*/
TAG_PAUSE_VIDEO
}



@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
Copy link
Author

@SiXuManYan SiXuManYan Mar 8, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

根据自己需要来决定是否调用
super.onScrollStateChanged(recyclerView, newState);
以及
super.onScrolled(recyclerView, dx, dy);


// TODO 这可以加上 wifi 下自动播放视频开关
// if (wifiTag) {
switch (newState) {
case RecyclerView.SCROLL_STATE_IDLE:
autoPlayVideo(recyclerView, VideoTagEnum.TAG_AUTO_PLAY_VIDEO);
default:
autoPlayVideo(recyclerView, VideoTagEnum.TAG_PAUSE_VIDEO);
break;
}
// } else {
// JZVideoPlayer.releaseAllVideos();
// }
}

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

RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();

if (layoutManager instanceof LinearLayoutManager) {

LinearLayoutManager linearManager = (LinearLayoutManager) layoutManager;

firstVisibleItem = linearManager.findFirstVisibleItemPosition();
lastVisibleItem = linearManager.findLastVisibleItemPosition();
visibleCount = lastVisibleItem - firstVisibleItem
//TODO + headerView 的个数 ?
;
}

}

/**
* 循环遍历 可见区域的播放器
* 然后通过 getLocalVisibleRect(rect)方法计算出哪个播放器完全显示出来
* <p>
* getLocalVisibleRect相关链接:http://www.cnblogs.com/ai-developers/p/4413585.html
*
* @param view
* @param handleVideoTag 视频需要进行状态
*/
private void autoPlayVideo(RecyclerView view, VideoTagEnum handleVideoTag) {
for (int i = 0; i < visibleCount; i++) {
if (view != null && view.getChildAt(i) != null && view.getChildAt(i).findViewById(R.id.videoplayer) != null) {
JZVideoPlayerStandard homeGSYVideoPlayer = (JZVideoPlayerStandard) view.getChildAt(i).findViewById(R.id.videoplayer);

Rect rect = new Rect();
homeGSYVideoPlayer.getLocalVisibleRect(rect);
int videoheight = homeGSYVideoPlayer.getHeight();
if (rect.top == 0 && rect.bottom == videoheight) {
handleVideo(handleVideoTag, homeGSYVideoPlayer);
// 借助跳出循环,达到只处理可见区域内的第一个播放器
break ;
}
}
}

}

/**
* 视频状态处理
* @param handleVideoTag 视频需要进行状态
* @param homeGSYVideoPlayer JZVideoPlayer播放器
*/
private void handleVideo(VideoTagEnum handleVideoTag, JZVideoPlayerStandard homeGSYVideoPlayer) {
switch (handleVideoTag) {
case TAG_AUTO_PLAY_VIDEO:
if ((homeGSYVideoPlayer.currentState != JZVideoPlayerStandard.CURRENT_STATE_PLAYING)) {
// 进行播放
homeGSYVideoPlayer.startVideo();
}
break;
case TAG_PAUSE_VIDEO:
if ((homeGSYVideoPlayer.currentState != JZVideoPlayerStandard.CURRENT_STATE_PAUSE)) {
// 模拟点击播放Button,实现暂停视频
homeGSYVideoPlayer.startButton.performClick();
}
break;
default:
break;
}
}


}

}