部落格搬家啦——為了更好地經營部落格,本人已經將部落格遷移至www.ijavaboy.com。這裡已經不再更新,給您帶來的不便,深感抱歉!這篇文章的新地址:點擊我
最近由於項目需要自己定製一套管理系統,遂想到了Android的啟動器,下來了源碼,一編譯到處是錯,查了查原因,原來是引用了自家的成員,他們家開發的就是方便,想直接用就直接用。於是下載了個包,終於錯誤少了一大半。但是還有一些錯誤,主要是引用了一些不存在的資源。於是改了改,基本可以運行了。
但是,問題來了,一眼望去,紅色叉叉是不見了,但是革命依然不容樂觀,一個人我認識,但是一下子成千上百個人出現在我的面前,我就不是一點點暈了,而是暈的不行了。然而,軍令如山,縱然暈,也得硬著頭皮將革命進行下去,因為有一點是肯定的,革命必須勝利,不容失敗!
接下來的一系列文章,就記錄下我的革命之旅!本來打算在原有launcher的基礎上修改的,但是後來發現,功能不需要它那麼複雜,改動的地方也挺多,所以,就一邊分析源碼一邊自己重新寫了,說是重新寫,其實就是抄,但是抄有抄的好處,老師布置作業的時候,作業沒有作對的時候,老師總會說,這個字母抄三百遍,那個單詞抄一百遍...可見抄的多了,也就記住了。但是前提是用心抄,不能小和尚念經,有口無心。這裡,當然不能抄個百遍,抄個一遍就消費了上億個腦細胞。自己寫的話,我們能更好地思考,我要實現哪些功能,每個功能如何?,系統Launcher是如何?的,這樣帶著問題去分析,就很容易分門別類,理清思路,不至於在浩瀚的代碼中迷失方向。
言歸正傳,要想自己寫個一模一樣的Launcher來,我們就得先對著模擬器或者Android系統的機子,好好對每次第一個啟動起來的這個看似簡單卻深藏不露的啟動器。通過一番折騰,大致可以將Launcher實現的功能分為如下幾個:
1、在空的位置長按,具備添加應用、捷徑、檔案夾和小組件的功能
2、左右可以滑動的螢幕
3、可以更換壁紙
4、長按案頭上面某個item(上面說的四個可以添加到案頭的東東),就可以任意拖動了,同時下面的SldingDrawer位置會變成一個垃圾箱,你將拖拽的item放到垃圾箱的位置其顏色變紅的時候,就意味著你一放手,該item就被刪除了
5、案頭下方是個SlidingDrawer,你一點就彈上來,在裡面就是所有的應用,長按可以將其拖到案頭。
有了這樣幾個功能分類,我們的任務也就非常明了了。我們就來分析並思考怎麼樣才能實現每個功能,最後融合為你現在所看到的效果。
我們首先看第一個問題。
簡單的思考了下,覺得應該很簡單,就是監聽下介面的長按事件,在該事件中,彈出一個應用列表就OK了,如果這個彈出的應用列表還可以調用系統內建的,那就更省事了。
第二個問題:
滑動的螢幕,一開始還不知道怎麼實現,晚上下班的時候,一個人悶悶不樂地上了公交車,站到了視窗的位置,一雙黯然的眼神充滿了猶豫,可是腦子裡始終是這個問題。當公交車開動的時候,當窗外的一切在我的眼前緩緩向後退去的時候,我如夢初醒,失聲驚叫,原來如此!幸好聲音不大,否則又要出醜一次。原來手機螢幕就相當於公交車的視窗,背後是一個大風景,只不過當我們拿著手機的時候,這個視窗是靜止的,但是當我們滑動的時候,風景是隨著移動的。至於,這個是怎麼移動的等細節問題,後面再去慢慢分析。
第三個問題:
關於更換壁紙,由於之前做過一個,所以,不用想太多,直接調用調用系統壁紙選擇應用,再實現一個BroadcastReciever,監聽下壁紙的改變,獲得一個Bitmap類型就行了。
但是這裡關鍵是獲得Bitmap後如何將其顯示出來,並隨著螢幕的滑動,壁紙也要相應地移動,這裡壁紙就相當於上面講的風景,目前想到的是直接將其設定為背景,但是覺得在多個螢幕之間,不可行。
第四個問題:
拖動本身並不難,但是要在多個螢幕之間拖動就比較難辦了。這個沒有具體的思路,只能在實現第二個問題後,再融合多螢幕和拖拽的功能了。
第五個問題:
這個很簡單,SlidingDrawer的content為一個GridView,GridView的每個item就是一個應用,關鍵是長按某個item就將其拖動到案頭,這個暫時也麼有思路,待後面走到這一步再思考吧。
到此,要實現的功能已經各個功能大致的思路就有了。但是,當要下手時,又發現光有這些還是毫無頭緒,沒辦法,還是要先來打第一仗,做到瞭解“敵人”的目的。所以,對Launcher的源碼大致看了下,主要看其每個類的用途,找准其設計思想。這裡不用糾結於某個類的某個具體的方法的具體功能,只需要知道每個類是幹什麼的就可以了,然後分個主次關係,看看哪些是關鍵,哪些是次要的,哪些是附屬品...
經過第一戰役,獲得如下成果:
一、案頭的每種類型的item進行了類的封裝,主要層次關係如:
——ItemInfo
——ApplicationInfo
——FolderInfo
——LiveFolderInfo
——UserFolderInfo
——Widget
二、整個布局層次如:
——DragLayer
——Workspace
——CellLayout
——CellInfo(Application,Shortcut,Folder,Widget)
——CellLayout
——CellLayout
-----------------------------------------
三、關鍵的幾個重要的類:CellLayout,Workspace,Launcher,DragLayer,把握這幾個基本就清楚了案頭的布局。其中最外層是DragLayer,控制案頭上item的拖動,DragLayer中是一個Workspace,Workspace就是整個案頭,由幾個CellLayout橫鋪組成,主要控制多螢幕的滑動,壁紙的繪製;CellLayout是一個自訂布局控制項,其功能類似一個GridView,由m*n個儲存格(Cell)組成,其主要負責案頭長按事件的處理,獲得長按的地區資訊,主要需要判斷目前範圍是空的還是已經被佔用了,同時,控制item的拖動。CellLayout中放的就是上面幾種類型的item了。item的拖動功能,是由DragLayer,Workspace,CellLayout協同完成的。
好了,至此,基本應用可以動手了。先不關注其他類的具體用途,先搞定所有的布局!
下一篇將具體解決第一個功能,同時深入CellLayout的背後,一探CellLayout的究竟。。。