Android仿抖音列表效果

 更新时间:2019年09月08日 09:29:50   作者:xiangxiongfly   我要评论

这篇文章主要为大家详细介绍了Android仿抖音列表效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了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布局之FrameLayout帧布局

    Android布局之FrameLayout帧布局

    这篇文章主要介绍了Android布局之FrameLayout帧布局的相关资料,需要的朋友可以参考下
    2015-12-12
  • Android线程管理之ActivityThread

    Android线程管理之ActivityThread

    线程通信、ActivityThread及Thread类是理解Android线程管理的关键。通过本文给大家介绍Android线程管理之ActivityThread 的相关知识,对android线程管理相关知识感兴趣的朋友一起学习吧
    2016-01-01
  • TabLayout关联ViewPager后不显示文字的解决方法

    TabLayout关联ViewPager后不显示文字的解决方法

    这篇文章主要为大家详细介绍了TabLayout关联ViewPager后不显示文字的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • RecyclerView实现侧滑拖拽功能

    RecyclerView实现侧滑拖拽功能

    这篇文章主要为大家详细介绍了RecyclerView实现侧滑拖拽功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • Android开发之超强图片工具类BitmapUtil完整实例

    Android开发之超强图片工具类BitmapUtil完整实例

    这篇文章主要介绍了Android开发之超强图片工具类BitmapUtil,结合完整实例形式分析了Android图片的常用操作技巧,包括图片的加载、转换、缩放、计算等相关操作技巧,需要的朋友可以参考下
    2017-11-11
  • Android获取手机联系人电话号码并返回结果

    Android获取手机联系人电话号码并返回结果

    这篇文章主要为大家详细介绍了Android获取手机联系人电话号码并返回结果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • Android AndBase框架使用封装好的函数完成Http请求(三)

    Android AndBase框架使用封装好的函数完成Http请求(三)

    这篇文章主要介绍了Android AndBase框架使用封装好的函数完成Http请求的相关资料,感兴趣的小伙伴们可以参考一下
    2016-03-03
  • Android中对xml文件解析的3种方式总结

    Android中对xml文件解析的3种方式总结

    这篇文章主要给大家介绍了关于Android中对xml文件解析的3种方式,分别是 Dom 、 SAX 和 dom4j,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2018-02-02
  • android service实现循环定时提醒功能

    android service实现循环定时提醒功能

    这篇文章主要为大家详细介绍了android service实现循环定时提醒功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Android编程之短信窃听器实现方法

    Android编程之短信窃听器实现方法

    这篇文章主要介绍了Android编程之短信窃听器实现方法,以实例形式较为详细的分析了Android编程实现窃听器的具体步骤与实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11

最新评论