Launcher分析2

Launcher分析2_第1张图片

从上图看到有这么些主要的view,同还有一个Cling主要用于workspacefolderallapps的向导

 

 

View的运行主要看Launcher怎样setup

 

 

 

 

 

1.Launcher onCreate:

a) 创建DragController,带入Launcher,

b) 加载DragLayer,Workspace,Hotseat,SearchDropTargetBar,AppsCutomizeTabHost,AppsCustomizePagedView

c) DragLayer带入Launcher和DragController

d) Hotseat带入Launcher

e) 设置Workspace没有触感反映,长按监听器,并setup带入DragController

OnLongClick:

Setup:

f) 把Workspace加入到DragController的DragListener

onDragStart:

onDragEnd:

g) AppsCustomizePageView带入launcherDragController

h) 设置DragControllerDragScollerWorkspace

ScrollLeft

ScrollRight

OnEnterScrollArea

OnExitScrollArea

 

i) 设置DragControllerScrollViewDragLayer

j) 设置DragControllerMoveTarget ViewWorkspace

k) 设置DragControllerDropTargetWorkspace

l) SearchDropTargetBar带入LauncherDragController

 

 

2.DragController

a) 构造函数DragController(Launcher launcher)

i. 带入Launcher

ii. 创建Handler

iii. 获取ScrollZone

iv. VelocityTracker获取

v. Vibrator

vi. 获取FlingToDeleteThresholdVelocity

b) DragScrollerWorkspaceScroll viewDragLayer, MoveTarget View WorkspaceDropTarget回调为Workspace

c) DragListenerworkspace创建的DragTargetDragEnforcer,还有Workspace

d) 

3.DrayLayer,继承FrameLayout

a) 构造函数DragLayer(Context context, AttributeSet attrs) ,设置OnHierarchyChangeListenerleft/right HoverDrawable

OnChildViewAdded:获取Workspace和SearchDropTargetBar子viewindex

OnChildViewRemoved

 

b) Setup:带入LauncherDragController

c) OnLayout:只有当childcustompositiontrue时才child.layout

d) 

4.Workspace:继承SmoothPageView,继承PagedView,继承ViewGroup

a) 构造函数

i. 创建DropTargetDragEnforcer

ii. 设置data is ready

iii. 获取WallpaperManager

iv. 默认cellCountXcellCountY为 4*4

v. 当是大屏时,获取到最大dims和最小dims,得出新的cellCountXcellCountY

vi. 如果有配置默认的cellCountXcellCountYdefaultpage,则重新赋值

vii. 设置OnHierarchyChangeListener

OnChildViewAdded:获取child CellLayout,并设置InterceptTouch listener

OnChildViewRemoved

viii. LauncherModel的updateWorkspaceLayoutCells更新LauncherModel的cellCountXcellCountY

ix. 初始化Workspace

1. 设置Launcher当前页

2. 获取IconCache,并设置会调用onDraw

3. 获取background图片,获取FlingToDeleteThresholdVelocity

b) 涉及到的回调(来自DragController

onDragStart:

onDragEnd:

ScrollLeft

ScrollRight

OnEnterScrollArea

OnExitScrollArea

DropTarget对象:

 

c) onInterceptTouchEvent

d) OnLayout:如果当前页处于其中,那么需要更新wallpaper

e) OnDraw:更新backgroundxy,并调用launcherModel的bindRemainingSynchronousPages,告诉launchermodel 在第一drawfinish binding

5.CellLayout继承ViewGroup,在workspace设置了onInterceptTouch listener

a) 构造函数创建DrapTarget DragEnforcer

i. 获取xml参数

ii. 创建EaseOuntInterpolator

iii. 获取fromAlphatoAlpha

iv. 创建InterruptibleInOutAnimator

v. 创建ShortcutAndWidgetContainer,把其作为子view

b) OnDraw:更新background,画聚焦的BubbleTextView

c) onMeasureShortcutAndWidgetContainer设置大小,还有各个子viewmeasure

d) OnSizeChangebackgroundforeground,更改rect

e) OnLayout让每个子view layout

6.ShortcutAndWidgetContainer,继承ViewGroup

a) 构造函数:获取WallpaperManager

b) onLayout:当child不等于gone的时候才对child进行Layoutlp.droppedtrue时,获取screen上的xy,让wallpapermananger迁移

c) 

