距離上次釋出
相關的内容已經半個月了,最近利用空閑時間,把今日頭條用戶端完善了下。完善的功能一個一個全部實作後,就放整個源碼。開發的進度就是按照一個一個功能的思路走的,是以開發一個小的功能,如果有用,就寫一個專門的部落格以便有人用到獨立的功能可以友善使用。
這次實作的功能是很多新聞閱讀器(網易,今日頭條,360新聞等)以及騰訊視訊等裡面都會出現的頻道管理功能。
下面先上這次實作功能的效果圖:(注:這個效果圖沒有拖拽的時候移動動畫,demo裡面有,可以下載下傳看看)
剛開始接觸這個的時候,不知道要如何實作,去網上翻了一大堆資料,懂了個大概,就是目前可以找到的都是拖拽的時候,不帶移動動畫的,和線上的用戶端互動效果相差甚遠,在反反複複的嘗試檢視相關東西,大緻的做了出來,目前在模拟器上似乎有一點小bug,真機測試沒有問題,就先放上來,如果發現問題在修改優化。代碼反面,沒有好好的修改調整,可能會有點亂,請見諒哈。
1.了解重寫view的相關知識,并且知道gridview的一些内部方法,如:怎麼通過觸摸的坐标擷取對應的position等(這裡我采用的是繼承gridview控件)
2.了解螢幕觸摸動作傳遞原理 這裡我以前轉載的一篇或許會有幫助:
3.了解位移動畫animation,本demo中主要用到:translateanimation 平移動畫
4.了解windowmanager的視窗機制,這裡的item拖拽等都要設計到這個。
5.了解sqlitedatabase 以及sqliteopenhelper等資料庫操作相關的類,本demo中主要用到資料庫進行存儲頻道資訊,如果你要用文檔進行存儲讀取也可以。
1. 擷取資料庫中頻道的清單,如果為空,賦予預設清單,并存入資料庫,之後通過對應的擴充卡賦給對應的gridview
2. 2個gridview--(1.draggrid 2. othergridview)
draggrid 用于顯示我的頻道,帶有長按拖拽效果
othergridview用于顯示更多頻道,不帶推拽效果
注:由于螢幕大小不一定,外層使用scrollview,是以2者都要重寫計算高度
3. 點選2個gridview的時候,根據點選的item對應的position,擷取position對應的view,進行建立一層移動的動畫層
起始位置:點選的positiongetlocationinwindow()擷取。終點位置:另一個gridview的最後個item 的position + 1的位置。
并賦予移動動畫,等動畫結束後對2者對應的頻道清單進行資料的remove和add操作。
4. 設定點選和拖動的限制條件,如 推薦 這個item是不允許使用者操作的。
5. 拖動的draggrid的操作:
(1)長按擷取長按的item的position -- dragposition 以及對應的view ,手指觸摸螢幕的時候,調用onintercepttouchevent來擷取motionevent.action_down事件,擷取對應的資料。由于這裡是繼承了gridview,是以長按時間可以通過setonitemlongclicklistener監聽來執行,或則你也可以通過計算點選時間來監聽是否長按。
(2)通過ontouchevent(motionevent ev)來監聽手指的移動和擡起動作。當它移動到 其它的item下面,并且下方的item對應的position 不等于 dragposition,進行資料交換,并且2者之間的所有item進行移動動畫,動畫結束後,資料更替重新整理界面。
(3) 擡起手後,清除掉拖動時候建立的view,讓gridview中的資料顯示。
6. 退出時候,将改變後的頻道清單存入資料庫。
下面是大體的流程圖:
點選進行添加删除:
移動動畫:
可拖拽的draggrid代碼:
資料庫sqlhelper檔案
注:本demo中,加入了長按震動,是以在權限裡面記得加上“
源碼demo下載下傳位址如下: