一個可拖拽,移動氛雪,自由組合子控件的視圖控件房匆,讓開發(fā)更簡單

今天給大家推薦一個自由拖拽,自由組合的控件报亩,這個控件是我自定義寫的浴鸿。通過它,我們可以自由拖拽弦追,自由組合實(shí)現(xiàn)一個界面岳链,滿足一個用戶自由組合界面的需求。這里不是通過自由拖拽控件劲件,來快速開發(fā)一個界面掸哑,而且更人性化的讓用戶去自由組合一個界面。

前言

最近有一個項目零远,有一個主界面举户,界面上有很多控件或者有多個 fragment 組成,大小不一遍烦,而且由于用戶需要,需要自由拖動和自由組合躺枕,形成用戶自己需要的組合成的模樣服猪。所以就寫了一個 DragerViewLayout ,只要在 DragerViewLayout 下拐云,寫入了多個視圖罢猪,就可以自由拖動和組合了。DragerViewLayout 本質(zhì)上是一個相對布局叉瘩,所以初始位置都可以自己按相對布局的方式來定義膳帕,然后用戶手動拖動后,會自動記錄每個子視圖的位置,進(jìn)行保存危彩,等到重新加載后攒磨,會按照記錄的位置進(jìn)行布局。

效果圖

說一千道一萬汤徽,不如看實(shí)踐娩缰,那就一起來欣賞一下效果圖的效果如何吧?




你們感覺如何?

實(shí)現(xiàn)思路

首先

首先谒府,我們來想想拼坎,要是實(shí)現(xiàn)各個子控件和視圖之間的拖拽和交換位置,那這就意味著所有的子視圖和控件必須在一個層級之內(nèi)完疫,否則跨層級的拖拽是非常難實(shí)現(xiàn)的泰鸡。所以第一個思路就是:

使用相對布局

使用相對布局,其實(shí)可以滿足所有控件都在一個層級之內(nèi)的壳鹤,而且可以滿足我們初始的任何樣式的布局盛龄。況且相對布局是 Android 官方推薦使用的布局。

其次

其次器虾,就該討論拖拽的問題了讯嫂,如何實(shí)現(xiàn)拖拽呢?有沒有更好的兆沙,簡單的方式呢欧芽?難道只能自己實(shí)現(xiàn)觸摸事件,判斷是哪個控件葛圃,計算 X , Y 坐標(biāo)移動呢千扔?非也,其實(shí)有簡單的好辦法库正。那就是:

使用 ViewDragHelper

ViewDragHelper 是一個非常棒的東西曲楚,好用,簡單褥符,不需要你去計算龙誊。2013年谷歌 I/O 大會上介紹了兩個新的 layout: SlidingPaneLayout 和 DrawerLayout,現(xiàn)在這兩個類被廣泛的運(yùn)用喷楣,其實(shí)研究他們的源碼你會發(fā)現(xiàn)這兩個類都運(yùn)用了 ViewDragHelper 來處理拖動趟大。ViewDragHelper 是 framework 中不為人知卻非常有用的一個工具。

ViewDragHelper 解決了 Android 中手勢處理過于復(fù)雜的問題铣焊,在 DrawerLayout 出現(xiàn)之前逊朽,側(cè)滑菜單都是由第三方開源代碼實(shí)現(xiàn)的,其中著名的當(dāng)屬 MenuDrawer 曲伊,MenuDrawer 重寫 onTouchEvent 方法來實(shí)現(xiàn)側(cè)滑效果叽讳,代碼量很大,實(shí)現(xiàn)邏輯也需要很大的耐心才能看懂。如果每個開發(fā)人員都從這么原始的步奏開始做起岛蚤,那對于安卓生態(tài)是相當(dāng)不利的邑狸。所以說 ViewDragHelper 等的出現(xiàn)反映了安卓開發(fā)框架已經(jīng)開始向成熟的方向邁進(jìn)。

關(guān)于 ViewDragHelper 的具體用法灭美,這里不過多贅述推溃,想了解的,在網(wǎng)上一搜届腐,有非常多的文章都在介紹它的基本使用方法铁坎。

