Android仿抖音列表效果
本文實例為大家分享了Android仿抖音列表效果的具體代碼,供大家參考,具體內(nèi)容如下

當下抖音非?;馃幔遣皇且埠苄膭幼鲆粋€類似的app嗎?
那我們就用RecyclerView實現(xiàn)這個功能吧,關于內(nèi)存的回收利用就交給RecyclerView就好了。
首先我們先說3個和視頻播放暫停相關的接口
public interface OnViewPagerListener {
/**
* 初始化
*/
void onInitComplete(View view);
/**
* 釋放
*/
void onPageRelease(boolean isNext, int position, View view);
/**
* 選中
*/
void onPageSelected(int position, boolean isBottom, View view);
}
然后自定義LinearLayoutManager
public class PagerLayoutManager extends LinearLayoutManager {
private PagerSnapHelper mPagerSnapHelper;
private OnViewPagerListener mOnViewPagerListener;
private RecyclerView mRecyclerView;
private int mDrift;//位移,用來判斷移動方向
public PagerLayoutManager(Context context, int orientation) {
super(context, orientation, false);
init();
}
public PagerLayoutManager(Context context, int orientation, boolean reverseLayout) {
super(context, orientation, reverseLayout);
init();
}
private void init() {
mPagerSnapHelper = new PagerSnapHelper();
}
@Override
public void onAttachedToWindow(RecyclerView view) {
super.onAttachedToWindow(view);
mPagerSnapHelper.attachToRecyclerView(view);
this.mRecyclerView = view;
mRecyclerView.addOnChildAttachStateChangeListener(mChildAttachStateChangeListener);
}
@Override
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
super.onLayoutChildren(recycler, state);
}
/**
* 滑動狀態(tài)的改變
* 緩慢拖拽-> SCROLL_STATE_DRAGGING
* 快速滾動-> SCROLL_STATE_SETTLING
* 空閑狀態(tài)-> SCROLL_STATE_IDLE
*
* @param state
*/
@Override
public void onScrollStateChanged(int state) {
switch (state) {
case RecyclerView.SCROLL_STATE_IDLE:
View viewIdle = mPagerSnapHelper.findSnapView(this);
if (viewIdle != null) {
int positionIdle = getPosition(viewIdle);
if (mOnViewPagerListener != null && getChildCount() == 1) {
mOnViewPagerListener.onPageSelected(positionIdle, positionIdle == getItemCount() - 1, viewIdle);
}
}
break;
case RecyclerView.SCROLL_STATE_DRAGGING:
View viewDrag = mPagerSnapHelper.findSnapView(this);
if (viewDrag != null) {
int positionDrag = getPosition(viewDrag);
}
break;
case RecyclerView.SCROLL_STATE_SETTLING:
View viewSettling = mPagerSnapHelper.findSnapView(this);
if (viewSettling != null) {
int positionSettling = getPosition(viewSettling);
}
break;
}
}
/**
* 監(jiān)聽豎直方向的相對偏移量
*
* @param dy
* @param recycler
* @param state
* @return
*/
@Override
public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) {
this.mDrift = dy;
return super.scrollVerticallyBy(dy, recycler, state);
}
/**
* 監(jiān)聽水平方向的相對偏移量
*
* @param dx
* @param recycler
* @param state
* @return
*/
@Override
public int scrollHorizontallyBy(int dx, RecyclerView.Recycler recycler, RecyclerView.State state) {
this.mDrift = dx;
return super.scrollHorizontallyBy(dx, recycler, state);
}
/**
* 設置監(jiān)聽
*
* @param listener
*/
public void setOnViewPagerListener(OnViewPagerListener listener) {
this.mOnViewPagerListener = listener;
}
private RecyclerView.OnChildAttachStateChangeListener mChildAttachStateChangeListener = new RecyclerView.OnChildAttachStateChangeListener() {
/**
* itemView依賴Window
*/
@Override
public void onChildViewAttachedToWindow(View view) {
if (mOnViewPagerListener != null && getChildCount() == 1) {
mOnViewPagerListener.onInitComplete(view);
}
}
/**
*itemView脫離Window
*/
@Override
public void onChildViewDetachedFromWindow(View view) {
if (mDrift >= 0) {
if (mOnViewPagerListener != null)
mOnViewPagerListener.onPageRelease(true, getPosition(view), view);
} else {
if (mOnViewPagerListener != null)
mOnViewPagerListener.onPageRelease(false, getPosition(view), view);
}
}
};
}
然后大功告成直接使用
recyclerView = findViewById(R.id.recycler_view);
PagerLayoutManager mLayoutManager = new PagerLayoutManager(this, OrientationHelper.VERTICAL);
mDatas.addAll(DataUtils.getDatas());
mAdapter = new VideoAdapter(this, mDatas);
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setAdapter(mAdapter);
mLayoutManager.setOnViewPagerListener(new OnViewPagerListener() {
@Override
public void onInitComplete(View view) {
playVideo(0, view);
}
@Override
public void onPageSelected(int position, boolean isBottom, View view) {
playVideo(position, view);
}
@Override
public void onPageRelease(boolean isNext, int position, View view) {
int index = 0;
if (isNext) {
index = 0;
} else {
index = 1;
}
releaseVideo(view);
}
});
/**
* 播放視頻
*/
private void playVideo(int position, View view) {
if (view != null) {
mVideoView = view.findViewById(R.id.video_view);
mVideoView.start();
}
}
/**
* 停止播放
*/
private void releaseVideo(View view) {
if (view != null) {
IjkVideoView videoView = view.findViewById(R.id.video_view);
videoView.stopPlayback();
}
}
github:Android仿抖音列表效果
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Android?獲取手機已安裝的應用列表實現(xiàn)詳解
這篇文章主要介紹了Android?獲取手機已安裝的應用列表的實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08
Android 調(diào)用系統(tǒng)應用的方法總結
這篇文章主要介紹了Android 調(diào)用系統(tǒng)應用的方法總結的相關資料,這里提供調(diào)用錄像,錄音,拍照等功能,需要的朋友可以參考下2017-08-08
Android使用Rotate3dAnimation實現(xiàn)3D旋轉動畫效果的實例代碼
利用Android的ApiDemos的Rotate3dAnimation實現(xiàn)了個圖片3D旋轉的動畫,圍繞Y軸進行旋轉,還可以實現(xiàn)Z軸的縮放。點擊開始按鈕開始旋轉,點擊結束按鈕停止旋轉。2018-05-05
Android開發(fā)之sqlite3命令行簡單使用方法
這篇文章主要介紹了Android開發(fā)之sqlite3命令行簡單使用方法,分析了Android增刪改查等常用sqlite3的數(shù)據(jù)庫操作命令使用方法,需要的朋友可以參考下2016-02-02

