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();
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
Android高仿抖音滚动聊天,Android仿抖音列表效果相关推荐
- Android仿QQ、微信聊天界面长按提示框效果
最近在工作项目中要实现一个长按提示 "复制" 的功能,类似于QQ.微信聊天界面长按提示框效果,本来想偷懒在网上找个开源的项目用,但是看了好几个都不是很满意,所以就打算按照自己的思路 ...
- Android文本长按qq风格,Android仿QQ、微信聊天界面长按提示框效果
先来看看效果图 如何使用 示例代码 PromptViewHelper pvHelper = new PromptViewHelper(mActivity); pvHelper.setPromptVie ...
- 制作android动态壁纸,使用视差滚动制作Android动态壁纸
我正在创建一个实时壁纸与视差滚动.我读过这篇文章:Parallax effect scrolling of live wallpaper background.但当我改变桌面时,背景移动错误(如果我改 ...
- android 高版本(设备11的)wifi扫描,获取wifi列表
需求场景:智能设备有wifi模块,整套wifi功能,包括:搜索wifi列表,wifi连接,wifi切换,wifi忘记密码等. 高版本(安卓8以上)为了省电,节流,谷歌对wifi限制越来越多,安卓9以上 ...
- react仿微信web版聊天室|仿微信客户端react版
基于react+react-dom+react-router-dom+redux+react-redux+webpack+nodeJs等技术混合开发的手机端仿微信界面聊天室--reactChatRoo ...
- android文字多行滚动显示,Android TextView多行文本滚动实现
Android中我们为了实现文本的滚动可以在ScrollView中嵌入一个TextView,其实TextView自己也可以实现多行滚动的,毕竟ScrollView必须只能有一个直接的子类布局.只要在l ...
- 基于android的高仿抖音,Android仿抖音列表效果
本文实例为大家分享了Android仿抖音列表效果的具体代码,供大家参考,具体内容如下 当下抖音非常火热,是不是也很心动做一个类似的app吗? 那我们就用RecyclerView实现这个功能吧,关于内存 ...
- android直播聊天室图文混排效果,仿抖音直播聊天室换行内容TextView+ReplacementSpan...
一.抖音聊天室文本,看似简单并非简单 抖音文本换行. 二.实现方案TextView + ReplacementSpan 方案思路 利用span原理,继承ReplacementSpan,自定义VIewS ...
- android仿抖音关注列表,Android仿抖音列表效果
本文实例为大家分享了Android仿抖音列表效果的具体代码,供大家参考,具体内容如下 当下抖音非常火热,是不是也很心动做一个类似的app吗? 那我们就用RecyclerView实现这个功能吧,关于内存 ...
最新文章
- 《Adobe Fireworks CS5中文版经典教程》——导读
- Clean-Code: 注释
- 待办事项优先级 开发_如何通过创建主题待办事项确定学习内容的优先级
- 设备树下字符设备驱动
- MySQL 如何优化 CPU 消耗?
- 昆明二级计算机考试报名时间2015,4月15日开始网上报名!云南省2021年上半年中小学教师资格考试(面试)安排来了——昆明广播电视台...
- 让IE6、IE7、IE8支持CSS3的圆角、阴影样式
- GDCM:gdcm::StrictScanner的测试程序
- 利用 AVDictionary 配置参数
- 具有Azure功能的无服务器API
- 无限分级 层次输出 demo
- 霸气!任正非:即使美企断供 也无法威胁华为生存
- 操作元素之修改元素属性
- 从二进制数据流中构造GDAL可以读取的图像数据
- Eclipse Egit 安装
- Python eval 函数使用报错 name 'false' is not defined 已解决
- cscope.exe程序的base64文本
- windows各类密码搜集
- vscode——VScode 中 使用 comment translate翻译 插件
- 中国车牌号的识别大全