上一篇文章說了如何修改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 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 一張預設的背景圖作為背景,這樣所有表徵圖看上去大小都是一致的。而且風格也比較接近。對於做系統應用的人來說體驗比較好。如果需要一些比較炫的效果,其實可以在這裡給表徵圖做倒影或者其他效果。
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_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張圖片。可以修改壁紙名字或者新增壁紙都是可以的。壁紙名字跟圖片名字一一對應。
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方法。
今天就寫到這裡,如果有發現哪裡寫錯了請留言,謝謝!