实现朋友圈视频的滚动播放功能

作者: wxyass 分类: Android 发布时间: 2016-07-25 21:49

实现朋友圈视频的滚动播放功能

参考
https://github.com/danylovolokh/VideoPlayerManager
http://www.mamicode.com/info-detail-1331688.html
https://blog.csdn.net/wooder111/article/details/51513582/
https://www.cnblogs.com/You0/p/5716266.html

代码下载

一 设置可视估计器

接口类: ListItemsVisibilityCalculator
以及他的内部实现类 SingleListViewItemActiveCalculator

  • ListItemsVisibilityCalculator可以追踪滑动的方向并在滑动过程中计算每个Item的可见度
  • SingleListViewItemActiveCalculator为列表可视计算器,是ListItemsVisibilityCalculator的实现类,会在滑动时获取每个View的可见度百分比.用于判断列表中的视频那个是最佳播放项
  • 所以需要在SingleListViewItemActiveCalculator构造方法里需要传入mLists,而mLists里的每个item实现了ListItem接口的getVisibilityPercents方法,也就是返回当前item可见度的方法. 这样ListItemsVisibilityCalculator就可以计算当前item的可见度了.
// 构造
public VideoListFragment() {
    // 视频的列表
    mList = new ArrayList<>();
    // 列表可视计算器,用于判断列表中的视频那个是最佳播放项
    mVisibilityCalculator = new SingleListViewItemActiveCalculator(new DefaultSingleItemCalculatorCallback(), mList);
}

二 设置视频播放管理器

VideoPlayerManager
以及他的内部实现类 SingleVideoPlayerManager

  • SingleVideoPlayerManager就是只能同时播放一个视频,当一个view开始播放时,其它的就会停止
// 构造
public VideoListFragment() {
    // 视频的列表
    mList = new ArrayList<>();
    // 列表可视计算器,用于判断列表中的视频那个是最佳播放项
    mVisibilityCalculator = new SingleListViewItemActiveCalculator(new DefaultSingleItemCalculatorCallback(), mList);
    // 视频播放管理器,用于管理视频的播放器
    mVideoPlayerManager = new SingleVideoPlayerManager(new PlayerItemChangeListener() {
        @Override
        public void onPlayerItemChanged(MetaData metaData) {
        }
    });
}

三 设置RecyclerView

mRecyclerView.setHasFixedSize(true);// setHasFixedSize将RecyclerView的尺寸设置为固定,避免重绘
mLayoutManager = new LinearLayoutManager(getActivity());
mRecyclerView.setLayoutManager(mLayoutManager);// 将RecyclerView的滚动方向设置为竖直
VideoListAdapter adapter = new VideoListAdapter(mList);
mRecyclerView.setAdapter(adapter);   

四 定义位置提取器

接口类:ItemsPositionGetter
以及他的内部实现类 RecyclerViewItemPositionGetter

  • RecyclerViewItemPositionGetter是ItemsPositionGetter的实现类
  • 通过RecyclerViewItemPositionGetter的实例封装LinearLayoutManager和RecyclerView, 提供获取列表项信息的接口
  • RecyclerViewItemPositionGetter充当ListItemsVisibilityCalculator和列表(ListView, RecyclerView)之间的适配器(Adapter)
mItemsPositionGetter = new RecyclerViewItemPositionGetter(mLayoutManager, mRecyclerView);

五 设置滚动播放(多数为文档上默认的写法,直接复制下来)

/**
 * 滚动播放设置  //这里是文档上默认的写法,直接复制下来。
 *
 * 其中VisibilityCalculator.onScrollStateIdle又调用了方法calculateMostVisibleItem.
 * 用来计算滑动状态改变时的最大可见度的item. 这个方法的计算方法是这样的:
 * 在滚动的过程中,依次计算页面上每个item显示出来的高度。
 * 当滚动状态为空闲时,此时最后一个计算得出的可见度最大的item就是当前可见度最大的item
 * 而onScroll方法是处理item滚出屏幕后的计算,用于发现新的活动item
 */
private void autoViewPlaySetting() {
    // 通过RecyclerViewItemPositionGetter的实例封装LinearLayoutManager和RecyclerView, 提供获取列表项信息的接口
    mItemsPositionGetter = new RecyclerViewItemPositionGetter(mLayoutManager, mRecyclerView);

    // 设置RecyclerView的滚动监听
    mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        //当recycleView的滑动状态改变时回调
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int scrollState) {
            mScrollState = scrollState;
            if (scrollState == RecyclerView.SCROLL_STATE_IDLE && !mList.isEmpty()) {
                // SCROLL_STATE_IDLE:当前的recycleView不滚动了,整个滚动事件结束,只会触发一次
                mVisibilityCalculator.onScrollStateIdle(
                        mItemsPositionGetter,
                        mLayoutManager.findFirstVisibleItemPosition(),
                        mLayoutManager.findLastVisibleItemPosition());
            }
        }

        //当RecycleView滑动之后被回调
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            if (!mList.isEmpty()) {
                mVisibilityCalculator.onScroll(
                        mItemsPositionGetter,
                        mLayoutManager.findFirstVisibleItemPosition(),
                        mLayoutManager.findLastVisibleItemPosition() -
                                mLayoutManager.findFirstVisibleItemPosition() + 1,
                        mScrollState);
            }
        }
    });
}



//文档上的默认实现,复制下来
//onResume()中,屏幕亮起时,在mRecyclerView线程中,可视计算器启动对View的可见度的计算,播放露出最大比例的视频
@Override
public void onResume() {
    super.onResume();
    if (!mList.isEmpty()) {
        mRecyclerView.post(new Runnable() {
            @Override
            public void run() {
                // 判断一些滚动状态
                mVisibilityCalculator.onScrollStateIdle(
                        mItemsPositionGetter,
                        mLayoutManager.findFirstVisibleItemPosition(),
                        mLayoutManager.findLastVisibleItemPosition());

            }
        });
    }
}

// 页面关闭时,重置视频播放管理,暂停全部播放,准备下次启动
@Override
public void onStop() {
    super.onStop();
    mVideoPlayerManager.resetMediaPlayer(); // 页面不显示时, 释放播放器
} 

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注