在GitHub上面看了GSYVideoPlayer的demo代码,发现视频列表自动播放势必是不是很准确,然后结合了饺子播放器的demo代码整理了相关自动播放的代码
var linearLayoutManager = LinearLayoutManager(context, RecyclerView.VERTICAL, false)
recyclerView.layoutManager = linearLayoutManager
1/在这里注册RecyclerView的滑动监听
recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
super.onScrollStateChanged(recyclerView, newState)
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
AutoPlayUtils.onScrollPlayVideo(
recyclerView,
R.id.player,
linearLayoutManager!!.findFirstVisibleItemPosition(),
linearLayoutManager!!.findLastVisibleItemPosition()
)
}
}
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
if (dy != 0) {
AutoPlayUtils.onScrollReleaseAllVideos(
linearLayoutManager!!.findFirstVisibleItemPosition(),
linearLayoutManager!!.findLastVisibleItemPosition(),
0.2f
)
}
}
})
2/自定义CoverVideo View并继承GSYVideoPlayer
public class CoverVideo extends StandardGSYVideoPlayer {
public static CoverVideo CURRENT_VIDEO;
@Override
public void startPlayLogic() {
CURRENT_VIDEO = this;
super.startPlayLogic();
}
}
3/AutoPlayUtils具体滚动判断的类
/**
* 列表自动播放工具类
*
* @author Liberations
*/
object AutoPlayUtils {
var positionInList = -1 //记录当前播放列表位置
/**
* @param firstVisiblePosition 首个可见item位置
* @param lastVisiblePosition 最后一个可见item位置
*/
fun onScrollPlayVideo(
recyclerView: RecyclerView,
jzvdId: Int,
firstVisiblePosition: Int,
lastVisiblePosition: Int
) {
for (i in 0..lastVisiblePosition - firstVisiblePosition) {
val child = recyclerView.getChildAt(i)
val view = child.findViewById<View>(jzvdId)
if (view != null && view is CoverVideo) {
if (getViewVisiblePercent(view) == 1f) {
if (positionInList != i + firstVisiblePosition) {
if (view.currentState != GSYVideoView.CURRENT_STATE_PLAYING) {
if (CoverVideo.CURRENT_VIDEO != null) {
//释放之前的view
CoverVideo.CURRENT_VIDEO.release()
CoverVideo.CURRENT_VIDEO = null
}
view.startPlayLogic()
}
}
break
}
}
}
}
/**
* @param firstVisiblePosition 首个可见item位置
* @param lastVisiblePosition 最后一个可见item位置
* @param percent 当item被遮挡percent/1时释放,percent取值0-1
*/
fun onScrollReleaseAllVideos(
firstVisiblePosition: Int,
lastVisiblePosition: Int,
percent: Float
) {
if (CoverVideo.CURRENT_VIDEO == null) return
if (positionInList >= 0) {
if (positionInList <= firstVisiblePosition || positionInList >= lastVisiblePosition - 1) {
if (getViewVisiblePercent(CoverVideo.CURRENT_VIDEO) < percent) {
CoverVideo.CURRENT_VIDEO.release()
CoverVideo.CURRENT_VIDEO = null
}
}
}
}
/**
* @param view
* @return 当前视图可见比列
*/
fun getViewVisiblePercent(view: View?): Float {
if (view == null) {
return 0f
}
val height = view.height.toFloat()
val rect = Rect()
if (!view.getLocalVisibleRect(rect)) {
return 0f
}
val visibleHeight = (rect.bottom - rect.top).toFloat()
return visibleHeight / height
}
}
(在此感谢GSYVideoPlayer和饺子播放器的作者的无私分享)

1万+

被折叠的 条评论
为什么被折叠?



