您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Android開發中Launcher3常見默認配置修改的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
具體如下:
Launcher概述
Launcher是開機完成后第一個啟動的應用,用來展示應用列表和快捷方式、小部件等。Launcher作為第一個(開機后第一個啟動的應用)展示給用戶的應用程序,其設計的好壞影響到用戶的體驗,甚至影響用戶購機的判斷。所以很多品牌廠商都會不遺余力的對Launcher進行深度定制,如小米的MIUI、華為的EMUI等。Android默認的Launcher沒有過多的定制,更加簡潔,受到源生黨的追捧,Google的Nexus系列手機基本都是用的源生Launcher,目前Android源生的Launcher版本是Launcher3,后面的相關內容也都是以Launcher3為基礎。
Launcher3默認配置修改
1.如何設置默認頁
res/values/Config.xml
<integer name="config_workspaceDefaultScreen">0</integer>
在Launcher3 桌面,不管在哪一頁,按HOME 鍵,會回到默認頁。
2.如何隱藏launcher3中的搜索框
① 在Launcher3/src/com/android/launcher3/Launcher.java中
注釋updateGlobalIcons()方法調用,共兩處。
public View getQsbBar() { if (mQsbBar == null) { mQsbBar = mInflater.inflate(R.layout.search_bar, mSearchDropTargetBar, false); - mSearchDropTargetBar.addView(mQsbBar); } + mQsbBar.setVisibility(View.GONE); return mQsbBar; } @Override public void bindSearchablesChanged() { //注釋該方法內容 /* boolean searchVisible = updateGlobalSearchIcon(); boolean voiceVisible = updateVoiceSearchIcon(searchVisible); if (mSearchDropTargetBar != null) { mSearchDropTargetBar.onSearchPackagesChanged(searchVisible, voiceVisible); } */ }
② 在Launcher3/src/com/android/launcher3/DynamicGrid.java中
// Layout the search bar //注釋如下內容 /* View qsbBar = launcher.getQsbBar(); LayoutParams vglp = qsbBar.getLayoutParams(); vglp.width = LayoutParams.MATCH_PARENT; vglp.height = LayoutParams.MATCH_PARENT; qsbBar.setLayoutParams(vglp); */
③ 在Launcher3/res/values/dimens.xml中
- <dimen name="dynamic_grid_search_bar_height">48dp</dimen>
+ <dimen name="dynamic_grid_search_bar_height">18dp</dimen>
重新編譯后即可看到效果。
3.如何調整原生Launcher3主界面的search框的大小?
修改如下:
定位打/packages/apps/Launcher3/res/values/dimens.xml。
<dimen name="dynamic_grid_edge_margin">3dp</dimen>//修改這個可以調整search框距離頂部距離。
<dimen name="dynamic_grid_search_bar_max_width">500dp</dimen>//search框的寬度,一般不需要調整。
<dimen name="dynamic_grid_search_bar_height">48dp</dimen>//search框的高度,不要調整為0,刪除按鈕需要占用一部分空間。
4.讓主菜單部分應用按指定順序排在前面?
添加res/values/arrays.xml:需要排序的應用:這里的item 內容一定要填寫正確,否則會匹配不上,無法參與排序。
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="apps_componentName" translatable="false"> <item>ComponentInfo{com.android.vending/com.android.vending.AssetBrowserActivity}</item> <item>ComponentInfo{com.android.browser/com.android.browser.BrowserActivity}</item> <item>ComponentInfo{com.android.settings/com.android.settings.Settings}</item> <item>ComponentInfo{com.android.camera2/com.android.camera.CameraLauncher}</item> <item>ComponentInfo{com.android.mms/com.android.mms.ui.ConversationList}</item> </string-array> </resources>
src/com/android/launcher3/Utilities.java
import java.util.Arrays; import java.util.List; public static List<String> getAppsComponentName(final Context context) { return Arrays.asList(context.getResources().getStringArray(R.array.apps_componentName)); } src/com/android/launcher3/LauncherModel.java protected int mPreviousConfigMcc; static List<String> appArray = new ArrayList<String>(); LauncherModel(LauncherAppState app, IconCache iconCache, AppFilter appFilter) { ...... mUserManager = UserManagerCompat.getInstance(context); appArray = Utilities.getAppsComponentName(context); }
添加如下sortApps 方法:apps 按arrays.xml 排序,在原來的排序基礎上,將arrays.xml 配置的應用按順序排在前面。arrays.xml中沒有涉及到的應用,還是原來的順序。
public static final void sortApps(ArrayList<AppInfo> apps) { int length = appArray.size(); List<AppInfo> assignApps = new ArrayList<AppInfo>(); for(int i=0;i<length;i++) { assignApps.add(i, null); } for(AppInfo app : apps){ for(int k=0; k<length; k++){ if (app.componentName.toString().equals(appArray.get(k))) { assignApps.set(k,app ); continue; } } } for (int i =length -1;i > -1 ;i--) { AppInfo app = assignApps.get(i); if(app != null){ apps.remove(app); apps.add(0, app); } } Log.d(TAG ,"The Apps List after Sort!"); }
src/com/android/launcher3/AppsCustomizePagedView.java
public void setApps(ArrayList<AppInfo> list) { if (!LauncherAppState.isDisableAllApps()) { ...... SprdAppSortAddonStub.getInstance().sortApps(mApps); LauncherModel.sortApps(mApps);//在原來排序的基礎上,再將arrays.xml中配置的應用按順序排在前面。 updatePageCountsAndInvalidateData(); } } private void addAppsWithoutInvalidate(ArrayList<AppInfo> list) { ...... // SPRD: bug375932 2014-12-02 Feature customize app icon sort. SprdAppSortAddonStub.getInstance().sortApps(mApps); LauncherModel.sortApps(mApps);//在原來排序的基礎上,再將arrays.xml中配置的應用按順序排在前面。 }
5.如何確定待機HOME界面布局使用的是哪個default_workspace文件?
src/com/android/launcher3/DynamicGrid.java
選擇哪個default_workspace 和public DynamicGrid(Context context, Resources resources,int minWidthPx, int minHeightPx, int widthPx, int heightPx, int awPx, int ahPx)中的minWidthPx 和minHeightPx 以及該方法中創建的deviceProfiles 列表關。
minWidthPx 、minHeightPx 值轉換為dpi之后 ,deviceProfiles 列表與其進行比較,選擇與當前屏幕大小最接近的deviceProfiles 的default_workSpace作為最終Home界面使用的default_workspace。
詳細解釋如下:
src/com/android/launcher3/DynamicGrid.java中
① deviceProfiles 列表如下:
deviceProfiles.add(new DeviceProfile("Super Short Stubby", 255, 300, 2, 3, 48, 13, (hasAA ? 3 : 5), 48, R.xml.default_workspace_4x4)); deviceProfiles.add(new DeviceProfile("Shorter Stubby", 255, 400, 3, 3, 48, 13, (hasAA ? 3 : 5), 48, R.xml.default_workspace_4x4)); deviceProfiles.add(new DeviceProfile("Short Stubby", 275, 420, 3, 4, 48, 13, (hasAA ? 5 : 5), 48, R.xml.default_workspace_4x4)); deviceProfiles.add(new DeviceProfile("Stubby", 255, 450, 3, 4, 48, 13, (hasAA ? 5 : 5), 48, R.xml.default_workspace_4x4)); deviceProfiles.add(new DeviceProfile("Nexus S", 296, 491.33f, 4, 4, 48, 13, (hasAA ? 5 : 5), 48, R.xml.default_workspace_4x4)); deviceProfiles.add(new DeviceProfile("Nexus 4", 335, 567, 4, 4, DEFAULT_ICON_SIZE_DP, 13, (hasAA ? 5 : 5), 56, R.xml.default_workspace_4x4)); deviceProfiles.add(new DeviceProfile("Nexus 5", 359, 567, 4, 4, DEFAULT_ICON_SIZE_DP, 13, (hasAA ? 5 : 5), 56, R.xml.default_workspace_4x4)); deviceProfiles.add(new DeviceProfile("Large Phone", 406, 694, 5, 5, 64, 14.4f, 5, 56, R.xml.default_workspace_5x5)); // The tablet profile is odd in that the landscape orientation // also includes the nav bar on the side deviceProfiles.add(new DeviceProfile("Nexus 7", 575, 904, 5, 6, 72, 14.4f, 7, 60, R.xml.default_workspace_5x6)); // Larger tablet profiles always have system bars on the top & bottom deviceProfiles.add(new DeviceProfile("Nexus 10", 727, 1207, 5, 6, 76, 14.4f, 7, 64, R.xml.default_workspace_5x6)); deviceProfiles.add(new DeviceProfile("20-inch Tablet", 1527, 2527, 7, 7, 100, 20, 7, 72, R.xml.default_workspace_4x4));
② 重新計算MinWidth 和MinHeigh 單位是dpi。
mMinWidth = dpiFromPx(minWidthPx, dm); mMinHeight = dpiFromPx(minHeightPx, dm);
③ 創建mProfile,mProfile.defaultLayoutId 就是最終Home界面使用的default_workspace 的id。
mProfile中的defaultLayoutId 是哪個default_workspace 見DeviceProfile.java。
mProfile = new DeviceProfile(context, deviceProfiles, mMinWidth, mMinHeight, widthPx, heightPx, awPx, ahPx, resources); src/com/android/launcher3/DeviceProfile.java DeviceProfile(Context context, ArrayList<DeviceProfile> profiles, float minWidth, float minHeight, int wPx, int hPx, int awPx, int ahPx, Resources res) {
方法中:
④ 用屏幕寬高創建的點(PointF xy = new PointF(width, height)
)與 deviceProfiles中的w 和 h 創建的點(dimens = new PointF(widthDps, heightDps)
)進行比較,也就是從deviceProfiles 列表中找出和當前屏幕大小最接近的deviceProfiles。
DeviceProfile closestProfile = findClosestDeviceProfile(minWidth, minHeight, points); ......
⑤ 采用和當前屏幕大小最接近的deviceProfiles的default_workspace
defaultLayoutId = closestProfile.defaultLayoutId;
6.如何替換第三方應用在launcher上顯示的圖標?
在launcher/src/com/android/launcher3/IconCache.java中修改,
private CacheEntry cacheLocked(ComponentName componentName, ResolveInfo info, private CacheEntry cacheLocked(ComponentName componentName, ResolveInfo info, HashMap<Object, CharSequence> labelCache) { CacheEntry entry = mCache.get(componentName); if (entry == null) { entry = new CacheEntry(); mCache.put(componentName, entry); ComponentName key = LauncherModel.getComponentNameFromResolveInfo(info); if (labelCache != null && labelCache.containsKey(key)) { entry.title = labelCache.get(key).toString(); } else { entry.title = info.loadLabel(mPackageManager).toString(); if (labelCache != null) { labelCache.put(key, entry.title); } } if (entry.title == null) { entry.title = info.activityInfo.name; } Drawable icon; int index = sysIndexOf(componentName.getClassName()); Log.i("jxt", "index:"+index+",Name:"+componentName.getClassName()); icon = getFullResIcon(info); if (index >= 0) { entry.icon = Utilities.createIconBitmap(icon, mContext); } else { entry.icon = Utilities.createIconBitmap( /* SPRD: Feature 253522, Remove the application drawer view @{ */ // getFullResIcon(info), mContext); icon, mContext, true); } /* 此處即為替換圖標代碼 {@*/ if("第三方應用的componentName".equals(componentName.toString())){ entry.icon = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.xxx); } /* @} */ } return entry; }
7.如何去掉Launcher3的開機引導頁面?
修改方案如下:
請定位到src/com/android/launcher3/LauncherClings.java文件:
class LauncherClings implements OnClickListener { ...... private static final String TAG_CROP_TOP_AND_SIDES = "crop_bg_top_and_sides private static final boolean DISABLE_CLINGS = false; private static final boolean DISABLE_CLINGS = true;
8.為何Launcher3設置一些壁紙后,壁紙顯示比預覽圖模糊?
預覽的時候,沒有做格式轉化,所以顯示正常!
在設置壁紙的時候,默認是采用jpeg格式轉換的,導致轉換后損耗了一些,設置壁紙后,某些對比度比較高的壁紙就顯示的模糊!
修改方案:
默認修改為采用png格式轉換!
android6.0之前的版本,請做如下修改:
定位到/packages/apps/Launcher3/的WallpaperCropActivity.java文件
1、String mOutputFormat = "jpg";//修改為"png"
2、
protected static String getFileExtension(String requestFormat) { String outputFormat = (requestFormat == null) ? "jpg"//修改為"png" : requestFormat; outputFormat = outputFormat.toLowerCase(); return (outputFormat.equals("png") || outputFormat.equals("gif")) ? "png" // We don't support gif compression. : "jpg"; }
android6.0的版本,請做如下修改:
定位到/packages/apps/Launcher3/WallpaperPicker/src/com/android/gallery3d/common/BitmapCropTask.java文件
if (crop.compress(CompressFormat.JPEG, DEFAULT_COMPRESS_QUALITY, tmpOut))
修改為:
if (crop.compress(CompressFormat.PNG, DEFAULT_COMPRESS_QUALITY, tmpOut))
9. 6.0平臺上Launcher3自帶的壁紙路徑是什么?
在6.0中,平臺版本預置了一些壁紙資源,相關路徑如下:
資源文件在:
packages/apps/Launcher3/WallpaperPicker/res/drawable-xhdpi/
字串文件在:
packages/apps/Launcher3/WallpaperPicker/res/values-nodpi/wallpapers.xml
關于“Android開發中Launcher3常見默認配置修改的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。