最近负责公司一个小项目系统定制方面的工作,主要负责Launcher方面的自定义修改。使用的是安卓4.4的OS,系统源码下有Launcher2和Launcher3两套源码,但是系统默认的默认启动的是Launcher2的代码,其实现在的手机厂商(小米和魅族等)的桌面基本都是基于Launcher3的基础进行的二次开发的成果。Laucher3相较于Launcher2来说最直观的感受莫过于整个桌面的UI风格,Launcher3在UI方面无疑是比Launcher2要好的多的。好了,直接进入正题。
1. 第一步是把源码下的Launcher3目录导入到Eclipse中,也可以导入到Android studio中,但是博主用的是Eclispse,有兴趣的朋友也可以试试用AS进行调试的,网上的教程也不少。导入的过程可能会遇到一些麻烦,比如缺少一点jar包等,这个网上已经有很多人阐述或者转载,这里不再多提。值得说一点的是每个版本的安卓源码中的Launcher3目录结构不尽相同,尤其5.0的launcher文件目录较为复杂,不过网上同样也是有教程的。多花点时间去试试就好了。
这是博主的Launcher3目录结构,包很多,但是主要的代码是在com.android.launcher3中实现的,布局文件在res/目录下。首先必须了解Launcher3的整个UI结构,这个百度一下也是比较容易KO的,然后是com.android,launcher3下的类文件。
其中 Laucnher3常用类包括:
<1>Launcher:launcher中主Activity;
<2>Workspace:抽象的桌面;
<3>CellLayout:Workspace的一个view;
<4>Folder: 文件夹显示view;
<5>FolderIcon:文件夹图标;
<6>BubbleTextView:图标,一个个的快捷方式;
<7>ItemInfo:从快捷方式,文件夹,小部件中抽象出来的数据模型;
<8>LauncherModel:封装的对数据库的操作;
<9>LauncherProvider:launcher的数据庫,保存的是桌面item信息;
<10>LauncherAppState:初始化一些对象;
<11>DrayLayer:launcherlayout的rootview,处理拖动事件;
<12>DragController:为Drag定义的一个接口;
<13>Drayview:拖动图标的时候跟随手指移动的view
3. 了解完基本的UI和Java代码大致功能之后,就可以进行自定义的修改了。博主本次尝试的修改有1.取消顶部的谷歌Searchbar;2.取消Allapps按键,并将所有应用程序显示在桌面3取消底部的hotseat;4.自定义快捷方式在桌面的排列方式;5. 去掉launcher3的应用图标;6.设置屏幕不旋转。以下会一一进行阐述。
<1>取消顶部的谷歌Searchbar
首先要说的就是千万不要以为从res下的UI入手就能KO掉这个小东西,其实当你试图删除桌面的非原生应用快捷方式的时候就会发现其实顶部的不仅仅是谷歌搜索栏,共用那同一个空间的还有卸载的空间,并且卸载应用对应的是一个拖动发手势操作,所以建议直接从代码入手就好了。在 Launcher3/src/com/android/launcher3/Launcher.java的getQsbBar()方法中,注释掉mSearchDropTargetBar.addView(mQsbBar)这一行代码,然后根据Eclipse提示再注释掉相关的调用。这样的修改过后workspace就不会加载到谷歌搜索的那个控件,但是那部分空间依然保存,如果想把谷歌搜索栏占用的空间也去掉,则修改DynamicFrid.java文件中的searchBarHeightPx,参数设为0,即设定高度为0,但是不建议这样修改,因为带来的问题就是删除提示那个控件也会变成高度为0
<2>取消Allapps按键
其实这个Allapps按键,带来的效果就是具有谷歌特色的抽屉式UI布局,点击后呈现一个所有应用程序的界面。说点题外话为什么现在很多手机rom厂商都取消了这个按键呢,还是参考ios风格的吧。这个修改是最为直接,也是博主直接参考的网上已有的做法,把AppsCustomizePagedView.java文件中的DISABLE_ALL_APPS属性,设置为ture,这样所有的应用程序就都会显示在桌面了,allapps按钮也随之取消
<3>取消底部的hotseat
这个其实完全没有必要的啦,但是奈何产品经理考(nao)虑(can)深(sha)远(bi),博主也只有试试咯,感觉所有改动里面就这个花的时间最多。不过最后还是KO了,貌似没留下啥后遗症,基本的思维依旧是直接在Launcher.java这个主activity中直接查找加载hotseat布局的代码,然后修改让它不加载,具体修改如下,首先注释掉Launcher.java中的 mHotseat = (Hotseat) findViewById(R.id.hotseat);这样就不会加载hotseat,但是调试的过程中长按桌面会出现bug,安卓logcat的error 提示在代码中进行分析,最后发现问题出在workspace.java中的getChangeStateAnimation(final State state, boolean animated, int delay, int snapPage)方法,注释掉final View hotseat = mLauncher.getHotseat();代码,然后根据提示注释掉其他的调用,这样就完全屏蔽掉了hotseat栏了,此外想要取消这部分空间的话也是在DynamicFrid.java文件中进行修改,将hotseatBarHeightPx值设为0就可以了
<4>自定义快捷方式在桌面的排列方式
这个可以分为两部分来进行阐述,其中一部分是快捷方式在第一个workspace的排列,这个res/xml/default_wrokspace文件中进行修改就好,此外,在allapps界面中程序图标的排列是根据系统的屏幕分辨率进行排列的,取消掉allapps之后,图标会排在workspace中,如果要设置布局,即几行*几列的问题,如果不考虑多设备适配的话,直接写死就可以满足需求了,直接修改DynamicGrid中的参数numRows和numColums就好,此外,在这个文件还可以设置hotseat里面保有的快捷方式个数,参数为numHotseatIcons
<5>去掉launcher3的应用图标
参考原生的launcher2来说,所谓桌面,自然是开机就启动的,然后最好不要把这个应用图标暴露给用户,去掉manifest文件中的
<6>设置屏幕不旋转
这个修改在manifest文件下确实有,代码为android:screenOrientation="nosensor",但是launcher代码中会识别是手机还是平板,手机的话确实是不受传感器影响,一直保持竖屏状态的,但是如果识别为平板,那么就是会旋转的,某些情况下会强制让它不旋转,具体是什么情况,唉,产品经理说了算吧。T -T。修改方法在Launcher文件中的unlockScreenOrientation()方法中,将if条件中设置为setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);更改LANDSCAPE就可以将横屏设置为其他模式了。默认是自由旋转的
关于Launcher3的修改感觉就这些吧,还有一些folder相关的东西博主也没有进行深究了,有兴趣的朋友看看源码就好,折腾了一个多周的Launcher之后,其实发现市面上的那些桌面,也都是在源码的基础上进行二次开发的结果,其实多花点时间也是可以做出挺好的桌面程序的。以上,第一篇博客,如有说错的地方敬请指正,有问题的也可以和博主一起探讨T -T。如有转载请注明出处,谢谢