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

Android仿抖音列表效果

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

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

當(dāng)下抖音非常火熱,是不是也很心動(dòng)做一個(gè)類(lèi)似的app嗎?

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

首先我們先說(shuō)3個(gè)和視頻播放暫停相關(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;//位移,用來(lái)判斷移動(dòng)方向

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

 /**
 * 滑動(dòng)狀態(tài)的改變
 * 緩慢拖拽-> SCROLL_STATE_DRAGGING
 * 快速滾動(dòng)-> 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)聽(tīng)豎直方向的相對(duì)偏移量
 *
 * @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)聽(tīng)水平方向的相對(duì)偏移量
 *
 * @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)聽(tīng)
 *
 * @param listener
 */
 public void setOnViewPagerListener(OnViewPagerListener listener) {
 this.mOnViewPagerListener = listener;
 }

 private RecyclerView.OnChildAttachStateChangeListener mChildAttachStateChangeListener = new RecyclerView.OnChildAttachStateChangeListener() {
 /**
  * itemView依賴(lài)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仿抖音列表效果

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

相關(guān)文章

  • Android控件RadioButton的使用方法

    Android控件RadioButton的使用方法

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

    Android自定義圓角ImageView控件

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

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

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

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

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

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

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

    Android通過(guò)Service實(shí)現(xiàn)簡(jiǎn)單的音樂(lè)播放

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

    Android開(kāi)發(fā)實(shí)戰(zhàn)鬧鐘項(xiàng)目

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

    Android activity和view判斷滑動(dòng)

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

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

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

    Android的HTTP類(lèi)庫(kù)Volley入門(mén)學(xué)習(xí)教程

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

最新評(píng)論

蓬溪县| 吕梁市| 专栏| 册亨县| 盘山县| 邹城市| 布尔津县| 嘉鱼县| 门头沟区| 泰兴市| 忻城县| 定日县| 广河县| 定安县| 常山县| 贞丰县| 莱阳市| 监利县| 格尔木市| 堆龙德庆县| 遂宁市| 晋江市| 鄱阳县| 梅州市| 应城市| 桐城市| 东阳市| 中牟县| 西华县| 池州市| 钦州市| 明光市| 彰化市| 安多县| 缙云县| 布拖县| 铜山县| 中卫市| 全椒县| 宁乡县| 东乡|