http://www.jianshu.com/u/7b186b7247c1
源碼地址
https://github.com/1002326270xc/ChuShouView-master
文章目錄
前言
效果圖
如何使用
源碼分析
總結
1
前言
前幾天在看手機直播的時候,自己就用上了觸手app。一進到主頁就看上了里面頁面切換的效果,自己想這種效果用什么控件可以實現呢。不閑扯了,直接上圖更有意思。
2
效果圖
觸手app主頁效果圖
看到這個效果圖后,第一想到的就是RecyclerView貌似可以實現這種效果,但是用RecyclerView自己的api還是有很多問題的,先不說如何實現的吧,看下實現出來的效果圖吧:
圖片式
流式布局
多種樣式
3
如何使用
gradle依賴:
設置Manager:
設置觸摸輔助類ChuShouCallBack:
設置Adapter:
這里面的流式布局的Adapter和多種樣式的Adapter有一個共同點,它們的item都是帶有滑動結構的,因此這里我把它們的結構當成RecyclerView+RecyclerView來處理了,而上面的圖片式結構就是RecyclerView+ImageView來處理了,大家可以著重看看ChuShouScrollAdapter和ChuShouGridAdapter代碼:
ChuShouGridAdapter:
ChuShouScrollAdapter:
R.layout.scroll_item_layout:
使用方面就注意這些了,下面就講講是怎么實現。
4
源碼分析
下面就來講講如何用RecyclerView如何實現上面的效果了:
先來張自己畫的思路草圖吧:
這里整體就是一個RecyclerView了,而且在初始的時候,需要定義我們自己的Layoutmanager,代碼里面可見(ChuShouManager)該類,該Layoutmanager的功能就是讓最后一個item在屏幕的上面顯示,第一個item在屏幕中顯示,第二個item到倒數第二個item在屏幕的下面顯示。所以手機上面顯示的永遠是RecyclerView中第一個item了,只不過在手指滑動的時候,去改變數據源。
好了,第一步終于完成啦,下面就是RecyclerView的touch相關代碼控制了,關于touch的控制,我們需要接觸到android.support.v7.widget.helper.ItemTouchHelper.Callback該類了:
從源碼截圖中看到該類是一個靜態的抽象類,說明我們要使用的時候,需要去實現該類了。這里定義了一個實現類ChuShouCallBack,CallBack抽象類定義了只是定義了我們的Drag(拖拽)動作,實際上我們要用的是SimpleCallback子類,該類實現了我們的Swipe(滑動)動作。因此這里需要屏蔽Drag動作,實現Swipe動作。
屏蔽Drag動作,實現Swipe動作:
下面看看RecyclerView滑動Item的監聽
這里看似代碼這么長,其實是在下拉的時候,獲取到的nextView對應的是屏幕上方的item,也就是RecyclerView的最后一個item,因為最后一個item是放在了屏幕的上面;在上拉的時候,獲取到的nextView對應的是屏幕下方的item,也就是RecyclerView的第二個item。
上面的代碼只是處理我們的滑動,至于說松手的處理還沒說呢。這里也正好說下onSwipe什么時候觸發。這里需要介紹一個方法:
源碼說是只要滑動位置超過了RecyclerView的width或height時就會觸發onSwiped方法,我們這里不需要去動該值就可以了,默認就可以,這里也正好是RecyclerView高度一半的距離,在松手的時候就觸發onSwipe方法
接下來看看onSwiped都做了些什么:
這里處理了數據跟接口的回調的監聽,接下來看看refreshData方法做了些什么:
關于外層的RecyclerView滑動處理就先說這么多,下面來介紹如何處理內層帶有滑動結構的RecyclerView,兩個都有滑動結構,何時才讓內層的RecyclerView,何時讓外層的RecyclerView滑動呢:
這個時候來看下里面的SlideRecyclerView內部滑動的處理:
監聽SlideRecyclerView滑動位置來動態設置外層的RecyclerView是否有滑動處理。總結下來是兩種情況:一種是SlideRecyclerView滑動到了頂部,此時如果往上滑的時候,需要禁掉外層的RecyclerView的滑動,直接調用chuShouCallBack.setDefaultSwipeDirs(0)方法就可禁掉外層的滑動。另一種是SlideRecyclerView滑動到了底部,此時如果往下滑的時候,也需要禁掉外層的RecyclerView滑動。
說到這的時候很多人好奇為什么監聽SlideRecyclerView滑動處理沒有打開外層的RecyclerView代碼呢。這里打開外層的RecyclerView滑動需要放在ontouch里面處理。因為在SlideRecyclerView滑動監聽里面是無法監聽到如果滑動到頂部時繼續往下滑和滑動到底部時繼續往上滑的操作,因此這里就通過ontouch的坐標該變量來是否打開外層的RecyclerView滑動:
這里涉及到了三種情況:
(1)SlideRecyclerView滑動到頂部的時候,繼續往下滑的時候,需要打開外層的RecyclerView滑動
(2)SlideRecyclerView滑動到底部的時候,繼續往上滑的時候,需要打開外層的RecyclerView滑動
(3)SlideRecyclerView滑動到中間某一個位置的時候,不管往上滑還是往下滑需要禁掉外層的RecyclerView滑動
核心代碼就這么多了,關于使用方面如果還有什么疑問,可以直接看demo,也可以直接跟我探討,歡迎提出issue
5
總結
結構分析:
整體外層是一個大的RecyclerView(這里定義成ScrollRecyclerView,為了對外提供自己的ChuShouCallBack),里面的item分兩種情況,一種是帶有滑動結構,一種是非滑動結構。滑動結構的話又定義了一個RecyclerView(這里定義成SlideRecyclerView,處理滑動的)。
分析item的排列:
這里就是ChuShouManager的職責了,它負責把最后一個item放在屏幕上方,第一個item放在屏幕中,從第二個item到倒數第二個item放在屏幕下方。
處理touch的動作:
ChuShouCallBack就是扮演該角色了,用來處理上拉和下拉改變item的透明度和平移量。最后在onSwipe時恢復item狀態及改變數據源
處理item本身帶有滑動(SlideRecyclerView)和外層RecyclerView滑動沖突:
這里就是分析何時去禁掉外層RecyclerView滑動,何時打開滑動。原則是當item滑動到頂部時,若再繼續往上滑禁掉外層RecyclerView滑動,若再繼續往下滑打開外層RecyclerView滑動;當item滑動到中間某一個位置時,此時不管再繼續往上滑還是往下滑都是禁掉外層RecyclerView滑動;當item滑動到底部時,若再繼續往上滑打開外層RecyclerView滑動,若再繼續往下滑禁掉外層RecyclerView滑動。
人節前一天,游戲直播又搞出大新聞!觸手直播與百度達成深度合作,獨家運營百度旗下所有游戲直播業務,進一步探索流量紅利與直播場景升級。
2000年端游起步,到電競游戲作為一項體育項目進入國內市場,真正奠定了電競游戲的地位。越來越多的玩家加入游戲的隊伍,從起初最熱門的大型端游,到如今人人手機上都有的那幾款熱門手游。無論是從技術或情懷來說,游戲產業的進步都是飛快的,游戲已然成為我們生活中形影不離的伙伴,手游更是每時每刻的陪伴。
端游雖然發展成熟,卻因為局限性讓很多玩家煩惱,沒有電腦的地方就無法繼續游戲,甚至沒有網絡的地方就要終止游戲。只有在家、宿舍和網吧等地方可以繼續進行,正是這樣的局限性也給我們帶來很多情懷。那些年在網吧包夜,在家里通宵,在宿舍開黑的記憶猶新。手游的出現,改變了這種局限性,讓玩家隨時隨地能享受游戲的樂趣,而游戲主播的出現更是讓手游新添色彩,他們在觸手直播和你喜愛的手游一起等你。
離開網吧離開家,即使走在路上,機場等人,工作間隙,陪女朋友逛街……你都可以隨時進入狀態刷副本。碎片化時間的累積,足以讓你在手游中的等級遙遙領先,加上手機屏幕越做越大的特點,手游逐漸占據了市場。同時移動電競的線下賽制也不曾落下,掀起了全名競技的熱潮,移動電競賽事直播也成了玩家們必不可少的娛樂之一,觸手直播各大移動電競比賽,滿足玩家們隨時隨地看直播看比賽的需求。玩手游,開觸手,你也可以將自己剪輯好的原創游戲視頻上傳到觸手直播,和更多玩家分享手游樂趣!