Android仿抖音列表效果

前端之家收集整理的这篇文章主要介绍了Android仿抖音列表效果前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

本文实例为大家分享了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,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仿抖音列表效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

猜你在找的Android相关文章