本篇講解Launcher的oncreate的第四步setupViews();生成桌面布局搓蚪,進行事件的綁定等歉胶,這里把setupViews();方法分為三步來講解。以setupViews()方法中的setupOverviewPanel();為分界線状知,以上為第一步采转,以下為第三步。
setupViews,方法第一部分
第一部分源碼為
mDragLayer = (DragLayer) findViewById(R.id.drag_layer);
mFocusHandler = mDragLayer.getFocusIndicatorHelper();
mWorkspace = mDragLayer.findViewById(R.id.workspace);
mWorkspace.initParentViews(mDragLayer);
mLauncherView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
// Setup the drag layer
mDragLayer.setup(this, mDragController, mAllAppsController);
// Setup the hotseat
mHotseat = (Hotseat) findViewById(R.id.hotseat);
if (mHotseat != null) {
mHotseat.setOnLongClickListener(this);
}
接下來我們就一步一步進行分析撰糠。
1.mDragLayer = (DragLayer) findViewById(R.id.drag_layer);
setupViews方法是在Launcher的oncreate中直接調(diào)用酥馍,所以我們可以得出結(jié)論是setupView方法在Launcher中,通過讀取res布局文件來找到各個UI控件阅酪,這里是創(chuàng)建了重要的DragLayer旨袒,所有操作基本都是在這個布局里面進行的。
2.mFocusHandler = mDragLayer.getFocusIndicatorHelper();
這里通過DrayLayer來獲取FocusIndicatorHelper术辐,F(xiàn)ocusIndicatorHelper是用于處理Focus的類砚尽,也就是焦點,android里面的focus是指UI界面辉词,當前處理的對象一般不會被感知到也不用處理focus必孤,我們能感知到focus的是editText,當前焦點在輸入框時瑞躺,輸入框會有光標敷搪,其實我們點擊的任何一個組件時,都會有焦點鎖定到該組件上幢哨,這樣就可以理解為什么focus會放到Draglayer里面了赡勘,方便進行事件的處理。例如Launcher中有代碼“favorite.setOnFocusChangeListener(mFocusHandler)捞镰。
3. mWorkspace = mDragLayer.findViewById(R.id.workspace);
獲取Workspace闸与,創(chuàng)建workspace的對象,桌面放圖標的地方由workspace和hotseat兩部分組成岸售,我們將hotseat稱作快捷欄几迄,它在屏幕下方,用于放一些不隨“頁面”滑動變化的固定圖標冰评。頁面就是我們說的workspace映胁。
workspace的父類是pagedView,由多個可以滑動的頁面組成甲雅,PagedView的父類是ViewGroup解孙,PagedView的子類是workspace和FolderPagedView,即Launcher利用ViewGroup做了一套放置圖標且可以通過滑動改變當前展示頁的類抛人,這個類我們用在了桌面和文件夾中弛姜。
4. mWorkspace.initParentViews(mDragLayer);
public void initParentViews(View parent) {
super.initParentViews(parent);
mPageIndicator.setAccessibilityDelegate(new OverviewAccessibilityDelegate());
}
這個方法里面調(diào)用了 mPageIndicator.setAccessibilityDelegate方法,這里調(diào)用的是View的setAccessibilityDelegate方法妖枚,因為PageIndicator繼承FramLayout廷臼,F(xiàn)ramLayout繼承ViewGroup,ViewGroup又繼承View,這里自定義了AccessibilityDelegate(OverviewAccessibilityDelegate())荠商,來處理一些點擊事件寂恬,
點進OverviewAccessibilityDelegate可以看到,里面定義了點擊OVERVIEW 莱没,WALLPAPERS初肉,WIDGETS,SETTINGS事件饰躲。
AccessibilityDelegate主要用來對View做一個檢測和處理牙咏,包括View的點擊選中,滑動嘹裂,touch妄壶,文本變化等等。
5.通過Flag設(shè)置屏幕狀態(tài)
mLauncherView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
對系統(tǒng)UI進行了Flag設(shè)置寄狼。
全屏 :View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
隱藏導航欄: View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
狀態(tài)欄 :View.SYSTEM_UI_FLAG_LAYOUT_STABLE
6. mDragLayer.setup(this, mDragController, mAllAppsController);
把DragLayer與DragController盯拱,AllAppsController進行綁定,這樣例嘱,點擊拖拽模塊就完成了框架層的搭建狡逢。
7. mHotseat = (Hotseat) findViewById(R.id.hotseat);
創(chuàng)建Hotseat對象炮车,并且為它設(shè)置長按點擊事件咸产。