Android之Launcher分析和修改1——Launcher默认界面配置(default_workspace)

www.cnblogs.com/mythou/p/3153880.html

最近工作都在修改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 itdeleteId(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快捷方式图标,修改图标大小和行列数,以及如何配置默认背景,明天再写另外文章说明。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293679.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 .NET Core 中如何让 Entity Framework Core 在日志中记录由 LINQ 生成的SQL语句

在开发中&#xff0c;我们想在调试中查看EF Core执行的sql语句&#xff0c;可以使用SQL Studio Manager Tools工具&#xff0c;另一种方式是使用EF Core提供的日志。在ASP.NET Core使用Entity Framework Core的日志.早在Entity Framework Core1.0 ,使用相关的ILoggerProvider I…

如果你喜欢上了一个程序员小伙 献给所有程序员女友(来自ITeye博客的文章 作者:talent2012)...

程序员向来是善于幽默自嘲的群体&#xff0c;但从某种程度上影响了咱程序员在广大女同胞心中的印象啊&#xff5e;&#xff5e; 于是写下此篇&#xff08;有从别处看到的3句加进来的&#xff09;&#xff0c; 就算是为咱程序员做个广告&#xff5e;&#xff5e;要是觉得有点过的…

豆瓣9.6分!这部BBC的纪录片太让人震撼!

全世界只有3.14 % 的人关注了爆炸吧知识英国广播公司BBC的纪录片素来就是高质量的代名词&#xff0c;推出的《地球无限》(Planet Earth)、《地球的力量》(Earth The Power of the Planet)、《冷血生命》(Life In Cold Blood)等片不仅在英国播放时获得极高收视&#xff0c;还获得…

vim-snipmate编写snippet的语法

vim-snipmate真的很好用&#xff0c;以前好多编写代码的问题得到完美的解决。还附带提升我对vim的理解和信心&#xff0c;在这里感谢一下作者。thank you。 1、现说一下我浓缩的重要语法。 1、定义是下面这样&#xff0c;注意中间必须是一个制表符<TAB>不能用空格代替。 …

Android之Launcher分析和修改2——Icon修改、界面布局调整、壁纸设置

上一篇文章说了如何修改Android自带Launcher2的默认界面设置&#xff08;http://www.cnblogs.com/mythou/p/3153880.html&#xff09;。 今天主要是说说Launcher里面图标、布局、壁纸等的设置问题。毕竟我们一般修改Launcher&#xff0c;这些都是需要修改的地方&#xff0c;也是…

捷径 - The certain shortcut

赛斯高汀(Seth Godin)的博客&#xff1a;http://sethgodin.typepad.com/seths_blog/2013/05/the-certain-shortcut.html The shortcut thats sure to work, every time: 所谓的捷径向来如此&#xff1a; Take the long way. 脚踏实地&#xff0c;一步一个脚印(遍历) Do t…

高效率三大法则总结

原则一&#xff1a;专注 之前经常听到很多人所谓的牛人&#xff0c;说什么边干活的时候可以开着msn、qq&#xff0c;工作和娱乐两不误&#xff0c;边听下属汇报的同时边写下午会议的发言稿&#xff0c;然而科学事实证明人类的大脑硬件结构决定了根本不可能一脑两用&#xff0c;…

N 年沉淀,腾讯这套系统终于开源!

大家好&#xff0c;我是鱼皮&#xff0c;前段时间给大家介绍了字节跳动开源的两套设计系统&#xff0c;分别是 Arco Design 和抖音 Semi Design。而就在几天前&#xff0c;腾讯终于也开源了自家的设计系统 TDesgin &#xff01;这次&#xff0c;终于能介绍自己公司的项目了。如…

在php中使用sockets:从新闻组中获取文章

PHP能打开远程或本地主机上的Socket端口。本文是一个使用Socket的小例子&#xff1a;连 接到一个Usenet新闻组服务器&#xff0c;同服务器对话&#xff0c;从新闻组中下载一些文章。在php中打开一个socket 使用fsockopen()打开一个socket.这个函数在php3和php4种都可以使用。函…

Android之Launcher分析和修改3——Launcher启动和初始化

前面两篇文章都是写有关Launcher配置文件的修改&#xff0c;代码方面涉及不多&#xff0c;今天开始进入Launcher代码分析。 我们开机启动Launcher&#xff0c;Launcher是由Activity Manager启动的&#xff0c;而Activity Manager是由system server启动。 原创博文&#xff0c…

史上最强物理科普!

全世界只有3.14 % 的人关注了爆炸吧知识一沙见世界 一花窥天堂手心握无限 须臾纳永恒杨振宁曾说读上面的四句诗可以感受到物理的美但物理的美不止于此物理还有一种庄严美一种神秘美一种初窥宇宙奥秘的畏惧美物理就是如此的迷人任何语言在它的面前都很贫瘠数学让人摆脱了愚昧而…

mysql 怎么实现随机查询并分页,不重复查询

2019独角兽企业重金招聘Python工程师标准>>> 需求&#xff1a; 企业应用中&#xff0c;一般数据量不是很特别多&#xff0c;同时大多在局域网内&#xff0c;性能不会有问题&#xff0c;一般不会分页处理&#xff0c;随机排序数据一般不会有问题 web网站中&#xf…

评分卡模型剖析之一(woe、IV、ROC、信息熵)

信用评分卡模型在国外是一种成熟的预测方法&#xff0c;尤其在信用风险评估以及金融风险控制领域更是得到了比较广泛的使用&#xff0c;其原理是将模型变量WOE编码方式离散化之后运用logistic回归模型进行的一种二分类变量的广义线性模型。 本文重点介绍模型变量WOE以及IV原理&…

主机远程唤醒配置

配置&#xff1a;win10戴尔主机F2进biosbios设置2.系统设置3.以太网设置4.电源管理设置以上设置完成后关机&#xff0c;就可以在远程电脑上打开WakeMeOnLan&#xff0c;然后添加或者搜索需要唤醒的电脑的ip&#xff0c;mac和主机名称&#xff0c;然后就可以唤醒远程主机了查看m…

Java字节序,java整型数与网络字节序 byte[] 数组转换关系

Java字节序 http://origin100.iteye.com/blog/267165 /*** 通信格式转换** Java和一些windows编程语言如c、c、delphi所写的网络程序进行通讯时&#xff0c;需要进行相应的转换* 高、低字节之间的转换* windows的字节序为低字节开头* linux,unix的字节序为高字节开头* java则无…

python dict.fromkeys()研究

def unique(seq): #return [x for x in my_list if x not in locals()[_[1]]] return {}.fromkeys(seq).keys() dict.fromkeys(seq,valNone) #创建并返回一个新字典&#xff0c;以序列seq中元素做字典的键&#xff0c;val为字典所有键对应的初始值(默认为None) 例子&#xff…

unix高级编程apue.h问题

2019独角兽企业重金招聘Python工程师标准>>> apue.h头文件为作者自己编写而非系统自带&#xff0c;故需要自行添加&#xff01;第一&#xff1a;打开网站 http://www.apuebook.com/第二&#xff1a;选择合适的版本&#xff08;一共有三个版本&#xff0c;根据书的版…

Vim文本编辑器 常用指令大全 提升编程效率必备法宝之一

经常处理文本以及经常需要写代码的人&#xff0c;都会有自己比较常用的编辑器&#xff0c;本人喜欢用Vim&#xff0c;理由就是Vim编辑器灵活&#xff0c;并且可以达到纯键盘操作&#xff0c;使用纯熟情况下&#xff0c;根本不需要鼠标操作&#xff0c;听起来是不是很酷的&#…

IT与业务之间的鸿沟根源

目前世界经济进入到数字经济时期&#xff0c;IT与业务的融合已经不是什么新鲜的话题&#xff0c;其实从计算机的诞生的那一天开始&#xff0c;IT与业务融合的问题就已经开始了。1、经常听到一种观点&#xff1a;IT与业务之间的鸿沟这归结于谁领导谁的问题。&#xff08;1&#…