Android之Launcher分析和修改2——Icon修改、界面布局调整、壁纸设置
? ? 今天主要是說說Launcher里面圖標、布局、壁紙等的設(shè)置問題。畢竟我們一般修改Launcher,這些都是需要修改的地方,也是比較容易修改的部分。按照效果圖(效果圖在上一篇文章),分開說明如何修改,以及里面涉及的邏輯分析。
?原創(chuàng)博文,轉(zhuǎn)載請標明出處:http://www.cnblogs.com/mythou/p/3155692.html
1、圖標大小和標題大小
? ? Android原生圖標大小都是通過配置文件設(shè)置,配置文件路徑是/res/values/dimens.xml 。需要注意的是,values對應(yīng)的文件夾很多,因為是多國語言支持。而dimens.xml在默認的values文件夾下面或者values-land和values-port(針對不同分辨率和平板類型,需要根據(jù)你運行情況找對應(yīng)的dimens修改,如果需要使用多種分辨率,最好所有dimens都修改好)。下面是配置workspace的按鈕屬性配置。下面是針對values-land修改的cell大小。
?2、Launcher 圖標加入默認背景。
? ? Launcher默認圖標是各自應(yīng)用程序設(shè)計的,這也導致了,界面圖標看上去大小不同意,有點凌亂的感覺。如果整個系統(tǒng)是自己修改的,內(nèi)置應(yīng)用圖標可以設(shè)置統(tǒng)一風格大小。如果是第三方程序就很難保證,所以一個折中辦法是給所有圖標加入一個背景,看上去風格一致。
?Launcher圖標的獲取處理是在Utilities.java類里面,我們可以從里面找到Bitmap createIconBitmap(Drawable icon, Context context) 方法。這個方法就是返回應(yīng)用圖標的。默認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 一張默認的背景圖作為背景,這樣所有圖標看上去大小都是一致的。而且風格也比較接近。對于做系統(tǒng)應(yīng)用的人來說體驗比較好。如果需要一些比較炫的效果,其實可以在這里給圖標做倒影或者其他效果。
?
3、更換Launcher默認壁紙
Launcher默認的壁紙配置是放在framework下的res下面配置的,圖片也是放在framework下面。對于需要做獨立Launcher的項目,這個不能離開framework,非常不方便。所以就在Launcher自身實現(xiàn)一個默認壁紙設(shè)置的功能。默認壁紙,只能在Launcher第一次運行或者恢復默認設(shè)置時才需要設(shè)置顯示。
因此我把默認壁紙反正設(shè)置放在Launcher.java類的onCreate()方法下的showFirstRunWorkspaceCling()執(zhí)行。
showFirstRunWorkspaceCling()方法,只有Launcher第一次啟動或者清除數(shù)據(jù),恢復設(shè)置。才會運行。在showFirstRunWorkspaceCling()里面調(diào)用下面的方法
//Edited by mythou //http://www.cnblogs.com/mythou/private void setDefaultWallPaper(){//修改默認背景 OWL test,可以在Framework替換默認靜態(tài)圖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的壁紙都是調(diào)用系統(tǒng)WallpaperManager操作的,具體有興趣可以查看源碼。
android的靜態(tài)壁紙,默認是frameworks/base/core/res/res/drawable/default_wallpaper.jpg。如果是做系統(tǒng)的,可以替換這張jpg圖片也可以達到替換默認壁紙功能。
至于默認動態(tài)壁紙,這個要修改/framework/base/core/res/res/values/config.xml 。
<string name="default_wallpaper_component">@null</string>//把null修改為具體程序名,如下<string name="default_wallpaper_component" translatable="false">包名/動態(tài)壁紙服務(wù)名</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>不過系統(tǒng)默認最多是支持24張圖片。可以修改壁紙名字或者新增壁紙都是可以的。壁紙名字跟圖片名字一一對應(yīng)。
?
4、壁紙設(shè)置過程:
具體壁紙操作其實都是在WallpaperChooserDialogFragment這個Fragment里面實現(xiàn),
查找默認壁紙:
//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。這兩個功能原理是一樣的。
設(shè)置壁紙比較簡單,跟我們設(shè)置默認壁紙一樣
//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)); //設(shè)置壁紙Activity activity = getActivity();activity.setResult(Activity.RESULT_OK);activity.finish();} catch (IOException e) {Log.e(TAG, "Failed to set wallpaper: " + e);}}主要還是調(diào)用WallpaperManager的setResource方法。
?
今天就寫到這里,如果有發(fā)現(xiàn)哪里寫錯了請留言,謝謝!
總結(jié)
以上是生活随笔為你收集整理的Android之Launcher分析和修改2——Icon修改、界面布局调整、壁纸设置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android之Launcher分析和修
- 下一篇: Android之Launcher分析和修