本文实例为大家分享了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();

}

}

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

Android高仿抖音滚动聊天,Android仿抖音列表效果相关推荐

  1. Android仿QQ、微信聊天界面长按提示框效果

    最近在工作项目中要实现一个长按提示 "复制" 的功能,类似于QQ.微信聊天界面长按提示框效果,本来想偷懒在网上找个开源的项目用,但是看了好几个都不是很满意,所以就打算按照自己的思路 ...

  2. Android文本长按qq风格,Android仿QQ、微信聊天界面长按提示框效果

    先来看看效果图 如何使用 示例代码 PromptViewHelper pvHelper = new PromptViewHelper(mActivity); pvHelper.setPromptVie ...

  3. 制作android动态壁纸,使用视差滚动制作Android动态壁纸

    我正在创建一个实时壁纸与视差滚动.我读过这篇文章:Parallax effect scrolling of live wallpaper background.但当我改变桌面时,背景移动错误(如果我改 ...

  4. android 高版本(设备11的)wifi扫描,获取wifi列表

    需求场景:智能设备有wifi模块,整套wifi功能,包括:搜索wifi列表,wifi连接,wifi切换,wifi忘记密码等. 高版本(安卓8以上)为了省电,节流,谷歌对wifi限制越来越多,安卓9以上 ...

  5. react仿微信web版聊天室|仿微信客户端react版

    基于react+react-dom+react-router-dom+redux+react-redux+webpack+nodeJs等技术混合开发的手机端仿微信界面聊天室--reactChatRoo ...

  6. android文字多行滚动显示,Android TextView多行文本滚动实现

    Android中我们为了实现文本的滚动可以在ScrollView中嵌入一个TextView,其实TextView自己也可以实现多行滚动的,毕竟ScrollView必须只能有一个直接的子类布局.只要在l ...

  7. 基于android的高仿抖音,Android仿抖音列表效果

    本文实例为大家分享了Android仿抖音列表效果的具体代码,供大家参考,具体内容如下 当下抖音非常火热,是不是也很心动做一个类似的app吗? 那我们就用RecyclerView实现这个功能吧,关于内存 ...

  8. android直播聊天室图文混排效果,仿抖音直播聊天室换行内容TextView+ReplacementSpan...

    一.抖音聊天室文本,看似简单并非简单 抖音文本换行. 二.实现方案TextView + ReplacementSpan 方案思路 利用span原理,继承ReplacementSpan,自定义VIewS ...

  9. android仿抖音关注列表,Android仿抖音列表效果

    本文实例为大家分享了Android仿抖音列表效果的具体代码,供大家参考,具体内容如下 当下抖音非常火热,是不是也很心动做一个类似的app吗? 那我们就用RecyclerView实现这个功能吧,关于内存 ...

最新文章

  1. 《Adobe Fireworks CS5中文版经典教程》——导读
  2. Clean-Code: 注释
  3. 待办事项优先级 开发_如何通过创建主题待办事项确定学习内容的优先级
  4. 设备树下字符设备驱动
  5. MySQL 如何优化 CPU 消耗?
  6. 昆明二级计算机考试报名时间2015,4月15日开始网上报名!云南省2021年上半年中小学教师资格考试(面试)安排来了——昆明广播电视台...
  7. 让IE6、IE7、IE8支持CSS3的圆角、阴影样式
  8. GDCM:gdcm::StrictScanner的测试程序
  9. 利用 AVDictionary 配置参数
  10. 具有Azure功能的无服务器API
  11. 无限分级 层次输出 demo
  12. 霸气!任正非:即使美企断供 也无法威胁华为生存
  13. 操作元素之修改元素属性
  14. 从二进制数据流中构造GDAL可以读取的图像数据
  15. Eclipse Egit 安装
  16. Python eval 函数使用报错 name 'false' is not defined 已解决
  17. cscope.exe程序的base64文本
  18. windows各类密码搜集
  19. vscode——VScode 中 使用 comment translate翻译 插件
  20. 中国车牌号的识别大全

热门文章

  1. win10计算机的六个文件夹,Windows10系统删除此电脑中6个文件夹的方法
  2. seo和php哪个容易学,php好学吗?和其它语言比哪个好学?
  3. ArcGIS制作区位图教程
  4. 抖音视频上热门的推荐机制是什么?
  5. 网络工程师成长日记369-中铁20局延安更换路由器项目
  6. 【判断字符的合法性】
  7. python学习教程9-对学生成绩单进行排序
  8. jQueryajaxjson
  9. 摸鱼气象Python教案代码分享
  10. ps裁剪和裁切的区别_【后期修图】ps新手入门:裁剪工具全解析!