最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android仿抖音列表效果

 更新時間:2019年09月08日 09:29:50   作者:xiangxiongfly  
這篇文章主要為大家詳細(xì)介紹了Android仿抖音列表效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了Android仿抖音列表效果的具體代碼,供大家參考,具體內(nèi)容如下

當(dāng)下抖音非?;馃幔遣皇且埠苄膭幼鲆粋€類似的app嗎?

那我們就用RecyclerView實現(xiàn)這個功能吧,關(guān)于內(nèi)存的回收利用就交給RecyclerView就好了。

首先我們先說3個和視頻播放暫停相關(guān)的接口

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);
 }

 /**
 * 滑動狀態(tài)的改變
 * 緩慢拖拽-> SCROLL_STATE_DRAGGING
 * 快速滾動-> SCROLL_STATE_SETTLING
 * 空閑狀態(tài)-> 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;
 }
 }


 /**
 * 監(jiān)聽豎直方向的相對偏移量
 *
 * @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);
 }

 /**
 * 監(jiān)聽水平方向的相對偏移量
 *
 * @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);
 }

 /**
 * 設(shè)置監(jiān)聽
 *
 * @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仿抖音列表效果

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android控件RadioButton的使用方法

    Android控件RadioButton的使用方法

    這篇文章主要為大家詳細(xì)介紹了Android控件RadioButton的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • Android自定義圓角ImageView控件

    Android自定義圓角ImageView控件

    這篇文章主要為大家詳細(xì)介紹了Android自定義圓角ImageView的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Android 使用 Scroller 實現(xiàn)平滑滾動功能的示例代碼

    Android 使用 Scroller 實現(xiàn)平滑滾動功能的示例代碼

    這篇文章主要介紹了Android 使用 Scroller 實現(xiàn)平滑滾動功能,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • Android使用Notification實現(xiàn)普通通知欄(一)

    Android使用Notification實現(xiàn)普通通知欄(一)

    這篇文章主要為大家詳細(xì)介紹了Android使用Notification實現(xiàn)普通通知欄,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Android實現(xiàn)視頻圖片輪播功能

    Android實現(xiàn)視頻圖片輪播功能

    視頻與圖片輪播功能是一種常見的用戶交互方式,廣泛應(yīng)用于多媒體展示、廣告輪播、資訊閱讀、產(chǎn)品推薦等場景,在這種模式下,應(yīng)用能同時支持圖片和視頻的自動或手動輪播播放,本項目旨在基于 Android 平臺,構(gòu)建一個支持視頻與圖片混合輪播的解決方案,需要的朋友可以參考下
    2025-04-04
  • Android通過Service實現(xiàn)簡單的音樂播放

    Android通過Service實現(xiàn)簡單的音樂播放

    這篇文章主要介紹了Android通過Service實現(xiàn)簡單的音樂播放,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Android開發(fā)實戰(zhàn)鬧鐘項目

    Android開發(fā)實戰(zhàn)鬧鐘項目

    這篇文章主要介紹了Android開發(fā)實戰(zhàn)鬧鐘項目,根據(jù)我們手機(jī)鬧鐘設(shè)計的一個鬧鐘APP,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • Android activity和view判斷滑動

    Android activity和view判斷滑動

    這篇文章主要介紹了Android activity和view判斷滑動的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • SQLite數(shù)據(jù)庫在Android中的使用小結(jié)

    SQLite數(shù)據(jù)庫在Android中的使用小結(jié)

    SQLIte是一款輕型的數(shù)據(jù)庫,占用資源非常低,在嵌入式設(shè)備中,可能只需幾百k的內(nèi)存,這篇文章主要介紹了SQLite數(shù)據(jù)庫在Android中的使用,需要的朋友可以參考下
    2024-07-07
  • Android的HTTP類庫Volley入門學(xué)習(xí)教程

    Android的HTTP類庫Volley入門學(xué)習(xí)教程

    這篇文章主要介紹了Android應(yīng)用開發(fā)框架Volley的入門學(xué)習(xí)教程,Volley適合于輕量級的通信功能開發(fā),善于處理JSON對象,需要的朋友可以參考下
    2016-02-02

最新評論

慈利县| 文登市| 澳门| 石台县| 汉阴县| 偃师市| 华阴市| 鄂伦春自治旗| 昌都县| 陈巴尔虎旗| 晋州市| 永丰县| 太康县| 合川市| 长白| 定西市| 永昌县| 富蕴县| 平安县| 贵德县| 精河县| 楚雄市| 桃江县| 朝阳市| 天峻县| 广东省| 寻乌县| 牙克石市| 洛川县| 驻马店市| 田阳县| 福清市| 迭部县| 江西省| 平遥县| 叙永县| 广德县| 东兰县| 扎鲁特旗| 乐都县| 佳木斯市|