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,本例子中也同樣使用的是這個,十分強大,用起來極為方便。
關於短視頻滑動播放例子暫且到此,供大家參考使用,效果圖如下:
源碼實現:https://github.com/MickJson/LittleVideo
歡迎關注公眾號:幾圈年輪,查看更多有趣的技術、工具、閑言、資源。