Android Launcher3一些默认修改

本文介绍如何自定义Launcher3,包括设置默认主页、隐藏搜索框、调整搜索框尺寸、指定应用排序、确定待机主页布局、替换应用图标及去除开机引导等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.如何设置默认页

1
2
3
4
5
res/values/Config.xml
 
 <integer name="config_workspaceDefaultScreen">0</integer>
 
在Launcher3 桌面,不管在哪一页,按HOME 键,会回到默认页。

2.如何隐藏launcher3中的搜索框

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
1. 在Launcher3/src/com/android/launcher3/Launcher.java中
 
注释updateGlobalIcons()方法调用,共两处。
 
public View getQsbBar() {
    if (mQsbBar == null) {
        mQsbBar = mInflater.inflate(R.layout.search_bar, mSearchDropTargetBar, false);
-             mSearchDropTargetBar.addView(mQsbBar);
    }
+        mQsbBar.setVisibility(View.GONE);
    return mQsbBar;
}
 
@Override
public void bindSearchablesChanged() { //注释该方法内容
/*        boolean searchVisible = updateGlobalSearchIcon();
    boolean voiceVisible = updateVoiceSearchIcon(searchVisible);
    if (mSearchDropTargetBar != null) {
        mSearchDropTargetBar.onSearchPackagesChanged(searchVisible, voiceVisible);
    }
*/
}
 
2. 在Launcher3/src/com/android/launcher3/DynamicGrid.java中  
 
    // Layout the search bar
    //注释如下内容
/*        View qsbBar = launcher.getQsbBar();
    LayoutParams vglp = qsbBar.getLayoutParams();
    vglp.width = LayoutParams.MATCH_PARENT;
    vglp.height = LayoutParams.MATCH_PARENT;
    qsbBar.setLayoutParams(vglp);
*/
 
3. 在Launcher3/res/values/dimens.xml中
 
    -    <dimen name="dynamic_grid_search_bar_height">48dp</dimen>
    +    <dimen name="dynamic_grid_search_bar_height">18dp</dimen>
 
重新编译后即可看到效果。

3.如何调整原生Launcher3主界面的search框的大小?

1
2
3
4
5
6
修改如下:
定位打/packages/apps/Launcher3/res/values/dimens.xml。
 
<dimen name="dynamic_grid_edge_margin">3dp</dimen>//修改这个可以调整search框距离顶部距离。
<dimen name="dynamic_grid_search_bar_max_width">500dp</dimen>//search框的宽度,一般不需要调整。
<dimen name="dynamic_grid_search_bar_height">48dp</dimen>//search框的高度,不要调整为0,删除按钮需要占用一部分空间。

4.让主菜单部分应用按指定顺序排在前面?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
添加res/values/arrays.xml:需要排序的应用:这里的item 内容一定要填写正确,否则会匹配不上,无法参与排序。
<!--?xml version="1.0" encoding="utf-8"?-->
<resources>
<string-array name="apps_componentName" translatable="false">
    <item>ComponentInfo{com.android.vending/com.android.vending.AssetBrowserActivity}</item>
    <item>ComponentInfo{com.android.browser/com.android.browser.BrowserActivity}</item>
    <item>ComponentInfo{com.android.settings/com.android.settings.Settings}</item>
    <item>ComponentInfo{com.android.camera2/com.android.camera.CameraLauncher}</item>
    <item>ComponentInfo{com.android.mms/com.android.mms.ui.ConversationList}</item>
</string-array>
</resources>
 
src/com/android/launcher3/Utilities.java
import java.util.Arrays;
import java.util.List;
 
+    public static List<string> getAppsComponentName(final Context context) {
+        return Arrays.asList(context.getResources().getStringArray(R.array.apps_componentName));
+    }
 
 
src/com/android/launcher3/LauncherModel.java
 protected int mPreviousConfigMcc;
+    static List<string> appArray = new ArrayList<string>();
    LauncherModel(LauncherAppState app, IconCache iconCache, AppFilter appFilter) {
        ......
        mUserManager = UserManagerCompat.getInstance(context);
+       appArray = Utilities.getAppsComponentName(context);
 
    }
