IT-Drlun 2017-11-16 02:26 采纳率: 0%
浏览 1525
已结题

MTK平台安卓6.0修改Launcher3ui

希望各位大神可以指导下,怎么更改Launcher3UI布局,万分感谢!

  • 写回答

1条回答 默认 最新

  • 段黄军 2018-08-14 13:15
    关注

    Launcher概述

    Launcher是开机完成后第一个启动的应用,用来展示应用列表和快捷方式、小部件等。Launcher作为第一个(开机后第一个启动的应用)展示给用户的应用程序,其设计的好坏影响到用户的体验,甚至影响用户购机的判断。所以很多品牌厂商都会不遗余力的对Launcher进行深度定制,如小米的MIUI、华为的EMUI等。Android默认的Launcher没有过多的定制,更加简洁,受到源生党的追捧,Google的Nexus系列手机基本都是用的源生Launcher,目前Android源生的Launcher版本是Launcher3,后面的相关内容也都是以Launcher3为基础。

    Launcher3默认配置修改

    1.如何设置默认页

    res/values/Config.xml

    ?
    1
    0
    在Launcher3 桌面,不管在哪一页,按HOME 键,会回到默认页。

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

    ① 在Launcher3/src/com/android/launcher3/Launcher.java中

    注释updateGlobalIcons()方法调用,共两处。

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    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); } */ } ② 在Launcher3/src/com/android/launcher3/DynamicGrid.java中

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    // 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);
    */
    ③ 在Launcher3/res/values/dimens.xml中
    - 48dp
    + 18dp

    重新编译后即可看到效果。

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

    修改如下:

    定位打/packages/apps/Launcher3/res/values/dimens.xml。

    3dp//修改这个可以调整search框距离顶部距离。
    500dp//search框的宽度,一般不需要调整。
    48dp//search框的高度,不要调整为0,删除按钮需要占用一部分空间。

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

    添加res/values/arrays.xml:需要排序的应用:这里的item 内容一定要填写正确,否则会匹配不上,无法参与排序。

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?xml version="1.0" encoding="utf-8"?>


    ComponentInfo{com.android.vending/com.android.vending.AssetBrowserActivity}
    ComponentInfo{com.android.browser/com.android.browser.BrowserActivity}
    ComponentInfo{com.android.settings/com.android.settings.Settings}
    ComponentInfo{com.android.camera2/com.android.camera.CameraLauncher}
    ComponentInfo{com.android.mms/com.android.mms.ui.ConversationList}


    src/com/android/launcher3/Utilities.java

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import java.util.Arrays;
    import java.util.List;
    public static List 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 appArray = new ArrayList();
    LauncherModel(LauncherAppState app, IconCache iconCache, AppFilter appFilter) {
    ......
    mUserManager = UserManagerCompat.getInstance(context);
    appArray = Utilities.getAppsComponentName(context);
    }
    添加如下sortApps 方法:apps 按arrays.xml 排序,在原来的排序基础上,将arrays.xml 配置的应用按顺序排在前面。arrays.xml中没有涉及到的应用,还是原来的顺序。

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    public static final void sortApps(ArrayList apps) {
    int length = appArray.size();
    List assignApps = new ArrayList();
    for(int i=0;i assignApps.add(i, null);
    }
    for(AppInfo app : apps){
    for(int k=0; k if (app.componentName.toString().equals(appArray.get(k))) {
    assignApps.set(k,app );
    continue;
    }
    }
    }
    for (int i =length -1;i > -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

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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文件?

    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中

    ① deviceProfiles 列表如下:

    ?
    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
    deviceProfiles.add(new DeviceProfile("Super Short Stubby",
    255, 300, 2, 3, 48, 13, (hasAA ? 3 : 5), 48, R.xml.default_workspace_4x4));
    deviceProfiles.add(new DeviceProfile("Shorter Stubby",
    255, 400, 3, 3, 48, 13, (hasAA ? 3 : 5), 48, R.xml.default_workspace_4x4));
    deviceProfiles.add(new DeviceProfile("Short Stubby",
    275, 420, 3, 4, 48, 13, (hasAA ? 5 : 5), 48, R.xml.default_workspace_4x4));
    deviceProfiles.add(new DeviceProfile("Stubby",
    255, 450, 3, 4, 48, 13, (hasAA ? 5 : 5), 48, R.xml.default_workspace_4x4));
    deviceProfiles.add(new DeviceProfile("Nexus S",
    296, 491.33f, 4, 4, 48, 13, (hasAA ? 5 : 5), 48, R.xml.default_workspace_4x4));
    deviceProfiles.add(new DeviceProfile("Nexus 4",
    335, 567, 4, 4, DEFAULT_ICON_SIZE_DP, 13, (hasAA ? 5 : 5), 56, R.xml.default_workspace_4x4));
    deviceProfiles.add(new DeviceProfile("Nexus 5",
    359, 567, 4, 4, DEFAULT_ICON_SIZE_DP, 13, (hasAA ? 5 : 5), 56, R.xml.default_workspace_4x4));
    deviceProfiles.add(new DeviceProfile("Large Phone",
    406, 694, 5, 5, 64, 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, 904, 5, 6, 72, 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, 1207, 5, 6, 76, 14.4f, 7, 64, R.xml.default_workspace_5x6));
    deviceProfiles.add(new DeviceProfile("20-inch Tablet",
    1527, 2527, 7, 7, 100, 20, 7, 72, R.xml.default_workspace_4x4));
    ② 重新计算MinWidth 和MinHeigh 单位是dpi。

    ?
    1
    2
    mMinWidth = dpiFromPx(minWidthPx, dm);
    mMinHeight = dpiFromPx(minHeightPx, dm);
    ③ 创建mProfile,mProfile.defaultLayoutId 就是最终Home界面使用的default_workspace 的id。

    mProfile中的defaultLayoutId 是哪个default_workspace 见DeviceProfile.java。

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    mProfile = new DeviceProfile(context, deviceProfiles,
    mMinWidth, mMinHeight,
    widthPx, heightPx,
    awPx, ahPx,
    resources);
    src/com/android/launcher3/DeviceProfile.java
    DeviceProfile(Context context,
    ArrayList profiles,
    float minWidth, float minHeight,
    int wPx, int hPx,
    int awPx, int ahPx,
    Resources res) {
    方法中:

    ④ 用屏幕宽高创建的点(PointF xy = new PointF(width, height))与 deviceProfiles中的w 和 h 创建的点(dimens = new PointF(widthDps, heightDps))进行比较,也就是从deviceProfiles 列表中找出和当前屏幕大小最接近的deviceProfiles。

    ?
    1
    2
    DeviceProfile closestProfile = findClosestDeviceProfile(minWidth, minHeight, points);
    ......
    ⑤ 采用和当前屏幕大小最接近的deviceProfiles的default_workspace

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

    在launcher/src/com/android/launcher3/IconCache.java中修改,

    ?
    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
    private CacheEntry cacheLocked(ComponentName componentName, ResolveInfo info, private CacheEntry cacheLocked(ComponentName componentName, ResolveInfo info,
    HashMap 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的开机引导页面?

    修改方案如下:

    请定位到src/com/android/launcher3/LauncherClings.java文件:

    ?
    1
    2
    3
    4
    5
    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设置一些壁纸后,壁纸显示比预览图模糊?

    预览的时候,没有做格式转化,所以显示正常!

    在设置壁纸的时候,默认是采用jpeg格式转换的,导致转换后损耗了一些,设置壁纸后,某些对比度比较高的壁纸就显示的模糊!

    修改方案:

    默认修改为采用png格式转换!

    android6.0之前的版本,请做如下修改:

    定位到/packages/apps/Launcher3/的WallpaperCropActivity.java文件

    1、String mOutputFormat = "jpg";//修改为"png"

    2、

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    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的版本,请做如下修改:

    评论

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料