欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android开发中Launcher3常见默认配置修改方法总结

程序员文章站 2023-11-04 12:32:04
本文实例讲述了android开发中launcher3常见默认配置修改方法。分享给大家供大家参考,具体如下: launcher概述 launcher是开机完成后第一个启动...

本文实例讲述了android开发中launcher3常见默认配置修改方法。分享给大家供大家参考,具体如下:

launcher概述

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

launcher3默认配置修改

1.如何设置默认页

res/values/config.xml

<integer name="config_workspacedefaultscreen">0</integer>

在launcher3 桌面,不管在哪一页,按home 键,会回到默认页。

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

① 在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);
  }
*/
}

② 在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);
*/

③ 在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框的大小?

修改如下:

定位打/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.让主菜单部分应用按指定顺序排在前面?

添加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<appinfo> apps) {
  int length = apparray.size();
  list<appinfo> assignapps = new arraylist<appinfo>();
  for(int i=0;i<length;i++) {
    assignapps.add(i, null);
  }
  for(appinfo app : apps){
    for(int k=0; k<length; 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

public void setapps(arraylist<appinfo> list) {
    if (!launcherappstate.isdisableallapps()) {
      ......
      sprdappsortaddonstub.getinstance().sortapps(mapps);
      launchermodel.sortapps(mapps);//在原来排序的基础上,再将arrays.xml中配置的应用按顺序排在前面。
      updatepagecountsandinvalidatedata();
    }
}
private void addappswithoutinvalidate(arraylist<appinfo> 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 列表如下:

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。

mminwidth = dpifrompx(minwidthpx, dm);
mminheight = dpifrompx(minheightpx, dm);

③ 创建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) { 

方法中:

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

deviceprofile closestprofile = findclosestdeviceprofile(minwidth, minheight, points);
......

⑤ 采用和当前屏幕大小最接近的deviceprofiles的default_workspace

defaultlayoutid = closestprofile.defaultlayoutid; 

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

在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的开机引导页面?

修改方案如下:

请定位到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设置一些壁纸后,壁纸显示比预览图模糊?

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

在设置壁纸的时候,默认是采用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自带的壁纸路径是什么?

在6.0中,平台版本预置了一些壁纸资源,相关路径如下:

资源文件在:

packages/apps/launcher3/wallpaperpicker/res/drawable-xhdpi/

字串文件在:

packages/apps/launcher3/wallpaperpicker/res/values-nodpi/wallpapers.xml

更多关于android相关内容感兴趣的读者可查看本站专题:《android开发入门与进阶教程》、《android调试技巧与常见问题解决方法汇总》、《android多媒体操作技巧汇总(音频,视频,录音等)》、《android基本组件用法总结》、《android视图view技巧总结》、《android布局layout技巧总结》及《android控件用法总结

希望本文所述对大家android程序设计有所帮助。