android Launcher4 给第三方应用图标添加底图

原创 2015年11月21日 16:44:16

最近改系统Launcher 遇到不少头疼的问题,Launcher中,图标大小不统一非常影响体验,

也不美观,市场上的launcher多数做法都是给第三方应用添加底图,源码中自带了用来调试用的

给图标添加一个方框的代码,是在是看不下去...(个人审美观的问题...不喜勿喷...)

话不多说,上源码...

package/apps/Launcher4/src/com/android/launcher4/Utilities.java

//在源码Utilities.java的createIconBitmap(Drawable icon, Context context, boolean isCustomIcon)方法中添加

public static Bitmap createIconBitmap(Drawable icon, Context context, boolean isCustomIcon) {
        synchronized (sCanvas) { // we share the statics :-(
            if (sIconWidth == -1) {
                initStatics(context);
            }


            int width = sIconWidth;
            int height = sIconHeight;


            if (icon instanceof PaintDrawable) {
                PaintDrawable painter = (PaintDrawable) icon;
                painter.setIntrinsicWidth(width);
                painter.setIntrinsicHeight(height);
            } else if (icon instanceof BitmapDrawable) {
                // Ensure the bitmap has a density.
                BitmapDrawable bitmapDrawable = (BitmapDrawable) icon;
                Bitmap bitmap = bitmapDrawable.getBitmap();
                if (bitmap.getDensity() == Bitmap.DENSITY_NONE) {
                    bitmapDrawable.setTargetDensity(context.getResources().getDisplayMetrics());
                }
            }
            int sourceWidth = icon.getIntrinsicWidth();
            int sourceHeight = icon.getIntrinsicHeight();
            if (sourceWidth > 0 && sourceHeight > 0) {
                // Scale the icon proportionally to the icon dimensions
                final float ratio = (float) sourceWidth / sourceHeight;
                if (sourceWidth > sourceHeight) {
                    height = (int) (width / ratio);
                } else if (sourceHeight > sourceWidth) {
                    width = (int) (height * ratio);
                }
            }


            // no intrinsic size --> use default size
            int textureWidth = sIconTextureWidth;
            int textureHeight = sIconTextureHeight;


            textureWidth += isCustomIcon ? 0 : 42;
            textureHeight += isCustomIcon ? 0 : 42;


            final Bitmap bitmap = Bitmap.createBitmap(textureWidth, textureHeight,
                    Bitmap.Config.ARGB_8888);
            final Canvas canvas = sCanvas;
            canvas.setBitmap(bitmap);


            final int left = (textureWidth-width) / 2;
            final int top = (textureHeight-height) / 2;

// 源码自带的给图标增加五颜六色的框 相当难看.....
            @SuppressWarnings("all") // suppress dead code warning
            final boolean debug = false;
            if (debug) {
                // 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);
            }


            // 第三方icon添加底图begin
            if (!isCustomIcon){//isCustomIcon标示系统应用
                int resourceId = R.drawable.ic_background_for_every_icon; //要添加的底图资源文件
                Bitmap backBitmap = BitmapFactory.decodeResource(context.getResources(), resourceId);
                int backWidth = backBitmap.getWidth();
                int backHeight = backBitmap.getHeight();
                if(backWidth != sIconWidth || backHeight != sIconHeight){
                    Matrix matric = new Matrix();
                    matric.postScale((float)0.9 , (float)0.9);//缩放底图
                    canvas.drawBitmap(Bitmap.createBitmap(backBitmap ,left, top, left+width+left, 
                                        top+height+top ,matric ,true) ,8 ,9 ,null);
                }else{
                    canvas.drawBitmap(backBitmap ,0.0f ,0.0f ,null);
                }
            }
            // end


            sOldBounds.set(icon.getBounds());
            icon.setBounds(left, top, left+width, top+height);
            icon.draw(canvas);
            icon.setBounds(sOldBounds);
            canvas.setBitmap(null);


            return bitmap;
        }
    }

完结

Android5.1 Launcher3 隐藏指定应用图标

分两种情况:   1.有源码的应用。   因为Launcher是根据应用清单文件里   来显示图标,所以如果我们有应用的源码,可以直接将清单文件里的这句话去掉,应用便不会在桌面上显示了。做整机项目的话...

android去掉Launcher界面图标显示

要想不显示桌面图标只需修改AndroidManifest.xml文件即可。具体如下:

Launcher2修改--快捷界面和All Apps Icon大小和背景(二)

这里的修改均以横屏,分辨率为800*480为例,因为屏不同方向和分辨率使用的资源是不一样的,下面先来看下修改前后的对比图 修改前是4x4: 修改后是3x5: 修改的文件有layout-land...

如何修改Android应用程序的图标和名字?

修改程序的图标 直接修改drawable文件夹的icon.png图标,把新的图标改名覆盖就可以了。 如果你要自己的名称,可以修改AndroidManifest.xml的这个节点,appli...

关于如何更改android应用程序的图标问题

关于如何更改android应用程序的图标问题

Launcher 读取第三方图标颜色添加相应的背景

因为 android的第三方图标不规则,公司这边会要求统一加一个标准背板。但是如果所有的图标都加一个会显得单调,所以我采用读取第三方图标的颜色,然后添加相应的背景。 修改图标背景的文件是在Laun...

Android Launcher3修改行数,列数,布局等;隐藏HostSeat,使用户无法拖拽应用图标到Hotseat

修改Launcher的行列数比较简单,在DeviceProfile方法中的构造方法中,可以修改行数,列数等。但是更严格的话需要到DynamicGrid方法中,调用DeviceProfile该方法时根据...
  • cgt_cgt
  • cgt_cgt
  • 2017年07月28日 15:28
  • 461

Android Launcher 应用图标大小不一的情况或GirdView Item 不规则处理与解决

Android Launcher 应用图标大小不一的情况或GirdView Item 不规则处理与解决
  • jspping
  • jspping
  • 2015年11月19日 12:05
  • 1727

Android4.0.3 Launcher应用程序图标放置区域修改

最开始不知道中间那块区域叫什么,只知道Lancher中间那块操作的地方叫做workspace 上网查了后 发现滑动的时候是CellLayout在进行切换,android4.0默认的CellLayout...
  • hclydao
  • hclydao
  • 2014年01月07日 15:11
  • 2521

修改android N的Launcher3桌面应用图标

修改android N的Launcher3桌面应用图标修改桌面应用默认图标的话修改的是IconCache.java这个文件 IconCache会保存应用的图标和title等信息。我想更改图标的话就从...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android Launcher4 给第三方应用图标添加底图
举报原因:
原因补充:

(最多只允许输入30个字)