Android开发中Launcher3常见默认配置修改方法总结
本文实例讲述了Android开发中Launcher3常见默认配置修改方法。分享给大家供大家参考,具体如下:
Launcher概述
Launcher是开机完成后第一个启动的应用,用来展示应用列表和快捷方式、小部件等。Launcher作为第一个(开机后第一个启动的应用)展示给用户的应用程序,其设计的好坏影响到用户的体验,甚至影响用户购机的判断。所以很多品牌厂商都会不遗余力的对Launcher进行深度定制,如小米的MIUI、华为的EMUI等。Android默认的Launcher没有过多的定制,更加简洁,受到源生党的追捧,Google的Nexus系列手机基本都是用的源生Launcher,目前Android源生的Launcher版本是Launcher3,后面的相关内容也都是以Launcher3为基础。
Launcher3默认配置修改
1.如何设置默认页
res/values/Config.xml
0
在Launcher3桌面,不管在哪一页,按HOME键,会回到默认页。
2.如何隐藏launcher3中的搜索框
①在Launcher3/src/com/android/launcher3/Launcher.java中
注释updateGlobalIcons()方法调用,共两处。
publicViewgetQsbBar(){ if(mQsbBar==null){ mQsbBar=mInflater.inflate(R.layout.search_bar,mSearchDropTargetBar,false); -mSearchDropTargetBar.addView(mQsbBar); } +mQsbBar.setVisibility(View.GONE); returnmQsbBar; } @Override publicvoidbindSearchablesChanged(){//注释该方法内容 /*booleansearchVisible=updateGlobalSearchIcon(); booleanvoiceVisible=updateVoiceSearchIcon(searchVisible); if(mSearchDropTargetBar!=null){ mSearchDropTargetBar.onSearchPackagesChanged(searchVisible,voiceVisible); } */ }
②在Launcher3/src/com/android/launcher3/DynamicGrid.java中
//Layoutthesearchbar //注释如下内容 /*ViewqsbBar=launcher.getQsbBar(); LayoutParamsvglp=qsbBar.getLayoutParams(); vglp.width=LayoutParams.MATCH_PARENT; vglp.height=LayoutParams.MATCH_PARENT; qsbBar.setLayoutParams(vglp); */
③在Launcher3/res/values/dimens.xml中
-
+
重新编译后即可看到效果。
3.如何调整原生Launcher3主界面的search框的大小?
修改如下:
定位打/packages/apps/Launcher3/res/values/dimens.xml。
4.让主菜单部分应用按指定顺序排在前面?
添加res/values/arrays.xml:需要排序的应用:这里的item内容一定要填写正确,否则会匹配不上,无法参与排序。
- ComponentInfo{com.android.vending/com.android.vending.AssetBrowserActivity}
- ComponentInfo{com.android.browser/com.android.browser.BrowserActivity}
- ComponentInfo{com.android.settings/com.android.settings.Settings}
- ComponentInfo{com.android.camera2/com.android.camera.CameraLauncher}
- ComponentInfo{com.android.mms/com.android.mms.ui.ConversationList}
src/com/android/launcher3/Utilities.java
importjava.util.Arrays; importjava.util.List; publicstaticListgetAppsComponentName(finalContextcontext){ returnArrays.asList(context.getResources().getStringArray(R.array.apps_componentName)); } src/com/android/launcher3/LauncherModel.java protectedintmPreviousConfigMcc; staticList appArray=newArrayList (); LauncherModel(LauncherAppStateapp,IconCacheiconCache,AppFilterappFilter){ ...... mUserManager=UserManagerCompat.getInstance(context); appArray=Utilities.getAppsComponentName(context); }
添加如下sortApps方法:apps按arrays.xml排序,在原来的排序基础上,将arrays.xml配置的应用按顺序排在前面。arrays.xml中没有涉及到的应用,还是原来的顺序。
publicstaticfinalvoidsortApps(ArrayListapps){ intlength=appArray.size(); List assignApps=newArrayList (); for(inti=0;i -1;i--){ AppInfoapp=assignApps.get(i); if(app!=null){ apps.remove(app); apps.add(0,app); } } Log.d(TAG,"TheAppsListafterSort!"); }
src/com/android/launcher3/AppsCustomizePagedView.java
publicvoidsetApps(ArrayListlist){ if(!LauncherAppState.isDisableAllApps()){ ...... SprdAppSortAddonStub.getInstance().sortApps(mApps); LauncherModel.sortApps(mApps);//在原来排序的基础上,再将arrays.xml中配置的应用按顺序排在前面。 updatePageCountsAndInvalidateData(); } } privatevoidaddAppsWithoutInvalidate(ArrayList list){ ...... //SPRD:bug3759322014-12-02Featurecustomizeappiconsort. SprdAppSortAddonStub.getInstance().sortApps(mApps); LauncherModel.sortApps(mApps);//在原来排序的基础上,再将arrays.xml中配置的应用按顺序排在前面。 }
5.如何确定待机HOME界面布局使用的是哪个default_workspace文件?
src/com/android/launcher3/DynamicGrid.java
选择哪个default_workspace和publicDynamicGrid(Contextcontext,Resourcesresources,intminWidthPx,intminHeightPx,intwidthPx,intheightPx,intawPx,intahPx)中的minWidthPx和minHeightPx以及该方法中创建的deviceProfiles列表关。
minWidthPx、minHeightPx值转换为dpi之后,deviceProfiles列表与其进行比较,选择与当前屏幕大小最接近的deviceProfiles的default_workSpace作为最终Home界面使用的default_workspace。
详细解释如下:
src/com/android/launcher3/DynamicGrid.java中
①deviceProfiles列表如下:
deviceProfiles.add(newDeviceProfile("SuperShortStubby", 255,300,2,3,48,13,(hasAA?3:5),48,R.xml.default_workspace_4x4)); deviceProfiles.add(newDeviceProfile("ShorterStubby", 255,400,3,3,48,13,(hasAA?3:5),48,R.xml.default_workspace_4x4)); deviceProfiles.add(newDeviceProfile("ShortStubby", 275,420,3,4,48,13,(hasAA?5:5),48,R.xml.default_workspace_4x4)); deviceProfiles.add(newDeviceProfile("Stubby", 255,450,3,4,48,13,(hasAA?5:5),48,R.xml.default_workspace_4x4)); deviceProfiles.add(newDeviceProfile("NexusS", 296,491.33f,4,4,48,13,(hasAA?5:5),48,R.xml.default_workspace_4x4)); deviceProfiles.add(newDeviceProfile("Nexus4", 335,567,4,4,DEFAULT_ICON_SIZE_DP,13,(hasAA?5:5),56,R.xml.default_workspace_4x4)); deviceProfiles.add(newDeviceProfile("Nexus5", 359,567,4,4,DEFAULT_ICON_SIZE_DP,13,(hasAA?5:5),56,R.xml.default_workspace_4x4)); deviceProfiles.add(newDeviceProfile("LargePhone", 406,694,5,5,64,14.4f,5,56,R.xml.default_workspace_5x5)); //Thetabletprofileisoddinthatthelandscapeorientation //alsoincludesthenavbarontheside deviceProfiles.add(newDeviceProfile("Nexus7", 575,904,5,6,72,14.4f,7,60,R.xml.default_workspace_5x6)); //Largertabletprofilesalwayshavesystembarsonthetop&bottom deviceProfiles.add(newDeviceProfile("Nexus10", 727,1207,5,6,76,14.4f,7,64,R.xml.default_workspace_5x6)); deviceProfiles.add(newDeviceProfile("20-inchTablet", 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=newDeviceProfile(context,deviceProfiles, mMinWidth,mMinHeight, widthPx,heightPx, awPx,ahPx, resources); src/com/android/launcher3/DeviceProfile.java DeviceProfile(Contextcontext, ArrayListprofiles, floatminWidth,floatminHeight, intwPx,inthPx, intawPx,intahPx, Resourcesres){
方法中:
④用屏幕宽高创建的点(PointFxy=newPointF(width,height))与deviceProfiles中的w和h创建的点(dimens=newPointF(widthDps,heightDps))进行比较,也就是从deviceProfiles列表中找出和当前屏幕大小最接近的deviceProfiles。
DeviceProfileclosestProfile=findClosestDeviceProfile(minWidth,minHeight,points); ......
⑤采用和当前屏幕大小最接近的deviceProfiles的default_workspace
defaultLayoutId=closestProfile.defaultLayoutId;
6.如何替换第三方应用在launcher上显示的图标?
在launcher/src/com/android/launcher3/IconCache.java中修改,
privateCacheEntrycacheLocked(ComponentNamecomponentName,ResolveInfoinfo,privateCacheEntrycacheLocked(ComponentNamecomponentName,ResolveInfoinfo, HashMap
7.如何去掉Launcher3的开机引导页面?
修改方案如下:
请定位到src/com/android/launcher3/LauncherClings.java文件:
classLauncherClingsimplementsOnClickListener{ ...... privatestaticfinalStringTAG_CROP_TOP_AND_SIDES="crop_bg_top_and_sides privatestaticfinalbooleanDISABLE_CLINGS=false; privatestaticfinalbooleanDISABLE_CLINGS=true;
8.为何Launcher3设置一些壁纸后,壁纸显示比预览图模糊?
预览的时候,没有做格式转化,所以显示正常!
在设置壁纸的时候,默认是采用jpeg格式转换的,导致转换后损耗了一些,设置壁纸后,某些对比度比较高的壁纸就显示的模糊!
修改方案:
默认修改为采用png格式转换!
android6.0之前的版本,请做如下修改:
定位到/packages/apps/Launcher3/的WallpaperCropActivity.java文件
1、StringmOutputFormat="jpg";//修改为"png"
2、
protectedstaticStringgetFileExtension(StringrequestFormat){ StringoutputFormat=(requestFormat==null) ?"jpg"//修改为"png" :requestFormat; outputFormat=outputFormat.toLowerCase(); return(outputFormat.equals("png")||outputFormat.equals("gif")) ?"png"//Wedon'tsupportgifcompression. :"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相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android多媒体操作技巧汇总(音频,视频,录音等)》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。