上一篇文章说了如何修改Android自带Launcher2的默认界面设置(http://www.cnblogs.com/mythou/p/3153880.html)。

今天主要是说说Launcher里面图标、布局、壁纸等的设置问题。毕竟我们一般修改Launcher,这些都是需要修改的地方,也是比较容易修改的部分。按照效果图(效果图在上一篇文章),分开说明如何修改,以及里面涉及的逻辑分析。

原创博文,转载请标明出处:http://www.cnblogs.com/mythou/p/3155692.html

1、图标大小和标题大小

Android原生图标大小都是通过配置文件设置,配置文件路径是/res/values/dimens.xml 。需要注意的是,values对应的文件夹很多,因为是多国语言支持。而dimens.xml在默认的values文件夹下面或者values-land和values-port(针对不同分辨率和平板类型,需要根据你运行情况找对应的dimens修改,如果需要使用多种分辨率,最好所有dimens都修改好)。下面是配置workspace的按钮属性配置。下面是针对values-land修改的cell大小。

//Edited by mythou
//http://www.cnblogs.com/mythou/<!-- Workspace cell size -->
<dimen name="workspace_cell_width_land">88dp</dimen>
<dimen name="workspace_cell_width_port">96dp</dimen>
<dimen name="workspace_cell_height_land">88dp</dimen>
<dimen name="workspace_cell_height_port">96dp</dimen>
<dimen name="workspace_width_gap_land">32dp</dimen>
<dimen name="workspace_width_gap_port">0dp</dimen>
<dimen name="workspace_height_gap_land">0dp</dimen>
<dimen name="workspace_height_gap_port">24dp</dimen><!-- Folders -->
<dimen name="folder_preview_size">68dp</dimen>
<dimen name="folder_cell_width">86dp</dimen>
<dimen name="folder_cell_height">90dp</dimen>
<dimen name="folder_width_gap">3dp</dimen>
<dimen name="folder_height_gap">3dp</dimen>
<dimen name="folder_padding">6dp</dimen>

 2、Launcher 图标加入默认背景。

Launcher默认图标是各自应用程序设计的,这也导致了,界面图标看上去大小不同意,有点凌乱的感觉。如果整个系统是自己修改的,内置应用图标可以设置统一风格大小。如果是第三方程序就很难保证,所以一个折中办法是给所有图标加入一个背景,看上去风格一致。

Launcher图标的获取处理是在Utilities.java类里面,我们可以从里面找到Bitmap createIconBitmap(Drawable icon, Context context) 方法。这个方法就是返回应用图标的。默认createIconBitmap里面有个加入五颜六色背景的方法,不过是屏蔽了,我们可以参考这个方法,加入一个默认背景图。

//Edited by mythou
//http://www.cnblogs.com/mythou/static Bitmap createIconBitmap(Drawable icon, Context context) {//...............final int left = (textureWidth-width) / 2;final int top = (textureHeight-height) / 2;//测试用,加入彩色背景边框if (false) {// draw a big box for the icon for debuggingcanvas.drawColor(sColors[sColorIndex]);if (++sColorIndex >= sColors.length) sColorIndex = 0;Paint debugPaint = new Paint();debugPaint.setColor(0xffcccc00);canvas.drawRect(left, top, left+width, top+height, debugPaint);}//增加图标背景图片 OWLif (true) {Bitmap backBitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.apical_icon_bg);int backWidth = backBitmap.getWidth();int backHeight = backBitmap.getHeight();if(backWidth != sIconWidth || backHeight != sIconHeight){Matrix matrix = new Matrix();matrix.postScale((float)sIconWidth/backWidth, (float)sIconHeight/backHeight);canvas.drawBitmap(Bitmap.createBitmap(backBitmap, 0, 0, backWidth, backHeight, matrix, true),0.0f, 0.0f, null);}else{canvas.drawBitmap(backBitmap, 0.0f, 0.0f, null);}}//................return bitmap;}}

如图上面代码,加入了 R.drawable.apical_icon_bg 一张默认的背景图作为背景,这样所有图标看上去大小都是一致的。而且风格也比较接近。对于做系统应用的人来说体验比较好。如果需要一些比较炫的效果,其实可以在这里给图标做倒影或者其他效果。

3、更换Launcher默认壁纸

Launcher默认的壁纸配置是放在framework下的res下面配置的,图片也是放在framework下面。对于需要做独立Launcher的项目,这个不能离开framework,非常不方便。所以就在Launcher自身实现一个默认壁纸设置的功能。默认壁纸,只能在Launcher第一次运行或者恢复默认设置时才需要设置显示。

因此我把默认壁纸反正设置放在Launcher.java类的onCreate()方法下的showFirstRunWorkspaceCling()执行。

showFirstRunWorkspaceCling()方法,只有Launcher第一次启动或者清除数据,恢复设置。才会运行。在showFirstRunWorkspaceCling()里面调用下面的方法

//Edited by mythou
//http://www.cnblogs.com/mythou/private void setDefaultWallPaper(){//修改默认背景 OWL test,可以在Framework替换默认静态图default_wallpaperWallpaperManager mwallpaerManager;mwallpaerManager = WallpaperManager.getInstance(this);try {mwallpaerManager.setResource(R.drawable.launcher_default_bg);} catch (IOException e) {Log.e(TAG, "set default wallpaper error");e.printStackTrace();}}

Launcher的壁纸都是调用系统WallpaperManager操作的,具体有兴趣可以查看源码。

android的静态壁纸,默认是frameworks/base/core/res/res/drawable/default_wallpaper.jpg。如果是做系统的,可以替换这张jpg图片也可以达到替换默认壁纸功能。

至于默认动态壁纸,这个要修改/framework/base/core/res/res/values/config.xml 。

<string name="default_wallpaper_component">@null</string>//把null修改为具体程序名,如下<string name="default_wallpaper_component" translatable="false">包名/动态壁纸服务名</string>

另外Launcher自身自带了一些默认壁纸,反正Launcher的res/drawable文件夹下,不同分辨率文件夹放了大小不一样。

这些默认壁纸在Launcher下values/wallpapers.xml下有配置。

//http://www.cnblogs.com/mythou/<resources><string-array name="wallpapers" translatable="false"><item>wallpaper_01</item><item>wallpaper_02</item><item>wallpaper_03</item><item>wallpaper_04</item><item>wallpaper_05</item><item>wallpaper_06</item><item>wallpaper_07</item><item>wallpaper_08</item><item>wallpaper_09</item><item>wallpaper_10</item><item>wallpaper_11</item><item>wallpaper_12</item></string-array>
</resources>

不过系统默认最多是支持24张图片。可以修改壁纸名字或者新增壁纸都是可以的。壁纸名字跟图片名字一一对应。

4、壁纸设置过程:

具体壁纸操作其实都是在WallpaperChooserDialogFragment这个Fragment里面实现,

查找默认壁纸:

//Edited by mythou
//http://www.cnblogs.com/mythou/private void findWallpapers() {mThumbs = new ArrayList<Integer>(24);mImages = new ArrayList<Integer>(24);final Resources resources = getResources();// Context.getPackageName() may return the "original" package name,// com.android.launcher2; Resources needs the real package name,// com.android.launcher. So we ask Resources for what it thinks the// package name should be.final String packageName = resources.getResourcePackageName(R.array.wallpapers);addWallpapers(resources, packageName, R.array.wallpapers);addWallpapers(resources, packageName, R.array.extra_wallpapers);}

其中R.array.wallpapers 就是上面说的默认壁纸名字的xml配置文件。通过这个文件加载所有默认壁纸。除了wallpapers 还有一个extra_wallpapers。这两个功能原理是一样的。

设置壁纸比较简单,跟我们设置默认壁纸一样

//Edited by mythou
//http://www.cnblogs.com/mythou/private void selectWallpaper(int position) {try {WallpaperManager wpm = (WallpaperManager) getActivity().getSystemService(Context.WALLPAPER_SERVICE);wpm.setResource(mImages.get(position)); //设置壁纸Activity activity = getActivity();activity.setResult(Activity.RESULT_OK);activity.finish();} catch (IOException e) {Log.e(TAG, "Failed to set wallpaper: " + e);}}

主要还是调用WallpaperManager的setResource方法。

今天就写到这里,如果有发现哪里写错了请留言,谢谢!

Android之Launcher分析和修改2——Icon修改、界面布局调整、壁纸设置相关推荐

  1. Android项目:手机安全卫士(3)—— 主界面布局

    Android项目:手机安全卫士(3)-- 主界面布局 1 总纲 前面实现了"手机安全卫士"的闪屏界面与版本检测升级问题,接下来的任务就是实现主界面了,这个相对简单,因为没有涉及到 ...

  2. Android之Launcher分析和修改1——Launcher默认界面配置(default_workspace)

    www.cnblogs.com/mythou/p/3153880.html 最近工作都在修改Launcher,所以打算把分析源码和修改源码的过程记录下来,最近会写一些关于Launcher的分析和修改博 ...

  3. Android之Launcher分析和修改5——HotSeat分析

    今天主要是分析一下Launcher里面的快捷方式导航条--HotSeat,一般我们使用手机底下都会有这个导航条,但是如果4.0的Launcher放到平板电脑里面运行,默认是没有HotSeat的,刚好我 ...

  4. Android之Launcher分析和修改3——Launcher启动和初始化

    前面两篇文章都是写有关Launcher配置文件的修改,代码方面涉及不多,今天开始进入Launcher代码分析. 我们开机启动Launcher,Launcher是由Activity Manager启动的 ...

  5. Android之Launcher分析和修改4——初始化加载数据

    上面一篇文章说了Launcher是如何被启动的,Launcher启动的过程主要是加载界面数据然后显示出来, 界面数据都是系统APP有关的数据,都是从Launcher的数据库读取,下面我们详细分析Lau ...

  6. 3.Android高仿网易云音乐-首页复杂发现界面布局和功能

    0.效果图 效果图依次为发现界面顶部,包含首页轮播图,水平滚动的按钮,推荐歌单:然后是发现界面推荐单曲,点击单曲就是直接进入播放界面:最后是全局播放控制条上点击播放列表按钮显示的播放列表弹窗. 1.整 ...

  7. android 壁纸改变回调,Android Launcher分析和修改13——实现Launcher编辑模式(1) 壁纸更换...

    已经好久没更新Launcher系列文章,今天不解析源码,讲讲如安在Launcher里面添加桌面设置的功能.今朝很多第三方Launcher或者定制Rom都有简单易用的桌面设置功能.例如小米MIUI的La ...

  8. 日记背景 android,android学习日记:4.0源生背景修改

    经过整整一周的学习,总算实现了android中源生背景的修改.效果如下: 分别是修改前的原始界面.选择背景设置界面以及最后的效果图. 之前一直想用ScrollView来实现这个效果,后来发现用Gall ...

  9. 【Android】eclipse 实现登录、注册、修改密码、数据库操作

    该项目参考:https://blog.csdn.net/midnight_time/article/details/91203973 目录 登录.注册.修改密码功能的实现 一.UI的设计 二.实现功能 ...

最新文章

  1. python爬虫多线程是什么意思_python爬虫中多线程的使用详解
  2. systemverilog 关联数组
  3. Python PyPI中国镜像
  4. python 跳出for循环_Python跳出多重循环的方法
  5. xadmin获取mysql_Django2集成xadmin详解-5-获取登录用户信息并填充相应Model字段
  6. 最详细!!!软考:初级程序员—思维导图
  7. 【word论文排版教程4】样式的应用
  8. 机器学习中的统计学基础知识
  9. ftp服务器FileZilla Server详细配置教程
  10. 量产台电U盘 把USB变成USB-CDROM
  11. 如何成为优秀的驱动开发工程师
  12. 台式计算机如何自动开关机,台式机怎么设置自动开关机
  13. 力扣HOT100题代码
  14. 0ctf_2016_unserialize
  15. torch.nn.Embedding的函数
  16. 骨传导耳机品牌排行榜前十,目前最好用的几款推荐
  17. docker镜像构建详细说明
  18. HBM (High Bandwidth Memory)
  19. android 修改aar包资源文件的最简单方法
  20. 文心一言对于宣传文案理解

热门文章

  1. 最近看了两本低代码的书
  2. WPF实现下拉框带图文和水印
  3. 墙裂推荐:这可能是CAP理论的最好解释
  4. .NET 异步,你也许不知道的5种用法
  5. Teleport 开源堡垒机的使用
  6. Kubernetes中分布式存储Rook-Ceph的使用:一个ASP.NET Core MVC的案例
  7. 欲善其事,先利其器 | IDCF第6期DevOps案例研究回顾(附视频)
  8. 面试官:你说你喜欢研究新技术,那么请说说你对 Blazor 的了解
  9. 在.Net Core 3.0中尝试新的System.Text.Json API
  10. 微软拥抱开源,Win10为啥要引入真Linux4.X内核?