1.前言
在14.0的系統rom產品定制化開發中,在進行launcher3的定制化中,在雙層改為單層的開發中,在原生的分頁
是橫線,而為了美觀就采用了系統原來的另外一種分頁方式,就是圓點比較美觀,接下來就來分析下相關的實現,然后實現其功能
2.Launcher3定制化之桌面分頁橫線改成圓點顯示功能實現的核心類
packages/apps/Launcher3/res/layout/launcher.xmlpackages/apps/Launcher3/src/com/android/launcher3/pageindicators/PageIndicatorDots.java
3.Launcher3定制化之桌面分頁橫線改成圓點顯示功能實現的核心功能分析和實現
在Launcher3中的核心布局中,最核心的就是workspace hotseat folder等核心部件中,在
Launcher3中的核心布局的相關控件就是在launcher.xml中這個Launcher主頁面中顯示的,這里顯示Launcher3桌面的核心控件,
DragLayer Workspace WorkspacePageIndicatorLine drop_target_bar hotseat等主要控件的布局
在這里面WorkspacePageIndicatorLine就是所謂的分頁橫線控件,而PageIndicatorDots.java就是
Launcher3的另外一種分頁圓點顯示控件,所以接下來分析下launcher.xml的相關源碼
3.1 launcher.xml中相關部件源碼分析
在實現Launcher3定制化之桌面分頁橫線改成圓點顯示功能實現的核心功能中,通過上述的分析得知,
在launcher.xml中的相關源碼中這里就是關于桌面布局的核心布局文件,接下來看下相關源碼修改
<com.android.launcher3.LauncherRootViewxmlns:android="http://schemas.android.com/apk/res/android"xmlns:launcher="http://schemas.android.com/apk/res-auto"android:id="@+id/launcher"android:layout_width="match_parent"android:layout_height="match_parent"android:fitsSystemWindows="true"><com.android.launcher3.dragndrop.DragLayerandroid:id="@+id/drag_layer"android:layout_width="match_parent"android:layout_height="match_parent"android:clipChildren="false"android:clipToPadding="false"android:importantForAccessibility="no"><com.android.launcher3.views.AccessibilityActionsViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:contentDescription="@string/home_screen"/><!-- The workspace contains 5 screens of cells --><!-- DO NOT CHANGE THE ID --><com.android.launcher3.Workspaceandroid:id="@+id/workspace"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_gravity="center"android:theme="@style/HomeScreenElementTheme"launcher:pageIndicator="@+id/page_indicator" /><!-- DO NOT CHANGE THE ID --><includeandroid:id="@+id/hotseat"layout="@layout/hotseat" />- <com.sprd.ext.pageindicators.WorkspacePageIndicatorLine+ <com.android.launcher3.pageindicators.PageIndicatorDotsandroid:id="@+id/page_indicator"android:layout_width="match_parent"android:layout_height="@dimen/workspace_page_indicator_height"android:layout_gravity="bottom|center_horizontal"android:theme="@style/HomeScreenElementTheme" /><includeandroid:id="@+id/drop_target_bar"layout="@layout/drop_target_bar" /><com.android.launcher3.views.ScrimViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/scrim_view"android:background="@android:color/transparent" /><includeandroid:id="@+id/apps_view"layout="@layout/all_apps"android:layout_width="match_parent"android:layout_height="match_parent" /><includeandroid:id="@+id/overview_panel"layout="@layout/overview_panel" /></com.android.launcher3.dragndrop.DragLayer></com.android.launcher3.LauncherRootView>
通過上述的Launcher3中的核心主屏幕部件launcher.xml中的相關源碼分析得知,在這里
Launcher.xml中的布局文件中,com.android.launcher3.pageindicators.WorkspacePageIndicator
就是Launcher3主屏幕的workspaces的布局分頁橫線控件的顯示分頁的,所以需要改成
圓點分頁控件就需要修改為com.android.launcher3.pageindicators.PageIndicatorDots
這樣通過上述的修改,就完成了修改為Launcher3布局分頁圓點顯示的功能的修改,接下來
看下其他方面關于橫線替換成圓點的相關修改,接下來分析下PageIndicatorDots.java
中的相關源碼實現
3.2 PageIndicatorDots中關于實現圓點繪制布局的相關源碼的修改
通過上述的Launcher3中的核心控件的分析 和以前在10.0到12.0的相關修改橫線分頁到
圓點分頁都是需要實現 setInsets(Rect insets)等相關方法的,通過這些的修改來
完成對圓點分頁的適配工作,接下來具體分析下PageIndicatorDots中的相關源碼布局
通過在Insettable中的接口實現 setInsets(Rect insets)來在這個類里面添加具體的方法
import com.android.launcher3.R;import com.android.launcher3.Utilities;import com.android.launcher3.util.Themes;-+import com.android.launcher3.Launcher;+import android.graphics.Rect;+import com.android.launcher3.DeviceProfile;+import android.view.Gravity;+import android.widget.FrameLayout;+import com.android.launcher3.Insettable;-public class PageIndicatorDots extends View implements PageIndicator {+public class PageIndicatorDots extends View implements Insettable,PageIndicator {private float mCurrentPosition;private float mFinalPosition;private ObjectAnimator mAnimator;-+ private Launcher mLauncher;private float[] mEntryAnimationRadiusFactors;public PageIndicatorDots(Context context) {@@ -114,7 +119,7 @@ public class PageIndicatorDots extends View implements PageIndicator {mCirclePaint.setColor(Themes.getAttrColor(context, R.attr.folderPaginationColor));mDotRadius = getResources().getDimension(R.dimen.page_indicator_dot_size) / 2;setOutlineProvider(new MyOutlineProver());-+ mLauncher = Launcher.getLauncher(context);mIsRtl = Utilities.isRtl(getResources());}
Launcher3定制化之桌面分頁橫線改成圓點顯示功能實現的核心功能中,通過上述的分析得知,
在上述的PageIndicatorDots方法中,通過實現Insettable的接口,接下來就可以在
這里添加setInsets(Rect insets)的實現,通過需要實例化Launcher的實現,在實現
setInsets(Rect insets)的時候用到相關的實現具體實現如下
+ @Override+ public void setInsets(Rect insets) {+ DeviceProfile grid = mLauncher.getDeviceProfile();+ FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams();++ if (grid.isVerticalBarLayout()) {+ Rect padding = grid.workspacePadding;+ lp.leftMargin = padding.left + grid.workspaceCellPaddingXPx;+ lp.rightMargin = padding.right + grid.workspaceCellPaddingXPx;+ lp.bottomMargin = padding.bottom;+ } else {+ lp.leftMargin = lp.rightMargin = 0;+ lp.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;+ lp.bottomMargin = grid.hotseatBarSizePx + insets.bottom;+ }+ setLayoutParams(lp);+ }
在通過在使用的過程中,會發現在計算分頁數量的時候,這里會出現異常,所以需要在
異常的地方做修改,排除分頁滾動為0的情況,具體分析實現如下:
@Overridepublic void setScroll(int currentScroll, int totalScroll) {if (SHOW_DOT_PAGINATION.get() && mActivePage != 0 && currentScroll == 0) {CURRENT_POSITION.set(this, (float) mActivePage);return;}if (mNumPages <= 1) {return;}if (mShouldAutoHide) {animatePaginationToAlpha(VISIBLE_ALPHA);}if (mIsRtl) {currentScroll = totalScroll - currentScroll;}int scrollPerPage = totalScroll / (mNumPages - 1);+ if(scrollPerPage == 0)return;int pageToLeft = currentScroll / scrollPerPage;int pageToLeftScroll = pageToLeft * scrollPerPage;int pageToRightScroll = pageToLeftScroll + scrollPerPage;@@ -336,4 +342,22 @@ public class PageIndicatorDots extends View implements PageIndicator {}}}
通過上面幾部分的修改,在Launcher3中,就完美實現了在雙層改成單層的時候,關于分頁橫線
修改為分頁圓點的核心功能的實現,最終就完成了功能的實現