Android Launcher分析和修改1——Launcher默认界面配置(default_workspace)
最近工作都在修改Launcher,所以打算把分析源码和修改源码的过程记录下来,最近会写一些关于Launcher的分析和修改博文。因为我是修改4.0.3的Launcher,所以后面文章里面的Launcher都是基于Android4.0.3的Launcher2修改。Launcher源码比较多,而且里面应用了很多设计模式,要把它分析清楚要花不少精力,网上也有一些零碎的分析文章,不过关于修改的文章不多。所以打算写一些分析和修改Launcher结合的文章。
原创博文,转载请标明出处:http://www.cnblogs.com/mythou/p/3153880.html
今天主要是分析修改Launcher的默认界面如何配置和修改。Launcher修改是最近才开始,下面两张图片是最近修改后的结果。因为程序是用于车载导航仪的,所以界面和一般的手机界面差别较大。改动也比较大,不过对于Launcher的分析修改都是通用的。
这是基于Android4.0.3修改后的Launcher界面,因为程序是用在汽车导航上,所以图标做了放大操作。删除了一些不需要的东西。
下面针对界面修改的地方做分析。
1、界面默认配置文件
机器刚升级的时候,Launcher的界面是默认读取一个xml配置文件,完成配置工作。这个配置文件在Launcher目录下,
路径是:\Launcher\res\xml\default_workspace.xml 。这个XML文件就是刚升级,Launcher第一次显示的时候,会读取的配置文件。
default_workspace。xml里面可以配置APP快捷方式、Widget、Search搜索栏等。下面就常用的这几个属性进行解析:
//Edited by mythou //http://www.cnblogs.com/mythou/
快捷方式说明 <favorite //程序快捷键属性标签launcher:className="com.apical.radio.radioMainActivity" //该应用的类,点击图标时,需要启动的类launcher:packageName="com.apical.radio" //该应用的包名launcher:screen="1" //第1屏,0-4屏共5屏launcher:x="0" //图标X位置,左上角第一个为0,向右递增,0-4共5个l0auncher:y="0" //图标Y位置,左上角第一个为0,向下递增,0-2共3个 />
Launcher默认是有5个分屏,不过这个可以配置。同样,每行每列有多少图标也是可以配置的,这个在后面会说在哪里可以修改。这里按我修改的是3行5列的界面排布(对应上面的效果图)。一般配置APP的快捷方式,使用上面的属性标签就可以。
//Edited by mythou //http://www.cnblogs.com/mythou/
//桌面Widget的标签
<appwidget //插件launcher:className="de.dnsproject.clock_widget_main.Clock1AppWidgetProvider" //该应用的类launcher:packageName="de.dnsproject.clock_widget_main" //该应用的包名launcher:screen="1" //第1屏,0-4屏共5屏launcher:x="2" //图标X位置,左上角第一个为0,向左递增,0-4共5个launcher:y="1" //图标Y位置,左上角第一个为0,向下递增,0-2共3个launcher:spanX="3" //在x方向上所占格数launcher:spanY="2" /> //在y方向上所占格数
桌面Widget跟桌面快捷方式属性类型,不过这里需要注意launcher:spanX和launcher:spanY 这两个属性是说明Widget多大的,这个和Widget的最小宽高配置有关。我们在编写桌面Widget的时候,需要在XML配置文件里面指定Widget最小的宽和高,一般最小宽高计算公式是(minWidth = 72*占用格数-2) 计算出来,最小高度也是一样。(上面那个模拟时钟是MIUI的时钟)
minWidth = 72*占用格数-2里面的占用格数就是上面launcher:spanX和launcher:spanY配置的数目。针对上面的效果图,就是占用了3个横向的格子,2个竖向的格子。minWidth应该等于214。
<search //搜索栏 launcher:screen="1" //第2屏 launcher:x="0" //图标X位置 launcher:y="1"/> //图标Y位置
这个是搜索栏的配置,因为我这里不需要用到搜索栏,所以把它去掉了,如果需要配置可以使用上面的属性标签。
至于文件夹,在4.0的Launcher里面是支持的,分析加载函数里面,可以找到解析文件夹标签的方法。
上面界面默认配置就是通过使用上面的标签修改default_workspace.xml配置的。
下面列出default_workspace支持的标签和属性:
//Edited by mythou //http://www.cnblogs.com/mythou/
//default_workspace.xml中,支持的标签有: favorite:应用程序快捷方式。 shortcut:链接,如网址,本地磁盘路径等。 search:搜索框。 clock:桌面上的钟表Widget//支持的属性有: launcher:title:图标下面的文字,目前只支持引用,不能直接书写字符串; launcher:icon:图标引用; launcher:uri:链接地址,链接网址用的,使用shortcut标签就可以定义一个超链接,打开某个网址。 launcher:packageName:应用程序的包名; launcher:className:应用程序的启动类名; launcher:screen:图标所在的屏幕编号; launcher:x:图标在横向排列上的序号; launcher:y:图标在纵向排列上的序号;
Launcher里面负责解析default_workspace.xml文件的方法是 LauncherProvider.java里面的loadFavorites方法。
2、LauncherProvider.java的loadFavorites分析:
//Edited by mythou //http://www.cnblogs.com/mythou/ //传入default_workspace文件的资源ID和数据库实力,把xml里面数据解析,保存到Launcher数据库。返回总共解析了多少个标签。 private int loadFavorites(SQLiteDatabase db, int workspaceResourceId) {//......... int type;while (((type = parser.next()) != XmlPullParser.END_TAG ||parser.getDepth() > depth) && type != XmlPullParser.END_DOCUMENT) {if (type != XmlPullParser.START_TAG) {continue;}boolean added = false;final String name = parser.getName();TypedArray a = mContext.obtainStyledAttributes(attrs, R.styleable.Favorite);long container = LauncherSettings.Favorites.CONTAINER_DESKTOP;if (a.hasValue(R.styleable.Favorite_container)) {container = Long.valueOf(a.getString(R.styleable.Favorite_container));}String screen = a.getString(R.styleable.Favorite_screen);String x = a.getString(R.styleable.Favorite_x);String y = a.getString(R.styleable.Favorite_y);// If we are adding to the hotseat, the screen is used as the position in the// hotseat. This screen can't be at position 0 because AllApps is in the// zeroth position.if (container == LauncherSettings.Favorites.CONTAINER_HOTSEAT&& Integer.valueOf(screen) == allAppsButtonRank) {throw new RuntimeException("Invalid screen position for hotseat item");}values.clear();values.put(LauncherSettings.Favorites.CONTAINER, container);values.put(LauncherSettings.Favorites.SCREEN, screen);values.put(LauncherSettings.Favorites.CELLX, x);values.put(LauncherSettings.Favorites.CELLY, y);//解析xml里面的标签,从这里可以找到支持的标签类型和相关属性参数。if (TAG_FAVORITE.equals(name)) {long id = addAppShortcut(db, values, a, packageManager, intent);added = id >= 0;} else if (TAG_SEARCH.equals(name)) {added = addSearchWidget(db, values);} else if (TAG_CLOCK.equals(name)) {added = addClockWidget(db, values);} else if (TAG_APPWIDGET.equals(name)) {added = addAppWidget(parser, attrs, type, db, values, a, packageManager);} else if (TAG_SHORTCUT.equals(name)) {long id = addUriShortcut(db, values, a);added = id >= 0;} else if (TAG_FOLDER.equals(name)) { //.........//folder属性里面的参数要多于2个,才能形成文件夹。if (folderItems.size() < 2 && folderId >= 0) {// We just delete the folder and any items that made it deleteId(db, folderId);if (folderItems.size() > 0) {deleteId(db, folderItems.get(0));}added = false;}}if (added) i++;a.recycle();}//......... return i;}
其实就是一个分析XML和写入数据库的过程,LauncherProvider.java是整个Launcher的数据来源,十分重要,后面我再具体分析数据加载和适配显示方面的逻辑。
另外还有一个问题补充一下,就是有关Android截图问题,因为我开发的机器不能使用USB调试,而且没有摇动之类的传感器,很多手机上截图方法都用不了,查了一下,可以使用screencap命令来截图,具体方法可以参考我另外一篇文章:http://www.cnblogs.com/mythou/p/3152627.html
至于图标加入默认背景或者强制转换APP快捷方式图标,修改图标大小和行列数,以及如何配置默认背景,明天再写另外文章说明。
如果有朋友发现哪里写错了,请留言指出,谢谢!
Android Launcher分析和修改1——Launcher默认界面配置(default_workspace)相关推荐
- Android之Launcher分析和修改1——Launcher默认界面配置(default_workspace)
www.cnblogs.com/mythou/p/3153880.html 最近工作都在修改Launcher,所以打算把分析源码和修改源码的过程记录下来,最近会写一些关于Launcher的分析和修改博 ...
- Android之Launcher分析和修改3——Launcher启动和初始化
前面两篇文章都是写有关Launcher配置文件的修改,代码方面涉及不多,今天开始进入Launcher代码分析. 我们开机启动Launcher,Launcher是由Activity Manager启动的 ...
- linux更改运行级别错误,Vmware中RedHat命令行和图形界面切换 Linux运行级别 默认界面配置 修改错误配置.ppt...
<Vmware中RedHat命令行和图形界面切换 Linux运行级别 默认界面配置 修改错误配置.ppt>由会员分享,可在线阅读,更多相关<Vmware中RedHat命令行和图形界面 ...
- Android之Launcher分析和修改5——HotSeat分析
今天主要是分析一下Launcher里面的快捷方式导航条--HotSeat,一般我们使用手机底下都会有这个导航条,但是如果4.0的Launcher放到平板电脑里面运行,默认是没有HotSeat的,刚好我 ...
- Android Launcher分析和修改5——HotSeat分析
今天主要是分析一下Launcher里面的快捷方式导航条--HotSeat,一般我们使用手机底下都会有这个导航条,但是如果4.0的Launcher放到平板电脑里面运行,默认是没有HotSeat的,刚好我 ...
- Android之Launcher分析和修改2——Icon修改、界面布局调整、壁纸设置
上一篇文章说了如何修改Android自带Launcher2的默认界面设置(http://www.cnblogs.com/mythou/p/3153880.html). 今天主要是说说Launcher里 ...
- android launcher分析和修改10,Android Launcher分析和修改10——HotSeat深入进阶
前面已经写过Hotseat分析的文章,主要是讲解如何在Launcher里面配置以及修改Hotseat的参数.今天主要是讲解一下如何在Hotseat里面的Item显示名称.这个小问题昨天折腾了半天,最后 ...
- Android之Launcher分析和修改4——初始化加载数据
上面一篇文章说了Launcher是如何被启动的,Launcher启动的过程主要是加载界面数据然后显示出来, 界面数据都是系统APP有关的数据,都是从Launcher的数据库读取,下面我们详细分析Lau ...
- android 壁纸改变回调,Android Launcher分析和修改13——实现Launcher编辑模式(1) 壁纸更换...
已经好久没更新Launcher系列文章,今天不解析源码,讲讲如安在Launcher里面添加桌面设置的功能.今朝很多第三方Launcher或者定制Rom都有简单易用的桌面设置功能.例如小米MIUI的La ...
最新文章
- 当年嵌入式系统为什么选了Linux,而没有选Windows?
- 27.	代码实例-spring声明式事务
- 从欧瑞博看一家典型的深圳硬件公司
- iis负载均衡与文件同步[网摘]
- jQuery原理第五天
- php字符串转二进制数组中,如何将php字符串转成二进制
- Flask Middle
- js 实现ReplaceAll 的方法
- Mac 系统如何修改python的IDLE默认模块导入路径。
- matlab gif生成器,Matlab制作视频并转换成gif动态图的两种方法
- ACDsee_14中文许可证秘钥
- 杨辉三角的几种 Python 实现方法
- WT588D语音芯片 语音模块组
- 如何使用cmd进入打印机选项_运行怎么添加打印机 - 卡饭网
- 再读德鲁克#3 从管理外包人员到全面质量管理
- 制作PE系统--20220202
- 读书笔记:《人类简史:从动物到上帝》
- fifa15服务器位置,FIFA15球队战术位置技巧
- JS实现限制可移动div的移动范围
- 尚雯婕变芭比娃娃 你被雷到了还是被电到?