7.BubbleTextView:继承TextView

a) 画出Bubble阴影

8.AppWidgetResizeFrame,在DrawLayer里面

9.Hotseat

10.AppsCustomizePagedView

 Launcher分析2_第2张图片

通过launcherbindItem,如果是application或者shortcut会调用workspace addInScreen

每个item都是一个BubbleTextview或者FolderIcon,把BubbleTextView或者FolderIcon加入到CellLayoutShortcutsAndWidgets

 

 

Touch机制:从上到下,看看Touchlauncher里面怎么处理

DrawLayer:(处理AppWidgetResizeFrame,其他交由DragController处理)

onInterceptTouchEvent:

ActionDown

1.查看是否点中的xy值在AppWidgetResizeFrame区域内,如果是则代表子view不能得到touch事件

2.查看是否打开了folder,如果打开根据是否在编辑,停止编辑,并关闭folder,且其他子view也不能得到touch时间

3.其他都返回false,让子view能处理

 

onTouchEvent:

ActionDown:

查看是否点中的xy值在appWidgetResizeFrame区域内,则不给父view回调touch

ACTION_MOVE

当前有要处理的appWidgetResizeFrame,则调用其visualizeResizeForDelta,进行位置的更改

ActionUp:告知appWidgetResizeFrame,触发了onTouchUp

 

其他由DragController处理

 

Workspace:(屏幕换页操作)

OnInterceptTouchEvent

ActionDown

获取xy

        ActionUp:

如果状态为TOUCH_STATE_REST,获取当前CellLayout,如果为occupiedCell,触发wallpapertap

 

其他为父类pageviewonInterceptTouchEvent

如果没有子view,调用默认的onInterceptTouchEvent

ActionDown:获取xy值,如果scroll没结束,则状态为 TOUCH_STATE_SCROLLING,如果点中的区域为上下一页,状态设置为TOUCH_STATE_PREV_PAGETOUCH_STATE_NEXT_PAGE,只要状态不为TOUCH_STATE_REST,则把touchevent事件截获,不传递给子view

ACTION_MOVE

如果touchstateTOUCH_STATE_SCROLLING,则也截获事件

不为TOUCH_STATE_SCROLLING时,判断scrolling是否要开始,开始则把状态置为TOUCH_STATE_SCROLLING

 

Action_Up:

状态设置为TOUCH_STATE_REST

 

OnTouchEvent

不会给父view

ActionDown

停止scroller,获取xy

 

ACTION_MOVE

如果状态为TOUCH_STATE_SCROLLING

根据x值,scrollBy界面

不是则判断是否开始scrolling start(状态是否设置为TOUCH_STATE_SCROLLING

 

ACTION_UP

如果状态在TOUCH_STATE_SCROLLING,那么得出滑动的x,调用Scroller.startScroll,跳到哪一页

如果状态为TOUCH_STATE_PREV_PAGE/TOUCH_STATE_NEXT_PAGE,算出大小,直接Scroller.startScroll跳到那一页

 

CellLayout:

onInterceptTouchEvent:(workspace设置了onInterceptTouchListener)

ActionDown:把CellInfo reset

其他:交给了workspaceonTouch listener,如果状态为 SMALL 或者SPRING_LOADED或者不是在switching state则并不传递给子view

如果没有onTouch listener,则把cellinfo值,从ShortcutsAndWidgets里面子view获取,设置到tag里面

 

DragController

OnInterceptTouchEvent

ACTIONDOWN:

记住点击区域

ACTIONMOVE:

ACTIONUP:

OnTouchEvent

ACTIONDOWN:

判断是否在滑动区域,并记住点击区域,阻断父view的事件

ACTIONMOVE:

更改dragviewstartDrag创建)的位置,检查scrollstate

ACTIONUP:

Engdrag

 

startDrag:在launcher long click调用workspacestartdrag

StartDrag获取被点中的view,把viewCellayout里面的子viewShortcutandWidget)的子viewBubbleTextView,FolderIcon))设置为invisible,并让celllayout准备drag,并把view clearfocussetPressfalse

创建Canvas,把view转化成带outline bitmap

调用DragControllerstartDrag,回调DragListeneronDragStart

创建DropTragetDragObject,触发震动

创建DragView,根据x,y值移动dragview

DragView:放置bitmapview,提供拖拽



你可能感兴趣的:(android)