自定義LayoutManager實現抖音的效果

2021-08-30 13:27:43 字數 4312 閱讀 7963

抖音.gif

時下最火的莫過抖音了,實現這個效果應該很簡單嘛,用viewpager就可以了。但是等你通過viewpager來實現的時候,手機記憶體不夠用的情況就會顯現出來。有沒有更好的方式呢???自然是有,每個人都會用recyclerview吧,我們就用recyclerview來實現這個效果,關於記憶體的**利用就交給recyclerview就好了。

那麼我們怎麼通過recyclerview來實現這個效果呢?如果你使用過snaphelper的話,就會很好理解。

1.自定義layoutmanager,並且繼承linearlayoutmanager,這樣就得到乙個可以水平排向或者豎向排向的布局策略。如果你接觸過snaphelper應該了解乙個linearsnaphelper的類,可以實現讓列表的item居中顯示的效果。但是這裡我們不用這個類,我們要的效果是一次只能滑動乙個item,也就是一頁。pagersnaphelper就可以做到哦,

@override

public void onattachedtowindow(recyclerview view)

***

/**

* created by 釘某人

* github:

* email: [email protected]

* 用於viewpagerlayoutmanager的監聽

*/public inte***ce onviewpagerlistener

獲取到recyclerview空閒時選中的item,重寫linearlayoutmanager的onscrollstatechanged方法

@override

public void onscrollstatechanged(int state)

break;

case recyclerview.scroll_state_dragging:

view viewdrag = mpagersnaphelper.findsnapview(this);

int positiondrag = getposition(viewdrag);

break;

case recyclerview.scroll_state_settling:

view viewsettling = mpagersnaphelper.findsnapview(this);

int positionsettling = getposition(viewsettling);

break;}}

/**

* 監聽豎直方向的相對偏移量

* @param dy

* @param recycler

* @param state

* @return

*/@override

public int scrollverticallyby(int dy, recyclerview.recycler recycler, recyclerview.state state)

/*** 監聽水平方向的相對偏移量

* @param dx

* @param recycler

* @param state

* @return

*/@override

public int scrollhorizontallyby(int dx, recyclerview.recycler recycler, recyclerview.state state)

private recyclerview.onchildattachstatechangelistener mchildattachstatechangelistener = new recyclerview.onchildattachstatechangelistener()

}// 可以釋放資源的監聽,也就是**item的時候

@override

public void onchildviewdetachedfromwindow(view view) else }};

大功告成。全部原始碼

/**

* created by 釘某人

* github:

* email: [email protected]

* 用於viewpagerlayoutmanager的監聽

*/public inte***ce onviewpagerlistener

**

* created by 釘某人

* github:

* email: [email protected]

*/public class viewpagerlayoutmanager extends linearlayoutmanager

public viewpagerlayoutmanager(context context, int orientation, boolean reverselayout)

private void init()

@override

public void onattachedtowindow(recyclerview view)

/*** 滑動狀態的改變

* 緩慢拖拽-> scroll_state_dragging

* 快速滾動-> scroll_state_settling

* 空閒狀態-> scroll_state_idle

* @param state

*/@override

public void onscrollstatechanged(int state)

break;

case recyclerview.scroll_state_dragging:

view viewdrag = mpagersnaphelper.findsnapview(this);

int positiondrag = getposition(viewdrag);

break;

case recyclerview.scroll_state_settling:

view viewsettling = mpagersnaphelper.findsnapview(this);

int positionsettling = getposition(viewsettling);

break;}}

/*** 布局完成後呼叫

* @param state

*/@override

public void onlayoutcompleted(recyclerview.state state)

/*** 監聽豎直方向的相對偏移量

* @param dy

* @param recycler

* @param state

* @return

*/@override

public int scrollverticallyby(int dy, recyclerview.recycler recycler, recyclerview.state state)

/*** 監聽水平方向的相對偏移量

* @param dx

* @param recycler

* @param state

* @return

*/@override

public int scrollhorizontallyby(int dx, recyclerview.recycler recycler, recyclerview.state state)

/*** 設定監聽

* @param listener

*/public void setonviewpagerlistener(onviewpagerlistener listener)

private recyclerview.onchildattachstatechangelistener mchildattachstatechangelistener = new recyclerview.onchildattachstatechangelistener()

}@override

public void onchildviewdetachedfromwindow(view view) else }};

}

更加詳細的看原始碼

自定義 如何自定義協議

何為自定義協議,其實是相對標準協議來說的,這裡主要針對的是應用層協議 常見的標準的應用層協議如http ftp smtp等,如果我們在網路通訊的過程中不去使用這些標準協議,那就需要自定義協議,比如我們常用的rpc框架 dubbo,thrift 分布式快取 redis,memcached 等都是自定義...

自定義控制項 自定義鐘錶

private context mcontext 畫筆 private paint mpaint 控制項的寬 private int mwidth x方向的圓心座標 private int center 鐘錶的半徑 private int mradio 圓環的寬 private int stroke...

自定義控制項及自定義屬性

自定義控制項在android開發中的重要性,是不言而喻,眾人皆知的。希望通過這二天的學習,能讓大家了解自定義控制項的原理,熟悉自定義控制項的使用步驟,並能寫出一些普通的效果。內容介紹 1 使用系統控制項,實現自定義的效果,案例有 優酷環形選單 廣告條 viewpager 下拉列表 spinner 2...