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