本文实例为大家分享了Android仿抖音列表效果的具体代码,供大家参考,具体内容如下
当下抖音非常火热,是不是也很心动做一个类似的app吗?
那我们就用RecyclerView实现这个功能吧,关于内存的回收利用就交给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,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); } /** * 滑动状态的改变 * 缓慢拖拽-> SCROLL_STATE_DRAGGING * 快速滚动-> SCROLL_STATE_SETTLING * 空闲状态-> 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; } } /** * 监听竖直方向的相对偏移量 * * @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); } /** * 监听水平方向的相对偏移量 * * @param dx * @param recycler * @param state * @return */ @Override public int scrollHorizontallyBy(int dx,RecyclerView.State state) { this.mDrift = dx; return super.scrollHorizontallyBy(dx,state); } /** * 设置监听 * * @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,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,View view) { playVideo(position,view); } @Override public void onPageRelease(boolean isNext,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仿抖音列表效果