Android tiktok list effect

This article tiktok for example, we share the Android code for the list of imitation shaking sounds, for your reference, the specific content is as follows

Tiktok is very hot at the moment. Is it also very tempting to make a similar app?

Let's use recyclerview to realize this function. Just leave the recycling of memory to recyclerview.

First, let's talk about three interfaces related to video playback pause

public interface OnViewPagerListener {
 /**
  * 初始化
  */
 void onInitComplete(View view);

 /**
  * 释放
  */
 void onPageRelease(boolean isNext,int position,View view);

 /**
  * 选中
  */
 void onPageSelected(int position,boolean isBottom,View view);
}

Then customize the 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 tiktok list effect

The above is the whole content of this article. I hope it will help you in your study, and I hope you will support us a lot.

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>