第一部分: 首先找到设置home screen上icon大小的位置。只可能有两个地方,一个是xml中指定,一个是在代码中指定。无论在哪里指定,都会在make icon的过程中引用,那么我先找到make icon的地方。在createShortcut@Launcher.java中,有如下一句 info.icon = Utilities.createIconThumbnail(info.icon, this); 可以看到icon就是从这里创建的。那么接着找createIconThumbnail这个具体创建icon的方法。 在 createIconThumbnail@Utilities.java中 final Resources resources = context.getResources(); sIconWidth = sIconHeight = (int) resources.getDimension(android.R.dimen.app_icon_size); 这应该就是从xml中读取icon高和宽的语句,找到这个xml修改。在launcher的xml文件夹中的dimens.xml中找不到app_icon_size这个字段。接着找整个android系统的xml文件夹,在dimens.xml中找到<dimen name="app_icon_size">48dip</dimen>,这个应该就是的了。修改之,重新编译之,ok。
==============
第二部分: 安装第一部分的操作,模拟器运行,发现问题,icon并没有变大。仔细看createIconThumbnail方法,发现读取到的app_icon_size仅仅做确定icon的最大的高和宽的作用,也就是说app_icon_size限定每个icon的最高和最宽的大小,并不是直接指定icon的高和宽。 同时,launcher中是划分为每个格子cell的大小的,这个大小也对icon的布局有影响。因为如果icon大小超过了cell的大小显然是不允许的。cell的大小在这里来修改 Android_src\packages\apps\Launcher\res\layout-land\workspace_screen.xml Android_src\packages\apps\Launcher\res\layout-port\workspace_screen.xml 一个是横屏布局,一个竖屏布局。launcher:cellWidth这个字段是宽,launcher:cellHeight是高。
==============
第三部分: 在laucher的源代码中,对laucher上的icon是这么判断的,如果实现app的icon大于icon_size的值,则对其进行缩小。如果app的icon小于icon_size的值,则按照icon的原大小画上去。所以我们如果要enlarge launcher上的icon size,就必须add code to enlarge the icon size。 Android_src\packages\apps\Launcher\src\com\android\launcher\Utilities.java createIconThumbnail function.
/*customed icon. * author: Welly Liu * date: 12.16.2010 */
final float ratio ;
if(iconWidth < iconHeight) {
ratio = (float)height/iconHeight;
width = (int)(ratio*iconWidth);
} else {
ratio = (float)width/iconWidth; height = (int)(ratio*iconHeight);
}
final int x = (sIconWidth - width) / 2;
final int y = (sIconHeight - height) / 2;
icon.setBounds(x, y, x + width, y + height);
=================
第四部分: 经过以上三个部分的操作,测试发现有两个问题。 1. 抽屉当中的app icon也变大了,这个不是我所希望的。 2. laucher screen中的上下文菜单中的folders菜单中的子菜单有问题,分别为All contacts,Bluetooth Received,Starred contacts,Contacts with phone numbers 这四个菜单点击后,会在screen上出现live folder的icon,这个icon没有变大。
=================
第五部分: 解决第一个问题,让抽屉当中的app icon不受影响。 找到app icon的由来。app 在抽屉中的显示,是一个gridview,由文件AllAppsGridView.java实现,每一个item由ApplicationsAdapter.java中定制的atapter来提高item,当然包括view。找到ApplicationsAdapter钟对getView的定义,发现了 info.icon = Utilities.createGridIconThumbnail(info.icon, getContext()); 那么把这个地方的icon不受以前的改变就可以了。
================
第六部分 解决第二个问题,如何让这些folder的icon也变大? 经过研究laucher的代码发现launcher中其他菜单产生的app icon都是laucher中经过自己的代码createIconThumbnail 这个方法产生的,所以在这里可以改变icon。但是live folder产生的icon不是从这里产生的,而是从原生的app 应用程序当中得到。 那么就有了一个投机取巧的方法,将原生的app应用程序中的icon大小改为我们理想的大小就ok了。分别是contact 应用程序,它对应三个icon,还有Bluetooth 应用程序,对应一个
修改页面Tag的东西。
在Launcher.xml内添加LinearLayout.第一次Launcher内setupViews的时候用AddView将给定的资源添加进去。以后在workspace内在切屏函数computeScroll内调用Launcher内的替换函数 public void refreshTopTag(int currentScreen,int screenCount){
for(int i = 0; i<screenCount; i++){
resetTopTagLayout(i,currentScreen,screenCount);
}
}
public void resetTopTagLayout(int pageindex,int currentScreen,int screenCount){
if(pageindex != currentScreen){
Drawable dotCurrentScreen = getResources().getDrawable(dotId);
ImageView mTemp = (ImageView) mTopTagLayout.getChildAt(pageindex);
mTemp.setImageDrawable(dotCurrentScreen);
}
else{
Drawable dotCurrentScreen = getResources().getDrawable(screenDots[currentScreen]);
ImageView mTemp = (ImageView) mTopTagLayout.getChildAt(currentScreen);
mTemp.setImageDrawable(dotCurrentScreen);
}
mTopTagLayout.invalidate();
Android 总结 2: 动态添加screen底端菜单内快捷键,要求与screen内的applications 不冲突,也就是说,桌面上有的底端菜单内不能有,反之亦然。 做法,更改loadFavorites,解析default_workspace.xml,获取标签为container的内容,也就是包名,与显示位置(负数)。使用Java.util.map的HashMap保存结果,每个包名对应一个坐标位置,更改loadFavorites的返回值类型HashMap,使用load调用,并与screen内的application比较。分开显示