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;
        }
    }

完结

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

android手把手教你开发launcher(四)——显示widget

由于本人的项目目前暂时不添加小部件,所以我就不做跟着本文做了,以下是原内容。原文地址:http://www.bangchui.org/read.php?tid=12239 我们要达到这样的效果:点击“...
  • sljjyy
  • sljjyy
  • 2013-09-24 15:19
  • 8545

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

修改Launcher的行列数比较简单,在DeviceProfile方法中的构造方法中,可以修改行数,列数等。但是更严格的话需要到DynamicGrid方法中,调用DeviceProfile该方法时根据...

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

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

ArcGIS for android 实例应用(2)之使用ArcGIS底图

本文主要添加ArcGIS底图操作,在第一篇的ArcGIS for android 实例应用之前期准备(http://blog.csdn.net/u012224838/article/details/4...

Android Launcher3 去掉应用列表后,在系统桌面拖动应用图标卸载应用

隐藏掉应用列表后,发现在Launcher的WorkSpace中不管怎样都市无法卸载应用的,只能删除图标。研究发现在DeleteDropTarget这个类中可以控制拖拽应用图标卸载应用。 1、修改代...

Launcher2 自定义应用快捷方式图标

依然是Launcher2的代码,这回是要将Launcher2中显示应用的图标进行自定义图标。              这个修改的想法产生自现在遇到的一个问题,就是对于一个自定义的Launcher来...

给launcher上的应用图标ICON加上背景框

launcher上的应用图标ICON,是在Utilities.java里的static Bitmap createIconBitmap(Drawable icon, Context context)这...

Android 开发之系统应用Launcher详解,简单添加和删除快捷方式及常见问题

转载自:http://blog.csdn.net/t12x3456/article/details/7857925 Android 开发之系统应用Launcher详解,简单添加和删除快捷方式...
  • yy228
  • yy228
  • 2012-08-13 14:30
  • 509
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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