Android launcher icon size

本文详细阐述了如何调整Launcher应用图标尺寸并解决遇到的问题,包括修改icon大小、适应不同屏幕布局、避免影响抽屉应用图标及调整livefolder图标大小。通过修改XML配置和自定义代码实现图标尺寸的动态调整。

第一部分: 首先找到设置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比较。分开显示

### Android Launcher 实现桌面整理功能与自定义布局 在 Android 系统中,Launcher 是用户与设备交互的主要界面之一。为了实现桌面整理功能和自定义布局,开发者可以通过修改或扩展 Android Launcher 的源代码来满足特定需求。 #### 1. 自定义启动流程 在 Android 中,Launcher 的启动流程是通过 `AndroidManifest.xml` 文件中的配置完成的。需要确保在 `Activity` 标签中设置正确的属性以使其成为默认启动器[^1]: ```xml <activity android:name=".CustomLauncherActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> ``` 上述代码片段将指定的 `Activity` 设置为系统的默认启动器。 #### 2. 自定义桌面布局 为了实现更灵活的桌面布局,可以使用自定义的 `View` 或 `RecyclerView` 来替代默认的桌面布局。例如,通过创建一个包含应用图标和小部件的网格视图,可以实现类似以下的功能: ```java public class CustomDesktopLayout extends RecyclerView.Adapter<CustomDesktopLayout.ViewHolder> { private List<AppInfo> appList; public static class ViewHolder extends RecyclerView.ViewHolder { ImageView appIcon; TextView appName; public ViewHolder(View v) { super(v); appIcon = v.findViewById(R.id.app_icon); appName = v.findViewById(R.id.app_name); } } public CustomDesktopLayout(List<AppInfo> apps) { this.appList = apps; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.custom_app_item, parent, false); return new ViewHolder(v); } @Override public void onBindViewHolder(ViewHolder holder, int position) { AppInfo app = appList.get(position); holder.appIcon.setImageDrawable(app.getIcon()); holder.appName.setText(app.getName()); } @Override public int getItemCount() { return appList.size(); } } ``` #### 3. 层桌面样式 如果需要实现层桌面样式,可以参考引用中的方法[^2]。具体来说,可以通过以下方式实现: - 创建个 `Fragment` 或 `ViewGroup`,分别用于显示不同的层级。 - 使用手势检测(如滑动、缩放)来切换或调整不同层级之间的可见性。 - 在 `onTouchEvent` 方法中处理触摸事件,以实现动态交互。 #### 4. Folder 文件夹功能 为了支持文件夹功能,可以参考 Android 10.0 的 Launcher3 源码实现[^3]。以下是关键步骤: - 创建一个 `FolderView` 类,继承自 `FrameLayout`,用于容纳个应用图标。 - 在拖拽事件中检测目标位置是否位于文件夹区域内,并动态添加到文件夹中。 - 如果需要跨行显示文件夹内容,可以通过自定义 `LayoutManager` 实现。 #### 示例代码:文件夹功能的核心逻辑 ```java public class FolderView extends FrameLayout { private LinearLayout folderContent; public FolderView(Context context) { super(context); init(); } private void init() { inflate(getContext(), R.layout.folder_view, this); folderContent = findViewById(R.id.folder_content); } public void addItem(View item) { folderContent.addView(item); } } ``` ### 总结 通过自定义启动流程、桌面布局以及实现层桌面和文件夹功能,可以显著提升 Android Launcher 的用户体验。开发者可以根据实际需求选择合适的方案,并结合引用中的技术细节进行实现[^1][^2][^3]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值