Android快捷方式位图启动器图标大小

时间:2013-09-05 11:29:30

标签: android bitmap icons shortcut launcher

我遇到问题,找不到我的快捷方式的正确启动器图标大小。

在我的Nexus 7.2上,android.R.dimen.app_icon_size(参见代码)的值为96像素。 但是,如果我在主屏幕截图上测量其他应用的真实图标大小,则为120像素。创建一个shortshut后,它比所有其他应用程序图标(120px)小(96像素)

在我的三星Galaxy SII上,android.R.dimen.app_icon_size是72.这与我的屏幕截图相符。

这是

的结果
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

Nexus 7.2:

android.R.dimen.app_icon_size = 96
metrics.dip = 192
metrics.density = 2.0
metrics.densityDpi = 320
metrics.heightPixels = 1824
metrics.scaledDensity = 2.0
metrics.widthPixels = 1200
metrics.xdpi = 320.842
metrics.ydpi = 322.966

三星SII:

android.R.dimen.app_icon_size = 72
metrics.dip = 108
metrics.density = 1.5
metrics.densityDpi = 240
metrics.heightPixels = 800
metrics.scaledDensity = 1.5
metrics.widthPixels = 480
metrics.xdpi = 217.71428
metrics.ydpi = 218.49463

这是我的代码:

// Calculate launcher icon size
int size = (int) getResources().getDimension(android.R.dimen.app_icon_size);
int width = size;
int height = size;

// Create launcher icon bitmap      
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);

// Inflate layout to bitmap
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayout layout = (LinearLayout) inflater.inflate(R.layout.shortcut, null, false);
// here I edit layout, change ImageView and TextView etc...
layout.setDrawingCacheEnabled(true);
layout.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
layout.layout(0, 0, layout.getMeasuredWidth(), layout.getMeasuredHeight());
canvas.drawBitmap(layout.getDrawingCache(), 0, 0, new Paint());

// Create SendFax intent
Intent shortcutIntent = new Intent();
shortcutIntent.setClass(context, SendFax.class);
shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

// Create shortcut intent               
Intent intent = new Intent();
intent.putExtra(Intent.EXTRA_SHORTCUT_ICON, bitmap);
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, description);

setResult(RESULT_OK, intent);
finish();

3 个答案:

答案 0 :(得分:7)

我找到了一个有效的解决方案:

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private int launcherLargeIconSize() {
    ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    return activityManager.getLauncherLargeIconSize();
}

int size1 = (int) getResources().getDimension(android.R.dimen.app_icon_size);
int size2 = Build.VERSION.SDK_INT >= 11 ? launcherLargeIconSize() : 0;
int size = size2 > size1 ? size2 : size1;

答案 1 :(得分:0)

如果您在android res文件夹中发现 - 应该有几个可绘制的文件夹

可绘制hdpi,可绘制mdpi,可绘制ldpi等 每个文件夹都为每个设备指定了图像,因为每个设备根据屏幕密度显示图像,有些设备密度低,有些设备密度高

这就是为什么在一台设备上你的图标大小是96像素,而在另一台设备上它是72

较旧和较小的设备甚至是48和36

为了解决问题,您只需使用正确尺寸的图标文件填充相应的可绘制文件夹,然后就不会出现问题

了解更多信息,请阅读:Supporting multi screens in android

答案 2 :(得分:0)

获得正确尺寸的启动器图标似乎并不像人们预期的那样直截了当。我知道至少平板电脑会在drawables文件夹中找到一个文件夹,以显示屏幕密度所需的更大图标。

这是多一点discussed