안 드 로 이 드 모 의 틱 톡 목록 효과

본 논문 의 사례 는 안 드 로 이 드 가 틱 톡 목록 효 과 를 모방 하 는 구체 적 인 코드 를 공유 하여 여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.

지금 틱 톡 이 너무 뜨 거 워 요.설 레 고 비슷 한 앱 을 만 들 고 있 죠?
그럼 우 리 는 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: 안 드 로 이 드 모 의 틱 톡 목록 효과
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기