今天主要是說說Launcher裏面圖標、佈局、壁紙等的設置問題。畢竟咱們通常修改Launcher,這些都是須要修改的地方,也是比較容易修改的部分。按照效果圖(效果圖在上一篇文章),,分開說明如何修改,以及裏面涉及的邏輯分析。html
一、圖標大小和標題大小java
Android原生圖標大小都是經過配置文件設置,配置文件路徑是/res/values/dimens.xml 。須要注意的是,values對應的文件夾不少,由於是多國語言支持。而dimens.xml在默認的values文件夾下面或者values-land和values-port(針對不一樣分辨率和平板類型,須要根據你運行狀況找對應的dimens修改,若是須要使用多種分辨率,最好全部dimens都修改好)。下面是配置workspace的按鈕屬性配置。下面是針對values-land修改的cell大小。android
<!-- Workspace cell size --> <dimen>88dp</dimen> <dimen>96dp</dimen> <dimen>88dp</dimen> <dimen>96dp</dimen> <dimen>32dp</dimen> <dimen>0dp</dimen> <dimen>0dp</dimen> <dimen>24dp</dimen> <!-- Folders --> <dimen>68dp</dimen> <dimen>86dp</dimen> <dimen>90dp</dimen> <dimen>3dp</dimen> <dimen>3dp</dimen> <dimen>6dp</dimen> web
二、Launcher 圖標加入默認背景。canvas
Launcher默認圖標是各自應用程序設計的,這也致使了,界面圖標看上去大小不一樣意,有點凌亂的感受。若是整個系統是本身修改的,內置應用圖標能夠設置統一風格大小。若是是第三方程序就很難保證,因此一個折中辦法是給全部圖標加入一個背景,看上去風格一致。api
Launcher圖標的獲取處理是在Utilities.java類裏面,咱們能夠從裏面找到Bitmap createIconBitmap(Drawable icon, Context context) 方法。這個方法就是返回應用圖標的。默認createIconBitmap裏面有個加入五光十色背景的方法,不過是屏蔽了,咱們能夠參考這個方法,加入一個默認背景圖。佈局
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), .0f, 0.0f, null); }else { canvas.drawBitmap(backBitmap, 0.0f, 0.0f, null); } } //................ return bitmap; } } post
如圖上面代碼,加入了 R.drawable.apical_icon_bg 一張默認的背景圖做爲背景,這樣全部圖標看上去大小都是一致的。並且風格也比較接近。對於作系統應用的人來講體驗比較好。若是須要一些比較炫的效果,其實能夠在這裏給圖標作倒影或者其餘效果。測試
三、更換Launcher默認壁紙this
Launcher默認的壁紙配置是放在framework下的res下面配置的,圖片也是放在framework下面。對於須要作獨立Launcher的項目,這個不能離開framework,很是不方便。因此就在Launcher自身實現一個默認壁紙設置的功能。默認壁紙,只能在Launcher第一次運行或者恢復默認設置時才須要設置顯示。
所以我把默認壁紙反正設置放在Launcher.java類的onCreate()方法下的showFirstRunWorkspaceCling()執行。
showFirstRunWorkspaceCling()方法,只有Launcher第一次啓動或者清除數據,恢復設置。纔會運行。在showFirstRunWorkspaceCling()裏面調用下面的方法
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>@null</string> //把null修改成具體程序名,以下 <string translatable="false">包名/動態壁紙服務名</string>
另外Launcher自身自帶了一些默認壁紙,反正Launcher的res/drawable文件夾下,不一樣分辨率文件夾放了大小不同。
這些默認壁紙在Launcher下values/wallpapers.xml下有配置。
<resources> <string-array 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裏面實現,
查找默認壁紙:
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。這兩個功能原理是同樣的。
設置壁紙比較簡單,跟咱們設置默認壁紙同樣
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方法。