基于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,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.State state) {
this.mDrift = dx;
return super.scrollHorizontallyBy(dx,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,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,View view) {
playVideo(position,view);
}
@Override
public void onPageRelease(boolean isNext,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仿抖音列表效果所遇到的程序开发问题。
如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
小编个人微信号 jb51ccc
喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!
基于android的高仿抖音,Android仿抖音列表效果相关推荐
- Android高仿抖音滚动聊天,Android仿抖音列表效果
本文实例为大家分享了Android仿抖音列表效果的具体代码,供大家参考,具体内容如下 当下抖音非常火热,是不是也很心动做一个类似的app吗? 那我们就用RecyclerView实现这个功能吧,关于内存 ...
- Android 仿抖音视频播放列表和评论列表
Android 汇集CSDN.GitHub等最实用的良心之作-KING Android最实用的各种技能点的网址链接(每天都会更新,希望大家用的上) Android 仿抖音系列之视频播放列表和评论列表 ...
- android仿抖音礼物列表实现,Android仿抖音列表效果
本文实例为大家分享了Android仿抖音列表效果的具体代码,供大家参考,具体内容如下 当下抖音非常火热,是不是也很心动做一个类似的app吗? 那我们就用RecyclerView实现这个功能吧,关于内存 ...
- android+底部评论框,Android 之BottomsheetDialogFragment仿抖音评论底部弹出对话框效果(实例代码)...
实现的效果图: 自定义Fragment继承BottomSheetDialogFragment 重写它的三个方法: onCreateDialog() onCreateView() onStart() 他 ...
- android仿抖音关注列表,Android仿抖音列表效果
本文实例为大家分享了Android仿抖音列表效果的具体代码,供大家参考,具体内容如下 当下抖音非常火热,是不是也很心动做一个类似的app吗? 那我们就用RecyclerView实现这个功能吧,关于内存 ...
- 抖音Android包体积优化探索:从Class字节码入手精简DEX体积
前言 众所周知,应用安装包的体积会十分影响用户的应用下载速度和安装速度.据 GoolgePlay 平台对外发布相关的包大小对转化率影响的数据,我们可以看到随着包大小的增加,安装转化率总体呈下降的趋势. ...
- android字节转m,阿里钉钉,字节抖音 Android 面经分享!
原标题:阿里钉钉,字节抖音 Android 面经分享! 微信改了推动机制,真爱请星标本公号 公众号回复加入BATcoder技术群BAT 原文链接:https://cloud.tencent.com/d ...
- 抖音 Android 性能优化:新一代全能型性能分析工具 Rhea!
本文选自「抖音 Android 性能优化」系列文章. 「抖音 Android 性能优化」系列文章是由抖音 Android 基础技术部门技术专家倾力打造的技术干货内容,和大家分享基础技术团队在打造极致用 ...
- 抖音 Android 性能优化系列:新一代全能型性能分析工具 Rhea
本文选自「抖音 Android 性能优化」系列文章. 「抖音 Android 性能优化」系列文章是由抖音 Android 基础技术部门技术专家倾力打造的技术干货内容,和大家分享基础技术团队在打造极致用 ...
最新文章
- c语言大顶堆数组维护,图解大顶堆的构建、排序过程
- TensorFlow学习笔记——实现经典LeNet5模型
- fishhook源码学习
- 使用OpenCV与百度OCR C++ SDK实现文字识别
- Java Date的after和before方法解释
- 计算机boot进入u盘启动,暗影精灵5怎么设置u盘启动 暗影精灵5设置u盘启动方法...
- bzoj3572 [HNOI2014]世界树 虚树 +乱dp
- 【Flink】Flink 或者 Spark the client is stop
- python找不到文件中文文件名_找不到的方法虽然存在于同一个py文件中 - python
- Spring的xml文件配置方式实现AOP
- 23种设计模式(1):单例模式
- HBase-shell及happyhbase
- python中全局变量_玩转Python,使用全局变量
- SQL--报错回显注入
- 【java与移动设备】CH06 资源的使用
- python运行需要联网吗_基于python分析你的上网行为 看看你平时上网都在干嘛
- vim/nvim键盘映射
- Cocoa Application-基础
- 半定制器件课程设计——基于FPGA的PS2键盘人机输入显示系统
- 086 定积分应用元素法求面积
热门文章
- C++局部重载new delete方法剖析
- Linux内核workqueue
- 跨平台异步IO库 libuv 源代码接口详解
- Redis缓存持久化:RDB持久化和AOF持久化
- ppt倒计时3分钟_这些出神入化的PPT小技巧,帮你轻松告别丑PPT!花3分钟看一看吧...
- Python可视化 | Seaborn(01)
- web前端基础(02html表格)
- Java 中关键字transient引出序列化与反序列化
- Mybatis解析(面试题)
- this.$modal.confirm 自定义按钮关闭_【勤哲资料】7.6 自定义打印