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

來源:互聯網
上載者:User

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

 

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.