Android Launcher分析和修改2——Icon修改、界面布局調整、壁紙設置


    上一篇文章說了如何修改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方法。

 

今天就寫到這里,如果有發現哪里寫錯了請留言,謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM