美文网首页
RecycleView内容流中实现视频自动播放

RecycleView内容流中实现视频自动播放

作者: AnduinLothar | 来源:发表于2018-12-18 21:08 被阅读0次

    这周的一个需求,需要实现内容流自动播放,item布局在显示区域达到1/3时开始播放,或者停止播放。
    1.首先需要判断每个item中的显示大小是否达到1/3,不足1/3 则视为被盖住了

    public boolean isCover() {
            boolean cover = false;
            Rect rect = new Rect();
    // 此方法的返回值返回是否view有可见区域,哪怕只有1px的地方可见就会返回true,传入的rect中会存入显示区域的大小信息
            cover = mediaGroup.getGlobalVisibleRect(rect);
            ViewGroup.LayoutParams params = mediaGroup.getLayoutParams();
            KLog.d("Item isCover :" + rect.width()+"--"+ rect.height()+"--"+rect.top+"--"+ rect.bottom +"--para: "+params.width+" height:"+ params.height);
            if (cover) {
                if (rect.height() >= params.height/3) {
                    return false;
                }
            }
            return true;
        }
    
    1. 之后需要在Recyclerview停止滑动时判断当前应该播放的位置,还需要和上一个播放的对象进行对比,判断是否是一个位置,first 和last 可以通过layoutmanager的findFirstVisibleItemPosition()和 findLastVisibleItemPosition() 来获取
    case RecyclerView.SCROLL_STATE_IDLE:
                            int newPosition = getFirstPlayPosition(first, last);
                            KLog.d("onScrollStateChanged SCROLL_STATE_IDLE :" + newPosition + " -- " + position);
                            if (newPosition == -1){
    // 实践中发现,linearLayoutManager 和 recyclerView的childAt方法返回的itemview大部分是空的,推荐用这个方法来获取 findViewByPosition(position)
                                View view =linearLayoutManager.findViewByPosition(position);
                                if (view != null && view instanceof ItemLayout&&((ItemLayout) view).isCover()){
                                    JCVideoPlayerStandard.releaseAllVideos();
                                    position = 0;
                                }
                                return;
                            }
     // 如果新位置比原来的位置小,那么取最后一个满足要求的item位置
                            if (newPosition < position){
                                // put down
                                newPosition = getLastPlayPosition(first, last);
                            }
                            if (newPosition == position){
                                return;
                            }
                            if (linearLayoutManager.findViewByPosition(position) != null &&
                                    (linearLayoutManager.findViewByPosition(position) instanceof ItemLayout)) {
                                JCVideoPlayer.releaseAllVideos();
                            }
                            ((ItemLayout) linearLayoutManager.findViewByPosition(newPosition)).playVideo();
                            position = newPosition;
    

    大概内容就是这些,做的时候判断显示区域面积的时候不好弄,记下来加深记忆,比较菜,有好的意见欢迎大家提出来

    相关文章

      网友评论

          本文标题:RecycleView内容流中实现视频自动播放

          本文链接:https://www.haomeiwen.com/subject/ujdrkqtx.html