短视频滑动播放

项目场景:

短视频列表滑动播放,当列表停止滑动后播放当前短视频


问题描述

当列表停止滑动后播放当前短视频,需要计算出要播放的索引


原因分析:

因为一屏一条完全可见的数据,要想实现功能,需要计算出屏幕中短视频显示高度最大的那条数据的做引


解决方案:

1.当列表停止滑动的时候计算出要播放短视频的索引

2.根据索引更改短视频的播放状态

这里要注意一下,因为一屏完全显示一条数据,所以通过此方法计算,如果一屏可以展示多条数据,随机播放其中一条,此方法可能不适用

 mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                switch (newState) {
                    case RecyclerView.SCROLL_STATE_IDLE: //滚动停止
                        LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
                        if (layoutManager != null) {
                            int currentViewIndex = getCurrentViewIndex(layoutManager);
                            if (mLastPosition != currentViewIndex) {
                                updateVideoPlayStatus(currentViewIndex);
                            }
                        }
                        break;
                }
            }
        });
  /**
     * 
     * @param layoutManager
     * @return  计算出要播放的短视频索引
     */
    private int getCurrentViewIndex(LinearLayoutManager layoutManager) {
        int firstVisibleItem = layoutManager.findFirstVisibleItemPosition();
        int lastVisibleItem = layoutManager.findLastVisibleItemPosition();
        int currentIndex = firstVisibleItem;
        int lastHeight = 0;
        for (int i = firstVisibleItem; i <= lastVisibleItem; i++) {
            View view = layoutManager.getChildAt(i - firstVisibleItem);
            if (null == view) {
                continue;
            }

            int[] location = new int[2];
            view.getLocationOnScreen(location);

            Rect localRect = new Rect();
            view.getLocalVisibleRect(localRect);

            int showHeight = localRect.bottom - localRect.top;
            if (showHeight > lastHeight) {
                currentIndex = i;
                lastHeight = showHeight;
            }
        }

        if (currentIndex < 0) {
            currentIndex = 0;
        }
        return currentIndex;
    }
 /**
     * 更新播放状态
     * @param position  当前要播放的短视频索引
     */
    private void updateVideoPlayStatus(int position) {

        mLastPosition = position;
        ArrayList<FindBean.ListBean> list = getList();
        if (list != null && list.size() > 0) {
            for (int i = 0; i < list.size(); i++) {
                FindBean.ListBean listBean = list.get(i);
                if (i == position) {
                    listBean.playVideo = true;
                } else {
                    listBean.playVideo = false;
                }
            }
        }
        getAdapter().notifyDataSetChanged();
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值