(系列文章点这里)
如果你用过谷歌即时桌面(Google Now)的话,你一定知道滑到桌面最左屏会是一个搜索界面,而且会呈现一些卡片比如天气,行程,新闻等等。这个东西也是我们可以自定义的,谷歌即时桌面其实也是基于Launcher3的。想必AOSP中一定有源码可以控制最左屏。

如果你已经导入了Eclipse项目,可以到Launcher类中寻找Launcher.hasCustomContentToLeft()方法,从字面上理解就是左边是否有自定义内容。之后跟自定义内容相关的方法或者变量的名字基本都跟“custom content”相关。这个方法默认是返回false的,也就是最左屏不存在。不妨替换成true试试,运行后我们可以发现的确可以滑到左屏的,但是什么东西都没有,只留一个搜索框。
下一步是向自定义内容中添加View了,添加的方法是Workspace.addToCustomContentPage(…),你可以传递一个View和与左屏相关的回调接口。然后就OK了。你可以在需要的时候调用这个方法,什么时候调呢?Google已经帮你想好了。就是Launcher.addCustomContentToLeft()方法,这个方法会在Launcher.onFinishBindingItems()中调用到,也就是桌面加载结束的时候加载自定义内容。着实帮你省去了很多开发时间。
所以说,如果你想要在左屏添加天气呀,系统设置呀等是完全OK的,毕竟传递个View进去就行,你也可以弄个Fragment专门控制左屏的内容和逻辑。这样的设计还是挺符合用户的需求的,毕竟Google的东西我们在大陆没办法正常使用,你如果能设计一个类似的,国内用户可以正常使用的包含左屏信息页的Launcher,我觉得还是挺有价值的。
再说说技术实现吧,既然是在Workspace上添加一个View,那么他应该是放在CellLayout里面的,但是为什么他和其他的CellLayout大小不一,而且占据全屏呢。我们找到桌面加载每一屏的代码,在Launcher.bindScreens()里面,会在加载完正常的图标屏之后再加载自定义的左屏,通过Workspace.createCustomContentPage()。然后会发现他给新生成的CellLayout的LayoutParams新添加了属性值,isFullScreenPage=true,一旦有了这个属性,在PagedView(Workspace的父类)的onMeasure和onLayout就会对其做特殊处理,保证其占据全屏。
博主大赞,期待下一篇launcher的分析
博主我想添加一个和主页面一样的左屏,有底部的hotseat和page_indicator,请问怎么做?要自己定义吗?
可能就不需要这篇博客说的东西了。你只需要把,默认的主页面设为第二屏,然后再第一屏上加你想加的东西就行
lz,怎么修改launcher3 的屏幕数量啊,默认是两个主屏幕(左右滑动的),怎么添加第三个屏幕?谢谢了
已经成功添加左屏
过来支持一下 值得收藏分享
不错