Android短视频滑动播放(二)

作者: 几圈年轮 | 来源:发表于2019-12-26 19:50 被阅读0次

    Android短视频滑动播放(一)
    上一篇文章中讲到了短视频滑动的基本实现,文末也给出了相应的例子,可以运行查看,本节进一步完善滑动处理内容,主要给出了数据更新内容,下拉刷新最新内容,上拉预加载,可不断向下滑动;同时,介绍了视频的暂停、继续处理,循环播放或自动滑动到下一条以及多布局的处理。

    1. 数据刷新

    内容刷新布局采用了SwipeRefreshLayout,实现经典式的下拉刷新控制。

    <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
        android:id="@+id/srf_video_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/rv_little_video"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    
    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
    

    模拟数据请求,定义isLoadMoreData判断是刷新数据还是加载更多内容,isLoadingData判断是否正在加载数据,防止数据重复请求;

    /**
     * 数据请求
     */
    private void requestNewData() {
        if (!isLoadMoreData) {
            mRefreshView.setRefreshing(true);
        }
    
        isLoadingData = true;
    
        // 模拟网络请求,2秒后进行数据返回
        Log.e("PageIndex", String.valueOf(mLastProductIndex));
        mHandler.sendEmptyMessageDelayed(0, 2000);
    
    }
    

    Handler接收到消息,模拟接收到网络请求返回数据信息,进行数据更新;

    /**
     * 模拟网络请求完毕,数据更新
     */
    Handler mHandler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(@NonNull Message msg) {
            onVideoListUpdate(VideoBean.getTikTokVideoList());
            return false;
        }
    });
    

    数据更新,如果是刷新,则重新设置适配器内容,如果是记载更多则往适配器结合中加入更多数据内容。

    /**
     * 数据更新
     *
     * @param videoList 网络回调获取数据
     */
    public void onVideoListUpdate(List<VideoBean> videoList) {
        isEnd = videoList == null || videoList.size() < 10;
        isLoadingData = false;
        if (mRefreshView != null && mRefreshView.isRefreshing()) {
            mRefreshView.setRefreshing(false);
        }
        if (videoList == null) {
            return;
        }
        mLastProductIndex += videoList.size();
        if (isLoadMoreData) {
            // 加载更多数据
            if (mLittleVideoAdapter != null) {
                mLittleVideoAdapter.addData(videoList);
            }
        } else {
            // 刷新数据
            isEnd = false;
            mLittleVideoAdapter.setNewData(videoList);
        }
    }
    

    2. 预加载调用

    打开APP是请求数据内容,初始化时候,会展示SwipeRefreshLayout圆圈,请求完毕,进行数据展示;上拉刷视频时候,我们要提前加载适配器内容,减少用户等待时间,实现预加载。上一篇文章中讲到页面滑动后,会调用onPageSelected()方法,我们在播放视频前,进行判断是否需要加载更多视频,进行数据请求。

     * 页面附着,内容展示
     *
     * @param position 子布局在RecyclerView位置
     * @param isLast   是否最后一个
     */
    @Override
    public void onPageSelected(int position, boolean isLast) {
        if (mCurrentPosition == position && mLastStopPosition != position) {
            return;
        }
    
        // 预加载,请求数据内容
        int itemCount = mLittleVideoAdapter.getItemCount();
        if (itemCount - position < DEFAULT_PRELOAD_NUMBER && !isLoadingData && !isEnd) {
            // 正在加载中, 防止网络太慢或其他情况造成重复请求列表
            isLoadMoreData = true;
            isLoadingData = true;
            requestNewData();
        }
        if (itemCount == position + 1 && isEnd) {
            Toast.makeText(MainActivity.this, "No more video.", Toast.LENGTH_SHORT).show();
        }
        startPlay(position);
        mCurrentPosition = position;
    }
    

    3. 暂停、继续播放视频

    对于视频的暂停、播放,在空布局的播放器中加入播放按钮,初始化播放器时对布局点击事件进行处理,判断如果正在播放,点击暂停并显示按钮;反之,则进行播放,隐藏按钮,还可设置。

     private void init() {
        mTextureViewContainer.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (getGSYVideoManager().isPlaying()) {
                    getGSYVideoManager().pause();
                    mStartButton.setVisibility(View.VISIBLE);
                } else {
                    getGSYVideoManager().start();
                    mStartButton.setVisibility(View.GONE);
                }
            }
        });
    }
    

    4. 循环、自动滑动视频播放

    如果想要循环,则播放完毕后重新播放,或者设置播放器的循环播放参数为true即可;如若想自动滑动播放下一条视频,则对视频播放回调的事件中监听完成事件,结合RecyclerView的滑动事件即可完成。

    @Override
    public void onAutoComplete(String url, Object... objects) {
        super.onAutoComplete(url, objects);
    
        if (!isLoopPlay) {
            if (mCurrentPosition + 1 < mLittleVideoAdapter.getItemCount() ) {
                mRvLittleVideo.smoothScrollToPosition(mCurrentPosition + 1);
            }
        }
    
    }
    

    想要左右滑动,则可以将内容放到Fragment中,主页面采用ViewPager进行处理,就可以上下切换视频,左右切换其它页面;如果想要滑动视频中增加其它内容,对适配器进行多布局处理就可以了,推荐一款强大灵活的RecyclerAdapte:BaseRecyclerViewAdapterHelper,本例子中也同样使用的是这个,十分强大,用起来极为方便。

    关于短视频滑动播放例子暂且到此,供大家参考使用,效果图如下:

    短视频.gif

    源码实现:https://github.com/MickJson/LittleVideo

    欢迎点赞/评论,因为你们的赞同/鼓励是我写作的最大动力!

    欢迎关注公众号:几圈年轮,查看更多有趣的技术、工具、闲言、资源。


    公众号.png

    相关文章

      网友评论

        本文标题:Android短视频滑动播放(二)

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