代碼追蹤 20130419

簡化:數據庫

控制應用表 APM函數

應用的顯示視圖 APV動畫

應用管理 PMspa

文件夾管理 FM設計

文件夾顯示視圖 AFV事件

控制拖動 DCVci

特定的界面 SVget

系統相關界面 SYMV回調函數

多點觸摸控制 MTMit


1. 入口Activity,初始化過程

layout:聲明一個FrameLayout其中包含多層View,UI圖層,控制拖動的圖層,負責文件夾顯示的圖層;UI圖層按照正常的控件順序進行處理,pager,indicator,shortcut;

FrameLayout會檢查點擊消息,用來響應退出編輯操做 -》

初始化pager -》初始化一個ArrayList<View> views用來存儲pager中的頁面 -》初始化specificView,systemView -》將相關回調函數都註冊到Activity -》初始化DCV,放置一個layout進去 -》初始化APM-》從db得到總數,初始化空的APV,放進管理APV的list -》對比db和系統數據,作修復db動做-》從db獲取數據,更新每頁APV從新加載顯示 

-》getItemView來生成、配置單個圖標的顯示,抖動效果就在這裏處理的;經過offset來直接從APM中應用數據列表來獲取數據;圖標相關操做的listener都在這裏;(由offset來獲取數據,有沒有更好的設計???)views加入SV,SYMV,多個APV-》

初始化pagerAdapter,給pager設置pagerAdapter-》

初始化頁標-》

初始化shortcut-》

初始化receiver,設備管理等


2. 點擊圖標

APV->updateDisplay->getItemView有註冊OnClickListener,應用的話就啓動;文件夾的話,觸發回調onFolderClick,FM->openFolder,構造多頁的AFV,也是經過一個pager來顯示的;長按,修改編輯狀態,通知APV和shortcut更新視圖狀態,開始抖動;刪除按鈕,對於應用只是啓動系統畫面,若是真的刪除的話會收到intent,這時依次去FM,shortcut,PM看它們誰去處理,處理的通常邏輯是先去找到數據,從列表中刪除數據,更新數據庫,更新視圖;(對於文件夾要考慮頁數是否增減,文件夾顯示圖標,刪除多餘文件夾)

刪除應用操做-》發送intent調出系統界面-》Activity註冊的receiver收到應用卸載-》依次FM,shortcut,PM檢查處理-》FM檢查找到應用,FM刪除數據而後db保存,還有其餘應用在文件夾中,更新FV,pager;若是沒有其餘應用了,刪除當前文件夾,經過回調讓Activity處理,讓PM或者shortcut來刪除;PM刪除,先刪除數據,更新數據影響的頁面顯示,從新檢查頁面數增減更新頁面列表,PM頁面數目更新了要通知Activity修改indicator,通知adapter更新;


(這邊的回調通常都是先回調到Activity的函數,再調用相關模塊的函數,邏輯關係像是 ^ 形狀)


3. 移動圖標

拖動打包:

APV->updateDisplay->getItemView有註冊OnTouchListener-》判斷目前狀態(可編輯,可拖動),讓原圖標消失-》獲取截圖,傳遞給DCV -》DCV開始接收消息,ACTION_DOWN-》設置一些狀態,起始位置-》用截圖初始化DCV中的ImageView,以及拖動圖標的具體位置,初始化應用池,托盤每一個元素的具體位置(拖動起始狀態分3種,從應用池,快捷欄,文件夾裏面,爲拖動準備不一樣的座標),把截圖視圖移動到開始位置-》爲截圖作透明的動畫效果-》DCV繼續接收消息,ACTION_MOVE-》設置開始拖動,從pager攔截滑動事件-》DCV開始收到後續事件,先檢測是否懸停狀態,移動視圖,判斷視圖所在位置-》觸發應用池,快捷欄或者文件中相關效果-》

以應用池打包效果說明,被拖動的圖標若是不是懸停,不會影響其餘圖標的狀態;若是是懸停,若是移動到的位置能夠打包-》回調通知應用池,讓對應的APV修改打包位置圖標顯示待打包的狀態,設置打包狀態; -》若是此時DCV收到ACTION_UP,開始結束動畫(受影響圖標連續重排動畫)-》得到動畫開始位置,啓動一個透明減弱動畫-》動畫結束後,開始拖動結束的數據操做,隱藏被拖動的視圖,在修改列表中數據同時更新顯示,而後就開始重排動畫;

重排動畫以moveForFillBlank(int from_r, int from_c, int to_r, int to_c, final boolean isLastPage)爲例,for循環控制每一個移動的元素,最後一個動畫結束後從新刷新排列一次全屏圖標;


拖動換位置:

