1493997關于ListView拖拽移動位置,想必大家并不陌生,比較不錯的軟件都用到如此功能了.如:搜狐,網(wǎng)易,百度等,但是相比來說還是百度的用戶體驗較好,不偏心了,下面看幾個示例: [color=rgb(248,] view plain這個方法的作用很簡單:當我們摁下的如果是可拖拽的圖標,那么進行初始化該Item的映像試圖.而在這里如果大家對WindowManager和WindowManager.LayoutParams不熟悉的朋友先去參考下這篇文章,要對WindowManager有一定的了解,簡單的會應用.接下來我們看onTouchEvent事件:
view plain簡單說明:首先在Touch中,我們要進行判斷,是否點擊的是拖動圖標,如果是的話,那么對ACTION_MOVE and ACTION_UP相應事件進行處理,并且返回true or false.作用:取消ListView自身的Touch事件.如果不是的話,執(zhí)行ListView 本身的Touch事件.大致就介紹這么多,具體的實現(xiàn),還是大家看源碼吧,我注釋的還算清晰,只要大家仔細看的話,一定可以掌握的,為什么這么說呢,技術只有在掌握了情況下才可以進行拓展.對了,提醒大家要理解這三句話:
getRawX()和getRawY():獲得的是相對屏幕的位置.
getX()和getY():獲得的永遠是相對view的觸摸位置 坐標(這兩個值不會超過view的長度和寬度)。
getLeft , getTop, getB OTTom,getRight, 這個指的是該控件相對于父控件的距離.
源碼:
view plain下面我說下適配器:
view plain這里不過多解釋了,相信大家都看的明白.如果疑問請留言.展示下運行效果: 4 天前 上傳
效果看起來還行吧,如果覺得不錯的話,記得要贊一個哦.
下面我們接著修改,模擬百度嘛,誰讓百度這么牛叉呢.思路:點中拖拉圖標的時候,每次移動只要dragPosition發(fā)生改變,也就是我移動到了下一個位置,那么此時我就進行交換執(zhí)行update.并且除了第一次移動外,在每次交換后要除去映射源的顯示,這樣用戶覺得這里的空位就是就是為我準備的,比較人性化.實現(xiàn)起來并不復雜,前提是你得掌握上面的操作.源碼如下;
view plain因為我們要時時交換位置,所以將原先的拖動方法onDrop方法移動到onChange中.具體的還是看源碼吧.
另外的就是對適配器的修改,因為你要對特殊的item進行隱藏之類的操作,這些代碼我就不寫了,我會將案例上傳網(wǎng)上,不懂的可以下載源碼.好了還是我們來觀看下效果吧. [color=rgb(248,] view plain相信大家只要ListView拖拽弄白后,這個GridView也會輕易弄出來,其實拖拽就是對坐標的考察。向大家展示一下效果: 4 天前 上傳
但是有個不足的地方,網(wǎng)上一些例子都是長按可以拖拽,而點擊則執(zhí)行點擊事件.其實實現(xiàn)起來也不是很復雜,可是在實現(xiàn)的過程中,遇到了詭異糾結的問題,郁悶了一天,結果目前先放棄,以后哪天在搞搞吧.糾結的問題就是錯位.我說下我的思路:首先,我們在自定義GridView中創(chuàng)建一個控制是否可以Touch拖拽的變量,而這個變量的值我們通過對GridView的setOnItemClickListener和setOnItemLongClickListener來獲取,如:
view plain這樣我們就實現(xiàn)了長按可以拖拽的效果了,可是遇到個變態(tài)的問題,不過這個思路沒有錯,肯定可以實現(xiàn).
就先說到這里,其實通過這個例子,我們還可以拓展實現(xiàn)ListView上滑動的時候,到達Title時,Title停留在頂部,當下一個Titile滑動到這里的時候,那么代替前面那個TItle.網(wǎng)上有寫應該就是這么搞的,具體實現(xiàn)不知道,不過這種方案可以實現(xiàn),有時間接著續(xù).
|