基於原生態 launcher3的5.1源代碼進行分析。
- 通過Hierachy view工具,我們知道,Folder佈局是在FolderIcon這個文件中進行的,dispatchDraw()這個是關鍵的地方,在這裏我們先打一個log堆棧出來分析下。
java.lang.Throwable
at com.android.launcher3.FolderIcon.computePreviewItemDrawingParams(FolderIcon.java:564)
at com.android.launcher3.FolderIcon.dispatchDraw(FolderIcon.java:645)
at android.view.View.updateDisplayListIfDirty(View.java:14177)
at android.view.View.getDisplayList(View.java:14204)
at android.view.View.draw(View.java:14974)
at android.view.ViewGroup.drawChild(ViewGroup.java:3457)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3244)
at com.android.launcher3.ShortcutAndWidgetContainer.dispatchDraw(ShortcutAndWidgetContainer.java:93)
at android.view.View.updateDisplayListIfDirty(View.java:14177)
at android.view.View.getDisplayList(View.java:14204)
at android.view.View.draw(View.java:14974)
at android.view.ViewGroup.drawChild(ViewGroup.java:3457)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3244)
at com.android.launcher3.CellLayout.dispatchDraw(CellLayout.java:518)
at android.view.View.draw(View.java:15249)
at android.view.View.updateDisplayListIfDirty(View.java:14182)
at android.view.View.getDisplayList(View.java:14204)
at android.view.View.draw(View.java:14974)
at android.view.ViewGroup.drawChild(ViewGroup.java:3457)
at com.android.launcher3.PagedView.dispatchDraw(PagedView.java:1339)
at android.view.View.draw(View.java:15249)
at android.view.View.updateDisplayListIfDirty(View.java:14182)
at android.view.View.getDisplayList(View.java:14204)
at android.view.View.draw(View.java:14974)
at android.view.ViewGroup.drawChild(ViewGroup.java:3457)
at com.android.launcher3.DragLayer.drawChild(DragLayer.java:949)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3244)
at com.android.launcher3.DragLayer.dispatchDraw(DragLayer.java:915)
at android.view.View.updateDisplayListIfDirty(View.java:14177)
at android.view.View.getDisplayList(View.java:14204)
at android.view.View.draw(View.java:14974)
at android.view.ViewGroup.drawChild(ViewGroup.java:3457)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3244)
at android.view.View.draw(View.java:15249)
at android.widget.FrameLayout.draw(FrameLayout.java:598)
at android.view.View.updateDisplayListIfDirty(View.java:14182)
at android.view.View.getDisplayList(View.java:14204)
at android.view.View.draw(View.java:14974)
at android.view.ViewGroup.drawChild(ViewGroup.java:3457)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3244)
at android.view.View.updateDisplayListIfDirty(View.java:14177)
at android.view.View.getDisplayList(View.java:14204)
at android.view.View.draw(View.java:14974)
at android.view.ViewGroup.drawChild(ViewGroup.java:3457)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3244)
at android.view.View.updateDisplayListIfDirty(View.java:14177)
at android.view.View.getDisplayList(View.java:14204)
at android.view.View.draw(View.java:14974)
at android.view.ViewGroup.drawChild(ViewGroup.java:3457)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3244)
at android.view.View.draw(View.java:15249)
at android.widget.FrameLayout.draw(FrameLayout.java:598)
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2667)
at android.view.View.updateDisplayListIfDirty(View.java:14182)
at android.view.View.getDisplayList(View.java:14204)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:273)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:279)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:318)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2530)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2352)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1982)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5895)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
at android.view.Choreographer.doCallbacks(Choreographer.java:580)
at android.view.Choreographer.doFrame(Choreographer.java:550)
at android.view.Choreographer$Frame
- 我們來分析pcomputePreviewDrawingParams()
在這裏進行一些layout前的各個數據的初始化的一個過程。
private void computePreviewDrawingParams(int drawableSize, int totalSize) {}
所現實的三個小圖片大小 :mIntrinsicIconSize=72 ;
Folder文件夾所佔用的空間 :mTotalWidth=117 ;
圓形的背景圖片大小 :previewSize=90 ;
x座標 :params.transX = transX;
y座標 :params.transY = transY;
顯示的圖標要縮小的比例 :params.scale = totalScale;
params.overlayAlpha = overlayAlpha;
previewPadding=6 ;
mAvailableSpaceInPreview=78 ;
adjustedAvailableSpace=70 ;
unscaledHeight=84 ;
mBaselineIconScale=0.8333333 ;
mBaselineIconSize=60 ;
mMaxPerspectiveShift=10.8
//
3. view的繪製過程
A. draw()
B. onDraw()
C. dispatchDraw()