Android仿抖音列表效果
2019-09-08 09:29
2141 查看
本文实例为大家分享了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, 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); } /** * 滑动状态的改变 * 缓慢拖拽-> 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.Recycler recycler, RecyclerView.State state) { this.mDrift = dx; return super.scrollHorizontallyBy(dx, recycler, 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, 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仿抖音列表效果
以上就是本文的全部内容,希望对大家的学习有所帮助
您可能感兴趣的文章:
相关文章推荐
- Android Listview 分栏显示 - 实现百度应用下载模块列表效果
- Android 仿联系人列表 实现ListView的A-Z字母排序和过滤搜索功能,并挤压效果(一)
- Android高仿微信对话列表滑动删除效果
- 实现类似Android Grid效果的列表视图
- Android开发之自定义view实现通讯录列表A~Z字母提示效果【附demo源码下载】
- Android中RecyclerView实现多级折叠列表效果(二)
- Android列表组件ListView使用详解之取消子项的点击效果
- Android ExpandableListView实现QQ好友列表效果
- [置顶] Android实现列表抽屉展示效果
- 仿android手机qq消息列表中删除按钮效果
- Android 在列表List中显示半透明小窗体效果的控件
- Android 使用RecyclerView实现列表item重叠效果(使用addItemDecoration方法)
- Android单个RecyclerView实现列表嵌套的效果
- 最近较流行的效果 Android自定义View实现倾斜列表/图片
- Android中RecyclerView实现多级折叠列表效果(TreeRecyclerView)
- AndroidUI 布局动画-为列表添加布局动画效果
- android listview实现新闻列表展示效果
- android仿QQ消息列表拖拽气泡效果源码读后感(1)
- android 4.1.2 launcher2实现像4.4launcher3应用列表背景透明的效果
- Android 仿微信对话列表滑动删除效果