Android開源:DragerViewLayout-可拖拽,移動,自由組合子控件的視圖控件

KatJudkins 7年前發布 | 18K 次閱讀 安卓開發 Android開發 移動開發

今天給大家推薦一個自由拖拽,自由組合的控件,這個控件是我自定義寫的。通過它,我們可以自由拖拽,自由組合實現一個界面,滿足一個用戶自由組合界面的需求。這里不是通過自由拖拽控件,來快速開發一個界面,而且更人性化的讓用戶去自由組合一個界面。

前言

最近有一個項目,有一個主界面,界面上有很多控件或者有多個 fragment 組成,大小不一,而且由于用戶需要,需要自由拖動和自由組合,形成用戶自己需要的組合成的模樣。所以就寫了一個 DragerViewLayout ,只要在 DragerViewLayout 下,寫入了多個視圖,就可以自由拖動和組合了。DragerViewLayout 本質上是一個相對布局,所以初始位置都可以自己按相對布局的方式來定義,然后用戶手動拖動后,會自動記錄每個子視圖的位置,進行保存,等到重新加載后,會按照記錄的位置進行布局。

效果圖

說一千道一萬,不如看實踐,那就一起來欣賞一下效果圖的效果如何吧?

你們感覺如何?

實現思路

首先

首先,我們來想想,要是實現各個子控件和視圖之間的拖拽和交換位置,那這就意味著所有的子視圖和控件必須在一個層級之內,否則跨層級的拖拽是非常難實現的。所以第一個思路就是:

使用相對布局

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

其次

其次,就該討論拖拽的問題了,如何實現拖拽呢?有沒有更好的,簡單的方式呢?難道只能自己實現觸摸事件,判斷是哪個控件,計算 X , Y 坐標移動呢?非也,其實有簡單的好辦法。那就是:

使用 ViewDragHelper

ViewDragHelper 是一個非常棒的東西,好用,簡單,不需要你去計算。2013年谷歌 I/O 大會上介紹了兩個新的 layout: SlidingPaneLayout 和 DrawerLayout,現在這兩個類被廣泛的運用,其實研究他們的源碼你會發現這兩個類都運用了 ViewDragHelper 來處理拖動。ViewDragHelper 是 framework 中不為人知卻非常有用的一個工具。

ViewDragHelper 解決了 Android 中手勢處理過于復雜的問題,在 DrawerLayout 出現之前,側滑菜單都是由第三方開源代碼實現的,其中著名的當屬 MenuDrawer ,MenuDrawer 重寫 onTouchEvent 方法來實現側滑效果,代碼量很大,實現邏輯也需要很大的耐心才能看懂。如果每個開發人員都從這么原始的步奏開始做起,那對于安卓生態是相當不利的。所以說 ViewDragHelper 等的出現反映了安卓開發框架已經開始向成熟的方向邁進。

關于 ViewDragHelper 的具體用法,這里不過多贅述,想了解的,在網上一搜,有非常多的文章都在介紹它的基本使用方法。

再次

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

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

在這里,我給每個視圖和控件都增加了一個 tag ,在拖拽的時候根據 tag 知道拖拽的是哪個控件和視圖,然后記錄位置,寫入 SharedPreferences 文件中,在 onLayout 方法中讀取文件,根據記錄的位置布局,這樣,再次打開應用時,就會根據自己拖拽和組合的方式排列。

最后

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

使用 child.bringToFront() 方法

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

 

 

項目主頁:http://www.baiduhome.net/lib/view/home/1494315149012

 

 本文由用戶 KatJudkins 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!