再次

再次,我們該如何把拖動的視圖的位置犁苏,保存住呢硬萍?又該如何在重新打開應(yīng)用的時候按照我們自己組合和重新排列的布局顯示呢?其實(shí)方法也一樣很簡單围详,那就是:

記住每個子控件拖拽后的位置朴乖,并保存,在 onLayout 方法中助赞,讀取記錄的位置

在這里买羞,我給每個視圖和控件都增加了一個 tag ,在拖拽的時候根據(jù) tag 知道拖拽的是哪個控件和視圖雹食,然后記錄位置畜普,寫入 SharedPreferences 文件中,在 onLayout 方法中讀取文件群叶,根據(jù)記錄的位置布局吃挑,這樣,再次打開應(yīng)用時街立,就會根據(jù)自己拖拽和組合的方式排列舶衬。

最后

最后,有一個問題就是赎离,相對布局會根據(jù)自己初始的位置有覆蓋層級的逛犹,先寫的在下面,后寫的控件在上面梁剔,拖拽的時候圾浅,怎么把下面的提到上面來呢?方法也很簡單憾朴,那就是:

使用 child.bringToFront() 方法

bringToFront() 方法就是干這個事的,會把操作的視圖喷鸽,提到最上層來众雷。

最后的最后

最后的最后,我就不貼具體的代碼和使用方式了,代碼和使用方法都在我的 github 上砾省,地址如下:

https://github.com/loonggg/DragerViewLayout

有興趣的同學(xué)可以去研究一下鸡岗。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市编兄,隨后出現(xiàn)的幾起案子轩性,更是在濱河造成了極大的恐慌,老刑警劉巖狠鸳,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揣苏,死亡現(xiàn)場離奇詭異,居然都是意外死亡件舵,警方通過查閱死者的電腦和手機(jī)卸察,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铅祸,“玉大人坑质,你說我怎么就攤上這事×俟#” “怎么了涡扼?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長盟庞。 經(jīng)常有香客問我吃沪,道長,這世上最難降的妖魔是什么茫经? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任巷波,我火速辦了婚禮,結(jié)果婚禮上卸伞,老公的妹妹穿的比我還像新娘抹镊。我一直安慰自己,他們只是感情好荤傲,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布垮耳。 她就那樣靜靜地躺著,像睡著了一般遂黍。 火紅的嫁衣襯著肌膚如雪终佛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天雾家,我揣著相機(jī)與錄音铃彰,去河邊找鬼。 笑死芯咧,一個胖子當(dāng)著我的面吹牛牙捉,可吹牛的內(nèi)容都是我干的竹揍。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼邪铲,長吁一口氣:“原來是場噩夢啊……” “哼芬位!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起带到,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤昧碉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后揽惹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體被饿,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年永丝,在試婚紗的時候發(fā)現(xiàn)自己被綠了锹漱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡慕嚷,死狀恐怖哥牍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情喝检,我是刑警寧澤嗅辣,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站挠说,受9級特大地震影響澡谭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜损俭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一蛙奖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧杆兵,春花似錦雁仲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至日裙,卻和暖如春吹艇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背昂拂。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工受神, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人格侯。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓路克,卻偏偏與公主長得像樟结,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子精算,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,077評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫宙枷、插件芝雪、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,094評論 4 62
  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點(diǎn)贊按鈕進(jìn)度條TabLayout圖標(biāo)下拉刷新...
    皇小弟閱讀 46,755評論 22 665
  • 如果真的有一種忘情藥。我也想要了來喝渣刷。然后睡一覺鱼辙。醒來廉嚼。難過的全都忘了。就像歷了一場劫倒戏。過了也就是過了怠噪。
    kerry_ff98閱讀 214評論 0 0
  • 今天把《下一站用戶體驗(yàn)》這本書讀完,歷時一個禮拜多一些杜跷,對后面部分的理解沒有那么深刻傍念,主要是前面的用戶體驗(yàn)設(shè)計剛好...
    kathy琳閱讀 1,340評論 0 3