软件编程
位置:首页>> 软件编程>> Android编程>> Android仿抖音列表效果

Android仿抖音列表效果

作者:xiangxiongfly  发布时间:2022-03-01 16:36:50 

标签: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, 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仿抖音列表效果

来源:https://blog.csdn.net/qq_14876133/article/details/82790708

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com