zoukankan      html  css  js  c++  java
  • 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方法。





  • 相关阅读:
    paip.提升性能---- 网站并发数的总结.txt
    paip.mysql 5.6 安装总结
    UIView上添加了一个按钮和一个单击手势的事件相应,互相不影响的处理方法。。
    paip.mysql备份慢的解决
    paip.输入法编程---词频顺序order by py
    paip.超实用 360浏览器最近频繁奔溃解决流程.
    hdu 4044 GeoDefense (树形dp | 多叉树转二叉树)
    给定一个字符串,仅由a,b,c 3种小写字母组成。
    汉语-词语:心境2
    汉语-词语:休咎
  • 原文地址:https://www.cnblogs.com/liulaolaiu/p/11744553.html
Copyright © 2011-2022 走看看