上一篇文章说了如何修改Android自带Launcher2的默认界面设置(http://www.cnblogs.com/mythou/p/3153880.html)。html
今天主要是说说Launcher里面图标、布局、壁纸等的设置问题。毕竟咱们通常修改Launcher,这些都是须要修改的地方,也是比较容易修改的部分。按照效果图(效果图在上一篇文章),分开说明如何修改,以及里面涉及的逻辑分析。java
原创博文,转载请标明出处:http://www.cnblogs.com/mythou/p/3155692.htmlandroid
一、图标大小和标题大小canvas
Android原生图标大小都是经过配置文件设置,配置文件路径是/res/values/dimens.xml 。须要注意的是,values对应的文件夹不少,由于是多国语言支持。而dimens.xml在默认的values文件夹下面或者values-land和values-port(针对不一样分辨率和平板类型,须要根据你运行状况找对应的dimens修改,若是须要使用多种分辨率,最好全部dimens都修改好)。下面是配置workspace的按钮属性配置。下面是针对values-land修改的cell大小。api
//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>post
二、Launcher 图标加入默认背景。测试
Launcher默认图标是各自应用程序设计的,这也致使了,界面图标看上去大小不一样意,有点凌乱的感受。若是整个系统是本身修改的,内置应用图标能够设置统一风格大小。若是是第三方程序就很难保证,因此一个折中办法是给全部图标加入一个背景,看上去风格一致。this
Launcher图标的获取处理是在Utilities.java类里面,咱们能够从里面找到Bitmap createIconBitmap(Drawable icon, Context context) 方法。这个方法就是返回应用图标的。默认createIconBitmap里面有个加入五光十色背景的方法,不过是屏蔽了,咱们能够参考这个方法,加入一个默认背景图。spa
//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 debugging
canvas.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); } //增长图标背景图片 OWL
if (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 一张默认的背景图做为背景,这样全部图标看上去大小都是一致的。并且风格也比较接近。对于作系统应用的人来讲体验比较好。若是须要一些比较炫的效果,其实能够在这里给图标作倒影或者其余效果。
三、更换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_wallpaper
WallpaperManager 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下有配置。
//Edited by mythou
//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张图片。能够修改壁纸名字或者新增壁纸都是能够的。壁纸名字跟图片名字一一对应。
四、壁纸设置过程:
具体壁纸操做其实都是在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方法。
今天就写到这里,若是有发现哪里写错了请留言,谢谢!