




下載本文檔
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、今年做了 launcher 相關(guān)的工作,看了很長(zhǎng)時(shí)間。很多人都在修改 launcher,但還沒(méi)有詳細(xì)的文檔,把自己積累的東西分享出來(lái),大家一起積累。這份源碼是基于 2.1的 launched,以后版本雖有變化,但大概的原理一直還是保留了。、主要文件和類(lèi)1 .Launcher.java:launcher 中主要的 activity。2 .DragLayer.java:launcherlayout 的 rootview0DragLayer 實(shí)際上也是一個(gè)抽象的界面,用來(lái)處理拖動(dòng)和對(duì)事件進(jìn)行初步處理然后按情況分發(fā)下去,角色是一個(gè)controllero它首先用 onlnterceptTouchEven
2、t(MotionEvent)來(lái)攔截所有的 touch事件,如果是長(zhǎng)按 item 拖動(dòng)的話(huà)不把事件傳下去,直接交由 onTouchEvent()處理,這樣就可以實(shí)現(xiàn) item 的移動(dòng)了, 如果不是拖動(dòng) item 的話(huà)就把事件傳到目標(biāo) view,交有目標(biāo) view的事件處理函數(shù)做相應(yīng)處理。如過(guò)有要對(duì)事件的特殊需求的話(huà)可以修改onInterceptTouchEvent(MotionEvent)來(lái)實(shí)現(xiàn)所需要的功能。3 .DragController.java:為 Drag 定義的一個(gè)接口。包含一個(gè)接口,兩個(gè)方法和兩個(gè)靜態(tài)常量。接口為 DragListener(包含 onDragStart(),onDr
3、agEnd()兩個(gè)函數(shù)),onDragStart()是在剛開(kāi)始拖動(dòng)白時(shí)候被調(diào)用,onDragEnd()是在拖動(dòng)完成時(shí)被調(diào)用。在 launcher 中典型的應(yīng)用是 DeleteZone,在長(zhǎng)按拖動(dòng) item 時(shí)調(diào)用 onDragStart()顯示,在拖動(dòng)結(jié)束的時(shí)候 onDragEnd()隱藏。兩個(gè)函數(shù)包括 startDrag()和setDragItemInfo().startDrag()用于在拖動(dòng)是傳遞要拖動(dòng)的 item 的信息以及拖動(dòng)的方式,setDragItemInfo()用于傳遞 item 的參數(shù)信息(包括位置以及大小)。兩個(gè)常量為DRAG_ACTION_MOVE,DRAG_ACTION_
4、COPY 來(lái)標(biāo)識(shí)拖動(dòng)的方式,DRAG_ACTION_MOVE 為移動(dòng),表示在拖動(dòng)的時(shí)候需要?jiǎng)h除原來(lái)的 item,DRAG_ACTION_COPY 為復(fù)制型的拖動(dòng),表示保留被拖動(dòng)的 item。4 .LauncherModel.java:輔助的文件。 里面有許多封裝的對(duì)數(shù)據(jù)庫(kù)的操作。 包含幾個(gè)線(xiàn)程,其中最主要的是 ApplicationsLoader 和 DesktopItemsLoader)ApplicationsLoader 在加載所有應(yīng)用程序時(shí)使用,DesktopItemsLoader 在力口載workspace 的時(shí)候使用。其他的函數(shù)就是對(duì)數(shù)據(jù)庫(kù)的封裝,比如在刪除,替換,添加程序的時(shí)候做更
5、新數(shù)據(jù)庫(kù)和 UI 的工作。5 .Workspace.java:抽象的桌面。由 N 個(gè) celllaout 組成,從 cellLayout 更高一級(jí)的層面上對(duì)事件的處理。6 .LauncherProvider.java:launcher 的數(shù)據(jù)庫(kù), 里面存儲(chǔ)了桌面的計(jì) em 的信息。 在創(chuàng)建數(shù)據(jù)庫(kù)的時(shí)候會(huì) loadFavohtes(db)方法,loadFavohtes(法解析 xml 目錄下的default_workspace.xml 文件, 把其中的內(nèi)容讀出來(lái)寫(xiě)到數(shù)據(jù)庫(kù)中, 這樣就做到了桌面的預(yù)制。7 .CellLayout.java:組成 workspace 的 view,繼承自 viewg
6、roup,既是個(gè) dragSource又是一個(gè) dropTarget,可以將它里面的 item 拖出去,也可以容納拖動(dòng)過(guò)來(lái)的 item0在workspace_screent 面定了些它的 view 參數(shù)。1.1 temInfo.java:對(duì) item 的抽象, 所有類(lèi)型 item 的父類(lèi), item 包含的屬性有 id (標(biāo)識(shí) item的 id),cellX(在橫向位置上的位置,從 0 開(kāi)始),cellY(在縱向位置上的位置,從 0 開(kāi)始),spanX(在橫向位置上所占的單位格),spanY(在縱向位置上所占的單位格),screen(在 workspace 的第幾屏,從 0 開(kāi)始),itemT
7、ype(item 的類(lèi)型,有widget,searchhapplicationIF),container(item 所在的)。.UserFolder.java:用戶(hù)創(chuàng)建的文件夾??梢詫?item 拖進(jìn)文件夾,單擊時(shí)打開(kāi)文件夾,長(zhǎng)按文件夾上面標(biāo)題處可以重命名文件夾。.LiveFolder.java:系統(tǒng)自帶的文件夾。從系統(tǒng)中創(chuàng)建出的如聯(lián)系人的文件夾等。.DeleteZone 刪除框。在平時(shí)是出于隱藏狀態(tài),在將 item 長(zhǎng)按拖動(dòng)的時(shí)候會(huì)顯示出來(lái),如果將 item 拖動(dòng)到刪除框位置時(shí)會(huì)刪除 item。DeleteZone 實(shí)現(xiàn)了 DropTarget 和DragListener 兩個(gè)接口。.Lau
8、ncherSettings.java 字符串的定義。數(shù)據(jù)庫(kù)項(xiàng)的字符串定義,另外在這里定義了container 的類(lèi)型,還有讓 emType 的定義,除此還有一些特殊的 widget(如 search,clock的定義等)的類(lèi)型定義。二、主要模塊1.界面模型:statusbar+J1*MaaaM,.口口口口1_邢。依邢。依( (由忖由忖cellLa/oirt組成組成workspacehDeletezon口Handvie1.*1Launcher 的界面的 rootview 是 DragLayer,它是個(gè) FrameLayout,在它上面workspace(應(yīng)該說(shuō)是 celllayout)占了絕大部
9、分的空間,celllayout 的參數(shù)文件是workspace_screen.xmlworkspace 既是一個(gè) DropTarget 又是一個(gè) DragSource,可以從AllAppGridView 中拖出應(yīng)用程序放在它上面,也可以把它里面的 item 拖走刪除或者拖到 bottomabr 里面去。2.Drop&Drag 模型:DragSource 可以拖動(dòng)的對(duì)象來(lái)源的容器,在 launcher 中主要有AllAppGridView,workspace 等。voidonDropCompleted(Viewtarget,booleansuccess,intx,inty);DropTa
10、rget:可以放置被拖動(dòng)的對(duì)象的容器。在 launcher 中有 folder,workspace,bottomba 邙,一個(gè) View 既可以是 Dragsource 也可以是 DropTarget。主要包含以下幾個(gè)接口:booleanacceptDrop(DragSourcesource,intx,inty,intxOffset,intyOffset,ObjectdragInfo);acceptDrop 函數(shù)用來(lái)判斷 dropTarget 是否可以接受 item 放置在自己里面。voidonDragEnter(DragSourcesource,intx,inty,intxOffset,in
11、tyOffset,ObjectdragInfo);onDragEnter 是 item 被拖動(dòng)進(jìn)入到一個(gè) dropTarget 的時(shí)候的回調(diào)。voidonDragOver(DragSourcesource,intx,inty,intxOffset,intyOffset,Objectdraginfo);onDragOver 是 item 在上一次位置和這一次位置所處的 dropTarget 相同的時(shí)候的回調(diào)。voidonDragExit(DragSourcesource,intx,inty,intxOffset,intyOffset,Objectdraginfo);onDragExit 是 it
12、em 被拖出 dropTarget 時(shí)的回調(diào)。booleanonDrop(DragSourcesource,intx,inty,intxOffset,intyOffset,Objectdraginfo);onDrop 是 item 被放置到 dropTarget 時(shí)的回調(diào)。函數(shù)的調(diào)用模式為:DropTargetdropTarget=findDropTarget(int)x,(int)y,coordinates);if(dropTarget!=null)/*當(dāng)這一次的 target 跟上一次相同時(shí),根據(jù)坐標(biāo)來(lái)移動(dòng) item*/if(mLastDropTarget=dropTarget)dropT
13、arget.onDragOver(mDragSource,coordinates0,coordinates1,(nt)mTouchOffsetX,(int)mTouchOffsetY,mDraginfo);else*當(dāng)上一次的位置跟這一次不同而且上一次的位置不為空,說(shuō)明 item*動(dòng)出了,將上次的 View 根據(jù)上次的坐標(biāo)重新排列,并根據(jù)當(dāng)前坐標(biāo)重排*當(dāng)前的*/if(mLastDropTarget!=null)mLastDropTarget.onDragExit(mDragSource,coordinates0,coordinates1,(nt)mTouchOffsetX,(int)mTouc
14、hOffsetY,mDragInfo);dropTarget.onDragEnter(mDragSource,coordinates0,coordinates1,(nt)mTouchOffsetX,(int)mTouchOffsetY,mDragInfo);else/如果這一次為 null,上一次不為 null,那么把上一次坐標(biāo)位置的 cellif(mLastDropTarget!=null)mLastDropTarget.onDragExit(mDragSource,coordinates0,coordinates1,int)mTouchOffsetX,(int)mTouchOffsetY,
15、mDragInfo);/記錄上次的 droptargetmLastDropTarget=dropTarget;3.Touchevent 總結(jié):由于 launcher 的事件比較多比較復(fù)雜,所以在事件處理的時(shí)候一般采用rootview 先用 onInterceptTouchEvent(MotionEvent/截所有的 touch 事件,經(jīng)過(guò)判斷后分發(fā)給 childview0判斷的規(guī)則如下:a.down 事件首先會(huì)傳遞至 ijonInterceptTouchEvent(訪(fǎng)法b.如果該 ViewGroup 的 onInterceptTouchEvent(底接 U到 down 事件處理完成之后retu
16、rnfalse,那么后續(xù)的 move,up 等事件將繼續(xù)會(huì)先傳遞給該 ViewGroup,之后才和 down事件一樣傳遞給最終的目標(biāo) view 的 onTouchEvent(收 t 理。c 如果該 ViewGroup 的 onInterceptTouchEvent(底接 U到 down 事件處理完成之后returntrue,那么后續(xù)的 move,up 等事件將不再傳遞給 onInterceptTouchEvent(),而是和down 事件一樣傳遞給該 ViewGroup 的 onTouchEvent()處理,注意,目標(biāo) view 將接收不到任何事件。d.如果最終需要處理事件的 view 的 o
17、nTouchEvent(泅回了 false,那么該事件將被傳遞至其上一層次的 view 的 onTouchEvent()處理。e 如果最終需要處理事件的 view 的 onTouchEvent(泅回了 true,那么后續(xù)事件將可以繼續(xù)傳遞給該 view 的 onTouchEvent()處理。三、幾種問(wèn)題的解決方式.將所有的應(yīng)用都排列在桌面上launcher:y=./放置 y 方向的位置(在行中的位置)將所有的應(yīng)用都排列在桌面是通過(guò)首先創(chuàng)建一個(gè)三維的 boolean 型全局?jǐn)?shù)組來(lái)記錄計(jì) em 的排列情況,第一維是屏數(shù),第二維是縱向上的排列情況,第三維是橫向的排列情況, 如果那個(gè)位置被 item
18、所占用就標(biāo)記為 1,否則標(biāo)記為 0.在啟動(dòng)時(shí)把全局?jǐn)?shù)組初始化為 0,然后在添加的時(shí)候把相應(yīng)的位置置 1.凡是涉及到 workspace 上 item 的變化,比如移動(dòng)、添加、刪除操作時(shí)都需要維護(hù)數(shù)組,保持?jǐn)?shù)組的正確性,因?yàn)樵诎惭b新程序時(shí)依據(jù)數(shù)組的狀態(tài)去判斷把 item 加到什么位置。.動(dòng)態(tài)增加屏幕動(dòng)態(tài)增加屏幕是通過(guò) worksapce.addchild(view)的方式實(shí)現(xiàn)?;舅悸肥牵菏紫阮A(yù)先規(guī)定所允許的最大的屏幕數(shù),然后在需要增加屏幕而且當(dāng)前屏幕數(shù)沒(méi)有超過(guò)最大屏幕數(shù)的時(shí)候通過(guò)(CellLayout)mInflater.inflate(R.layout.workspace_screen,nu
19、ll)倉(cāng)1J建一個(gè)celllayout實(shí)例出來(lái), 然后通過(guò) addchild 把它加入進(jìn)去。 在屏幕上的 item 被刪除時(shí)通過(guò)從最后一屏起判斷屏幕上是否有 item,如果有的話(huà)保留,沒(méi)有的話(huà)則刪除最后一屏,以此類(lèi)推。.預(yù)制桌面a.添加普通的應(yīng)用程序快捷方式:在./res/xml 下的 default_workspace.xml 文件中加入默認(rèn)要放置的普通的應(yīng)用程序。 加入的格式為:/在 y 方向上所占格數(shù)widgetlauncher:packageName=.launcher:className=.launcher:container=.launcher:screen=.launcher:x
20、-.launcher:y=.launcher:spanx=.例如,要在第 3 屏的第一行第二列放置開(kāi)始放置一個(gè) x 方向上占兩個(gè)單位格,y 方向上占兩個(gè)單位格的時(shí)鐘,可以加入以下代碼:.改變主界面的排列方式要修改桌面的排列方式,如下,先根據(jù)橫豎屏設(shè)置修改 workspace_screen.xml里 shortAxisCells 和 longAxisCells 的參數(shù),然后在 Launcher.java 中修改NUMBER_CELLS_X 和 NUMBER_CELLS_Y 的值, 在 2.3 版本中剛開(kāi)始往數(shù)據(jù)庫(kù)中添加item 的時(shí)候會(huì)去判斷,如果不修改 NUMBER_CELLS_X 和 NUMBER_CELLS_Y 的話(huà)會(huì)導(dǎo)致一部分的 item 顯示不出來(lái),導(dǎo)致預(yù)制 apk 的失敗。.增加 worksapce 上的屏數(shù)要增加屏數(shù),首先在根據(jù)橫豎屏在 launcher.xml 中的com.android.launcher.Workspac#刪除或增力口,然后在Launcher.java 中修改 SCREEN_COUNT 的值即可。四、x
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年國(guó)際化教育中跨文化交流能力培養(yǎng)的跨文化教育政策創(chuàng)新研究報(bào)告
- 城市生活垃圾分類(lèi)公眾參與機(jī)制優(yōu)化與長(zhǎng)效管理效果評(píng)估分析研究報(bào)告
- 2025年醫(yī)院電子病歷系統(tǒng)在醫(yī)院信息化建設(shè)中的知識(shí)圖譜構(gòu)建應(yīng)用報(bào)告
- 2025年互聯(lián)網(wǎng)醫(yī)療平臺(tái)在線(xiàn)問(wèn)診服務(wù)與患者疾病管理報(bào)告
- 海洋生態(tài)保護(hù)與修復(fù)2025:政策法規(guī)與海洋生態(tài)修復(fù)技術(shù)標(biāo)準(zhǔn)應(yīng)用分析報(bào)告
- 咨詢(xún)工程師付子健課件
- 2025年海上風(fēng)能資源評(píng)估與深遠(yuǎn)海風(fēng)電場(chǎng)技術(shù)交流與合作平臺(tái)報(bào)告
- 2025年福建省廈門(mén)市雙十中學(xué)英語(yǔ)八年級(jí)第二學(xué)期期末檢測(cè)試題含答案
- 數(shù)字文化產(chǎn)業(yè)發(fā)展報(bào)告:2025年商業(yè)模式創(chuàng)新與文化產(chǎn)業(yè)發(fā)展與文化產(chǎn)業(yè)創(chuàng)新
- 2025年教育信息化基礎(chǔ)設(shè)施建設(shè)與教育信息化產(chǎn)業(yè)創(chuàng)新趨勢(shì)研究報(bào)告
- 鋁合金門(mén)窗安裝施工方案
- 采血后預(yù)防淤青的按壓方式
- 胃癌化療患者的護(hù)理查房
- 香菇種植可行性分析報(bào)告
- 2025年會(huì)考地理考試試題及答案
- 2025-2030全球智慧康養(yǎng)平臺(tái)行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 安全生產(chǎn)網(wǎng)格員培訓(xùn)
- 醫(yī)院預(yù)防職務(wù)犯罪講座
- 食品安全主題墻框架
- 吸脂術(shù)護(hù)理查房
- 學(xué)校危險(xiǎn)化學(xué)品安全管理制度(2篇)
評(píng)論
0/150
提交評(píng)論