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仿抖音列表效果

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

(0)

相关推荐

  • Android 仿抖音的评论列表的UI和效果的实现代码

    抖音是一款音乐创意短视频社交软件,是一个专注年轻人的15秒音乐短视频社区.用户可以通过这款软件选择歌曲,拍摄15秒的音乐短视频,形成自己的作品.此App已在Android各大应用商店和APP Store均有上线. 在design包里面 有一个 BottomSheetDialogFragment 这个Fragment,他已经帮我们处理好了手势,所以实现起来很简单.下面是代码: public class ItemListDialogFragment extends BottomSheetDialog

  • Android仿抖音列表效果

    本文实例为大家分享了Android仿抖音列表效果的具体代码,供大家参考,具体内容如下 当下抖音非常火热,是不是也很心动做一个类似的app吗? 那我们就用RecyclerView实现这个功能吧,关于内存的回收利用就交给RecyclerView就好了. 首先我们先说3个和视频播放暂停相关的接口 public interface OnViewPagerListener { /** * 初始化 */ void onInitComplete(View view); /** * 释放 */ void onP

  • Android仿抖音主页效果实现代码

    写在前面 各位老铁,我又来啦!既然来了,那肯定又来搞事情啦,话不多说,先上图! "抖音"都玩过吧,是不是很好玩,我反正是天天刷,作为一个非著名的Android低级攻城狮,虽然技术菜的一匹,但是也经常刷着刷着会思考:咦?这玩意是用哪个控件做的?这个效果是咋实现的啊?由于本人技术水平有限,所以今天咱就先挑个比较简单的来看看是如何实现的,思考再三,我们就拿抖音首页的这个效果来练练手吧,话不多说,开搞! 一.准备工作 我们先不急着写代码,先对抖音的这种效果做一个简单的分析,首先需要明确的是它是

  • Android仿抖音右滑清屏左滑列表功能的实现代码

    概述 ​ 项目中要实现仿抖音直播间滑动清屏,侧滑列表的功能,在此记录下实现过程和踩坑记录希望避免大家走些弯路,也当作自己的一个总结 ​ 首先看下Demo中的效果 ​ 阅读文章需要提前熟悉些事件分发的内容,相信大家都已经了解过了,网上也有很多优秀的文章,这里推荐两篇自己读过印象较深的文章 https://www.jb51.net/article/124249.htm https://www.jb51.net/article/124861.htm 关于这方面的知识,在Android中是再重要不过的了

  • Android自定义view实现仿抖音点赞效果

    前言 学习自定义view,想找点东西耍一下,刚好看到抖音的点赞效果不错,尝试一下. 抖音效果: 话不多说,先上代码: public class Love extends RelativeLayout { private Context mContext; float[] num = {-30, -20, 0, 20, 30};//随机心形图片角度 public Love(Context context) { super(context); initView(context); } public

  • Android仿抖音上下滑动布局

    抖音上下滑动,监听播放,自动吸顶,吸底效果,供大家参考,具体内容如下 使用RecyclerView+PagerSnapHelper实现 public class DouYinLayoutManager extends LinearLayoutManager implements RecyclerView.OnChildAttachStateChangeListener{ //判断是否上滑还是下滑 private int mDrift; private OnViewPagerListener on

  • Android 使用SwipeRefreshLayout控件仿抖音做的视频下拉刷新效果

    SwipeRefreshLayout(这个控件),我先跟大家介绍一下这个控件: 一.SwipeRefreshLayout简单介绍 •先看以下官方文档,已有了很详细的描述了. 官方文档说明 •这里我再大概解释一下: •在竖直滑动时想要刷新页面可以用SwipeRefreshLayout来实现.它通过设置OnRefreshListener来监听界面的滑动从而实现刷新.也可以通过一些方法来设置SwipeRefreshLayout是否可以刷新.如:setRefreshing(true),展开刷新动画. s

  • Android 之BottomsheetDialogFragment仿抖音评论底部弹出对话框效果(实例代码)

    实现的效果图: 自定义Fragment继承BottomSheetDialogFragment 重写它的三个方法: onCreateDialog() onCreateView() onStart() 他们的执行顺序是从上到下 import android.app.Dialog; import android.content.Context; import android.graphics.Color; import android.graphics.drawable.ColorDrawable;

  • Android自定义videoview仿抖音界面

    本文实例为大家分享了Android自定义videoview仿抖音界面的具体代码,供大家参考,具体内容如下 1.效果图 和抖音的界面效果一模一样,而且可以自定义,需要什么页面,请自己定义 2.自定义videoview package com.example.myapplication20; import android.content.Context; import android.util.AttributeSet; import android.widget.VideoView; /** *

  • Android仿微信通讯录列表侧边栏效果

    先看Android仿微信通讯录列表侧边栏效果图 这是比较常见的效果了吧 列表根据首字符的拼音字母来排序,且可以通过侧边栏的字母索引来进行定位. 实现这样一个效果并不难,只要自定义一个索引View,然后引入一个可以对汉字进行拼音解析的jar包--pinyin4j-2.5.0即可 首先,先来定义侧边栏控件View,只要直接画出来即可. 字母选中项会变为红色,且滑动时背景会变色,此时SideBar并不包含居中的提示文本 public class SideBar extends View { priva

随机推荐