添加如下sortApps 方法:apps 按arrays.xml 排序,在原来的排序基础上,将arrays.xml 配置的应用按顺序排在前面。
arrays.xml中没有涉及到的应用,还是原来的顺序。
public static final void sortApps(ArrayList apps) {
    int length = appArray.size();
    List assignApps = new ArrayList();
    for(int i=0;i<length;i++) :="" app="" appinfo="" for="" i="" if="" int="" k="0;"> -1 ;i--) {
      AppInfo app = assignApps.get(i);
      if(app != null){
          apps.remove(app);
          apps.add(0, app);
      }
  }
  Log.d(TAG ,"The Apps List after Sort!");
}
 
 
src/com/android/launcher3/AppsCustomizePagedView.java
 
    public void setApps(ArrayList list) {
        if (!LauncherAppState.isDisableAllApps()) {
            ......
            SprdAppSortAddonStub.getInstance().sortApps(mApps);
+           LauncherModel.sortApps(mApps);//在原来排序的基础上,再将arrays.xml中配置的应用按顺序排在前面。
            updatePageCountsAndInvalidateData();
        }
    }
    private void addAppsWithoutInvalidate(ArrayList list) {
        ......
        // SPRD: bug375932 2014-12-02 Feature customize app icon sort.
        SprdAppSortAddonStub.getInstance().sortApps(mApps);
+       LauncherModel.sortApps(mApps);//在原来排序的基础上,再将arrays.xml中配置的应用按顺序排在前面。
    }

5.如何确定待机HOME界面布局使用的是哪个default_workspace文件?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
src/com/android/launcher3/DynamicGrid.java
 
选择哪个default_workspace 和public DynamicGrid(Context context, Resources resources,int minWidthPx,
int minHeightPx, int widthPx, int heightPx, int awPx, int ahPx)中的minWidthPx 和minHeightPx
以及该方法中创建的deviceProfiles 列表关。              
 
minWidthPx 、minHeightPx 值转换为dpi之后 ,deviceProfiles 列表与其进行比较,选择与当前屏幕大小最接近的deviceProfiles 的
default_workSpace作为最终Home界面使用的default_workspace。
 
 
详细解释如下:
 
src/com/android/launcher3/DynamicGrid.java中
 
        1.deviceProfiles 列表如下:
        deviceProfiles.add(new DeviceProfile("Super Short Stubby",
                255, 3002, 348, 13, (hasAA ? 3 : 5), 48, R.xml.default_workspace_4x4));
        deviceProfiles.add(new DeviceProfile("Shorter Stubby",
                255, 4003, 348, 13, (hasAA ? 3 : 5), 48, R.xml.default_workspace_4x4));
        deviceProfiles.add(new DeviceProfile("Short Stubby",
                275, 4203, 448, 13, (hasAA ? 5 : 5), 48, R.xml.default_workspace_4x4));
        deviceProfiles.add(new DeviceProfile("Stubby",
                255, 4503, 448, 13, (hasAA ? 5 : 5), 48, R.xml.default_workspace_4x4));
        deviceProfiles.add(new DeviceProfile("Nexus S",
                296, 491.33f,  4, 448, 13, (hasAA ? 5 : 5), 48, R.xml.default_workspace_4x4));
        deviceProfiles.add(new DeviceProfile("Nexus 4",
      335, 5674, 4,  DEFAULT_ICON_SIZE_DP, 13, (hasAA ? 5 : 5), 56, R.xml.default_workspace_4x4));
        deviceProfiles.add(new DeviceProfile("Nexus 5",
      359, 5674, 4,  DEFAULT_ICON_SIZE_DP, 13, (hasAA ? 5 : 5), 56, R.xml.default_workspace_4x4));
        deviceProfiles.add(new DeviceProfile("Large Phone",
                406, 6945, 564, 14.4f,  5, 56, R.xml.default_workspace_5x5));
        // The tablet profile is odd in that the landscape orientation
        // also includes the nav bar on the side
        deviceProfiles.add(new DeviceProfile("Nexus 7",
                575, 9045, 672, 14.4f,  7, 60, R.xml.default_workspace_5x6));
        // Larger tablet profiles always have system bars on the top & bottom
        deviceProfiles.add(new DeviceProfile("Nexus 10",
                727, 12075, 676, 14.4f,  7, 64, R.xml.default_workspace_5x6));
        deviceProfiles.add(new DeviceProfile("20-inch Tablet",
                1527, 25277, 7100, 207, 72, R.xml.default_workspace_4x4));
 
       2.重新计算MinWidth 和MinHeigh  单位是dpi。
        mMinWidth = dpiFromPx(minWidthPx, dm);
        mMinHeight = dpiFromPx(minHeightPx, dm);
      3.创建mProfile,mProfile.defaultLayoutId 就是最终Home界面使用的default_workspace 的id。
        mProfile中的defaultLayoutId 是哪个default_workspace 见DeviceProfile.java。
 
        mProfile = new DeviceProfile(context, deviceProfiles,
                mMinWidth, mMinHeight,
                widthPx, heightPx,
                awPx, ahPx,
                resources);
 
 
 
