2013-09-05 4 views
2

У меня есть проблемы, чтобы узнать правильный размер значка пусковой установки для моего ярлыка.Ярлык для быстрого запуска растровых изображений Android

На моем Nexus 7.2 значение android.R.dimen.app_icon_size (см. Код) составляет 96 пикселей. Но если я измеряю реальный размер значка других приложений на снимке экрана моего рабочего стола, то это 120 пикселей. После создания короткой шорты она меньше (96 пикселей), чем все другие значки приложений (120 пикселей)

На моей галактике Samsung 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 

Samsung 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

Если вы заметили в папке андроида Реза - там должна быть несколько Drawable папки

вытяжки ИПЧРА, рисует MDPI, рисует ldpi и так далее каждой папку назначенные изображений для каждого устройства, поскольку каждый показывают устройства изображения в соответствии с плотностью экрана, некоторые устройства имеют низкую плотность, а некоторые имеют высокую плотность

именно поэтому на одном устройстве ваш размер значка 96 точек, а по другому 72

старшие и меньшие устройства даже 48 и 36

для того, чтобы исправить эту проблему, вы просто должны заполнить соответствующие Drawable папки с файлом значок нужного размера, а затем вы будете иметь проблемы

для получения дополнительной информации, прочтите это: Supporting multi screens in android

+0

В этом случае я не могу использовать Drawable папки, потому что я создаю растрового изображения из макета 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

Вы уверены? На мой взгляд, getLauncherLargeIconSize() не вызывается, если Build.VERSION.SDK_INT <11. Мой код работает с моим Samsung Galaxy SII, Android 2.3.6. Но если ваш минимальный уровень API <11, добавьте в метод @SuppressLint («NewApi»). – almisoft

+0

Yepp, конечно.Я тестировал его с эмулятором. Давайте посмотрим, смогу ли я изменить свой ответ и добавить свой код. – jboi

Смежные вопросы