以應用池跨屏幕移動效果說明,被拖動的圖標若是不是懸停,不會影響其餘圖標的狀態;在設置一些狀態和位置的時候,有先定一個絕對位置數據,這樣把屏幕分割成多個矩形,若是懸停位置在屏幕兩側,那就認爲是翻頁;若是是懸停,若是移動到的位置不是可打包位置且是屏幕兩側,讓pager進行翻頁;leapMove處理跨頁移動,moveCurrentPage處理本頁移動;leapMove根據起始頁面來判讀,圖標該向前滾動補齊,仍是向後滾動補齊;以向前補齊爲例,先移動列表中的數據,刷新受影響且不顯示動畫的其餘頁面,開始補齊動畫;動畫結束後從新刷新圖標,從新設置拖動點,這樣若是你不放手繼續拖動,那麼認爲你又從剛纔的位置開始一次新拖動了;



4. Multi-touch

APV的XML結構:

1. icon視圖(顯示)

2. 多點觸摸視圖(顯示,可是沒有東西)

3. ImageView視圖(GONE,用來顯示縮放模式)

4. FrameLayout視圖(GONE,包含一個ImageView,用來在縮略圖最小化時顯示,縮略圖模式)

三、4顯示的東西不是同樣的,區別有一個透明的背景框;


在APV的XML結構中,定義一個重疊的視圖用來接收多點觸摸事件;每個APV給構造一個MTM來控制多點觸摸的事件,MTM把相關判斷邏輯和攔截操做都放在本身內部來實現,同時來控制縮放效果,APV的XML結構中視圖顯示隱藏;MTM會在APV每次更新後,就對APV視圖進行一次截圖,這個截圖就是MTM主要的操做的數據;

因爲APV的XML結構中定義的接收多點觸摸的視圖是覆蓋在現實icon的視圖之上的,因此多點觸摸視圖不處理的相關event都經過target.dispatchTouchEvent來傳遞到icon的視圖那裏;

onTouch裏面:

達到多點觸摸條件時,統計初始點,設置縮放初始計算參數;將截圖顯示在3裏面,而後顯示3,隱藏icon視圖,同時也給4設置好截圖;設置進入縮放模式;

ACTION_DOWN:開始統計速度

ACTION_MOVE:統計點位置,計算縮放參數,將3視圖進行縮放;若是達到縮略圖模式的要求,設置縮略圖模式(UP時進入縮略圖模式),不然繼續;

ACTION_UP:若是被設置縮略圖模式,那開始動畫;不然,視爲用戶放棄操做,結束多點觸摸模式,恢復icon視圖;

被設置爲縮略圖模式,開始動畫,動畫結束後,隱藏視圖3,顯示視圖4,設置相關狀態;在這以後的用戶操做,會由視圖4來進行響應,視圖4有本身的OnTouchListener來處理消息;


這裏有一個技巧,APV的XML結構,後聲明的視圖三、視圖4都會在icon視圖、多點觸摸視圖2的前面;

進入多點觸摸狀態以前,視圖三、視圖4處於GONE狀態,因此觸摸消息會被多點觸摸視圖2先獲得,視圖2判斷非多點觸摸的狀況下把操做dispatchTouchEvent到icon視圖;進入縮略圖模式後,視圖4處於顯示模式,因此觸摸消息先會被視圖4獲得,這樣就不須要在視圖2裏面爲縮略圖模式進行任何的處理;


5. Touch衝突

結構大體以下:

Activity (drag_layout > folder_layout >pager/shortcut) > APV (縮略圖視圖 > 縮放截圖 > 多點觸摸視圖 > icon視圖)

pager能夠左右滑動,因此在pager之下層次touch event避免被pager處理;drag_layout並不攔截touch event,而只是用來顯示,拖動圖標時pager收到touch event而交給DCV來處理,DCV將圖標放到drag_layout合適的位置;多點觸摸時,也是pager先收到touch event,pager在dispatchTouchEvent中就先進行必定處理;


舉例,在系統界面要想在多點狀況下實現左右滑動pager,本來event事件會傳遞到子view裏面:

pager裏面dispatchTouchEvent裏面檢查觸摸點數目,若是達到要求且當前頁面是系統界面,設置標誌位;

在onInterceptTouchEvent裏面根據標誌位攔截event,onTouchEvent中根據標誌位返回true,須要注意的是onTouchEvent中要調用下super.onTouchEvent()這樣pager會根據event進行翻頁;


舉例,拖動模式:

APV中的icon有設置長按響應-》檢查當前狀態是否容許進入抖動 -》給icon截圖,隱藏icon,把數據傳給DCV-》DCV初始化座標,顯示ImageView,設置可編輯標誌位-》開始動畫把ImageView半透明

APV中的icon有設置touchListener-》檢查可編輯標誌位-》DCV的startOnTouch開始接收消息-》ACTION_DOWN開始動畫去掉半透明 -》ACTION_MOVE設置開始拖動標誌位,通知pager開始攔截event-》pager將攔截到的event發送到DCV的 moveOnTouch處理 -》ACTION_UP進行邏輯處理,開始動畫,動畫結束後放棄攔截,重置相關標誌位;


舉例,多點觸摸進入縮放模式:

pager的dispatchTouchEvent裏面統計觸摸點數目,達到要求後設置多點觸摸標誌位,在onInterceptTouchEvent裏面根據多點觸摸標誌位返回false,讓pager中的APV來處理多點事件,這樣避免讓pager左右滑動;



7. Folder操做


8. 更好