src/com/android/launcher3/DeviceProfile.java
 
    DeviceProfile(Context context,
                 ArrayList<deviceprofile> profiles,
                  float minWidth, float minHeight,
                  int wPx, int hPx,
                  int awPx, int ahPx,
                  Resources res) { 方法中:
       4.用屏幕宽高创建的点(PointF xy = new PointF(width, height))与 deviceProfiles中的w 和 h 创建的点
(dimens =
new PointF(widthDps, heightDps))进行比较,也就是从deviceProfiles 列表中找出和当前屏幕大小最接近的deviceProfiles。
            DeviceProfile closestProfile = findClosestDeviceProfile(minWidth, minHeight, points);
         ......
 
       5.采用和当前屏幕大小最接近的deviceProfiles的default_workspace
 
               defaultLayoutId = closestProfile.defaultLayoutId;

6.如何替换第三方应用在launcher上显示的图标?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
在launcher/src/com/android/launcher3/IconCache.java中修改,
private CacheEntry cacheLocked(ComponentName componentName, ResolveInfo info,    private CacheEntry cacheLocked(ComponentName componentName, ResolveInfo info,
        HashMap<object, charsequence=""> labelCache) {
    CacheEntry entry = mCache.get(componentName);
    if (entry == null) {
        entry = new CacheEntry();
        mCache.put(componentName, entry);
        ComponentName key = LauncherModel.getComponentNameFromResolveInfo(info);
        if (labelCache != null && labelCache.containsKey(key)) {
            entry.title = labelCache.get(key).toString();
        } else {
            entry.title = info.loadLabel(mPackageManager).toString();
            if (labelCache != null) {
                labelCache.put(key, entry.title);
            }
        }
        if (entry.title == null) {
            entry.title = info.activityInfo.name;
        }
        Drawable icon;
        int index = sysIndexOf(componentName.getClassName());
        Log.i("jxt", "index:"+index+",Name:"+componentName.getClassName());
        icon = getFullResIcon(info);
        if (index >= 0) {
            entry.icon = Utilities.createIconBitmap(icon, mContext);
        } else {
            entry.icon = Utilities.createIconBitmap(
                    /* SPRD: Feature 253522, Remove the application drawer view @{ */
                    // getFullResIcon(info), mContext);
                    icon, mContext, true);
        }
        /* 此处即为替换图标代码  {@*/
        if("第三方应用的componentName".equals(componentName.toString())){
            entry.icon = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.xxx);
        }
 
        /* @} */
 
    }
    return entry;
}  

7.如何去掉Launcher3的开机引导页面?

1
2
3
4
5
6
7
8
修改方案如下:
请定位到src/com/android/launcher3/LauncherClings.java文件:
    class LauncherClings implements OnClickListener {
         ......
         private static final String TAG_CROP_TOP_AND_SIDES = "crop_bg_top_and_sides
 
-        private static final boolean DISABLE_CLINGS = false;
+       private static final boolean DISABLE_CLINGS = true;

8.为何Launcher3设置一些壁纸后,壁纸显示比预览图模糊?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
预览的时候,没有做格式转化,所以显示正常!
在设置壁纸的时候,默认是采用jpeg格式转换的,导致转换后损耗了一些,设置壁纸后,某些对比度比较高的壁纸就显示的模糊!
 
修改方案:
默认修改为采用png格式转换!
 
android6.0之前的版本,请做如下修改:
定位到/packages/apps/Launcher3/的WallpaperCropActivity.java文件
1、String mOutputFormat = "jpg";//修改为"png"
2
  protected static String getFileExtension(String requestFormat) {
        String outputFormat = (requestFormat == null)
                ? "jpg"//修改为"png"
                : requestFormat;
        outputFormat = outputFormat.toLowerCase();
        return (outputFormat.equals("png") || outputFormat.equals("gif"))
                ? "png" // We don't support gif compression.
                : "jpg";
   }
 
android6.0的版本,请做如下修改:
定位到/packages/apps/Launcher3/WallpaperPicker/src/com/android/gallery3d/common/BitmapCropTask.java文件
if (crop.compress(CompressFormat.JPEG, DEFAULT_COMPRESS_QUALITY, tmpOut)) 修改为:
if (crop.compress(CompressFormat.PNG, DEFAULT_COMPRESS_QUALITY, tmpOut))

9.6.0平台上Launcher3自带的壁纸路径是什么?

1
2
3
4
5
6
6.0中,平台版本预置了一些壁纸资源,相关路径如下:
资源文件在:
packages/apps/Launcher3/WallpaperPicker/res/drawable-xhdpi/
 
字串文件在:
packages/apps/Launcher3/WallpaperPicker/res/values-nodpi/wallpapers.xml
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值