2013-09-05 81 views
2

我有問題需要爲我的快捷方式找到正確的啓動器圖標大小。Android快捷方式位圖啓動器圖標大小

在我的Nexus 7.2上,android.R.dimen.app_icon_size(請參閱代碼)的值爲96像素。 但是,如果我在主屏幕的屏幕截圖上測量其他應用程序的實際圖標大小,則它是120像素。創建短之後,它是比所有其他應用程序圖標(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(); 

回答

0

如果您在Android res文件夾註意 - 應該有幾個繪製文件夾

繪製華電國際,繪製MDPI,繪製LDPI併爲每個設備等等 每個文件夾已指定的圖像,因爲每個設備展示根據屏幕密度的圖像,一些設備具有低的密度,和一些具有高密度

這就是爲什麼一個設備上的圖標的大小爲96像素,並在另一個則是72

舊和較小的設備是甚至48和36

爲了解決這個問題,你只需要填寫相應的繪製文件夾,用大小合適的圖標文件,然後你不會有問題

更多的信息,請閱讀本:Supporting multi screens in android

+0

在這種情況下,我不能使用可繪製文件夾,因爲我創建佈局的xml位圖文件。上面的代碼不完整。在膨脹xml之後,我在佈局中編輯ImageView和TextView。我現在在代碼中添加了一條評論。 – almisoft

0

獲得正確尺寸的發射器圖標似乎並不像人們所期望的那樣直截了當。我知道,至少平板電腦會將一個文件夾放在drawables文件夾中,以顯示屏幕密度所期望的較大圖標。

下面是該多一點discussed

6

我已經找到了一個有效的解決方案:

@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; 
+0

這真的很酷的東西。對於我用舊的機器人測試,我實際上不得不改變你的代碼。在你的方式'getLauncherLargeIconSize()'將被調用,並拋出異常。我已經把所有這些放在了一個額外的方法中,並在SDK <11時返回。 – jboi

+0

你確定嗎?在我看來,如果Build.VERSION.SDK_INT <11,getLauncherLargeIconSize()不會被調用。我的代碼適用於我的Samsung Galaxy SII,Android 2.3.6。但是,如果您的最小API級別<11,請將@SuppressLint(「NewApi」)添加到該方法。當然,耶普, – almisoft

+0

。我用模擬器測試了它。讓我們看看我是否可以編輯你的答案並添加我的代碼。 – jboi