欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android仿抖音列表效果

 更新時(shí)間:2019年09月08日 09:29:50   作者:xiangxiongfly  
這篇文章主要為大家詳細(xì)介紹了Android仿抖音列表效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Android仿抖音列表效果的具體代碼,供大家參考,具體內(nèi)容如下

當(dāng)下抖音非常火熱,是不是也很心動(dòng)做一個(gè)類似的app嗎?

那我們就用RecyclerView實(shí)現(xiàn)這個(gè)功能吧,關(guān)于內(nèi)存的回收利用就交給RecyclerView就好了。

首先我們先說3個(gè)和視頻播放暫停相關(guān)的接口

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;//位移,用來判斷移動(dòng)方向

 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);
 }

 /**
 * 滑動(dòng)狀態(tài)的改變
 * 緩慢拖拽-> SCROLL_STATE_DRAGGING
 * 快速滾動(dòng)-> SCROLL_STATE_SETTLING
 * 空閑狀態(tài)-> 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;
 }
 }


 /**
 * 監(jiān)聽豎直方向的相對(duì)偏移量
 *
 * @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);
 }

 /**
 * 監(jiān)聽水平方向的相對(duì)偏移量
 *
 * @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);
 }

 /**
 * 設(shè)置監(jiān)聽
 *
 * @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仿抖音列表效果

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論