
Google Developer advocate の松内さんが Developer 向けに提供されている動画コンテンツの「[JP 日本語] Android アプリ タブレット端末対応 ことはじめ 」を聞いていて、15分ぐらいのところで「Tabletデバイスでは、ホーム画面では一段階大きなアイコンが利用されます。」という紹介がありました。アプリ開発者視点では、drawable-xxhdpi/ か drawable-480dpi/ に 144px * 144 px(32 bit PNG(透過含む))をホームアイコンを準備しておく必要があります。
この対応がどのADTから入っているかを調べてみると、 ADT 20.0.1 (July 2012) から対応されていました。
- ADT 20.0.1 (July 2012)
- Bug fixes:
- Added support for xxhdpi density, which was included in API Level 16.
- Bug fixes:
xxhdpi については、まだ Android SDK -> Supporting Multiple Screens には言及はありませんが実装上は入っているようです。DisplayMetrics には DENSITY_XXHIGH の定義があります。
タブレットアプリ向け1段階大きなアイコンの取得方法
1段階大きなアイコン取得に関係ありそうなAPIは、 getLauncherLargeIconDensity(), getLauncherLargeIconSize() のようです。
http://tools.oesf.biz/android-4.2.0_r1.0/xref/frameworks/base/core/java/android/app/ActivityManager.javaから該当部分を抽出します。
public int getLauncherLargeIconDensity() {
final Resources res = mContext.getResources();
final int density = res.getDisplayMetrics().densityDpi;
final int sw = res.getConfiguration().smallestScreenWidthDp;
if (sw < 600) {
// Smaller than approx 7" tablets, use the regular icon size.
return density;
}
switch (density) {
case DisplayMetrics.DENSITY_LOW:
return DisplayMetrics.DENSITY_MEDIUM;
case DisplayMetrics.DENSITY_MEDIUM:
return DisplayMetrics.DENSITY_HIGH;
case DisplayMetrics.DENSITY_TV:
return DisplayMetrics.DENSITY_XHIGH;
case DisplayMetrics.DENSITY_HIGH:
return DisplayMetrics.DENSITY_XHIGH;
case DisplayMetrics.DENSITY_XHIGH:
return DisplayMetrics.DENSITY_XXHIGH;
case DisplayMetrics.DENSITY_XXHIGH:
return DisplayMetrics.DENSITY_XHIGH * 2;
default:
// The density is some abnormal value. Return some other
// abnormal value that is a reasonable scaling of it.
return (int)((density*1.5f)+.5f);
}
}
public int getLauncherLargeIconSize() {
final Resources res = mContext.getResources();
final int size = res.getDimensionPixelSize(android.R.dimen.app_icon_size);
final int sw = res.getConfiguration().smallestScreenWidthDp;
if (sw < 600) {
// Smaller than approx 7" tablets, use the regular icon size.
return size;
}
final int density = res.getDisplayMetrics().densityDpi;
switch (density) {
case DisplayMetrics.DENSITY_LOW:
return (size * DisplayMetrics.DENSITY_MEDIUM) / DisplayMetrics.DENSITY_LOW;
case DisplayMetrics.DENSITY_MEDIUM:
return (size * DisplayMetrics.DENSITY_HIGH) / DisplayMetrics.DENSITY_MEDIUM;
case DisplayMetrics.DENSITY_TV:
return (size * DisplayMetrics.DENSITY_XHIGH) / DisplayMetrics.DENSITY_HIGH;
case DisplayMetrics.DENSITY_HIGH:
return (size * DisplayMetrics.DENSITY_XHIGH) / DisplayMetrics.DENSITY_HIGH;
case DisplayMetrics.DENSITY_XHIGH:
return (size * DisplayMetrics.DENSITY_XXHIGH) / DisplayMetrics.DENSITY_XHIGH;
case DisplayMetrics.DENSITY_XXHIGH:
return (size * DisplayMetrics.DENSITY_XHIGH*2) / DisplayMetrics.DENSITY_XXHIGH;
default:
// The density is some abnormal value. Return some other
// abnormal value that is a reasonable scaling of it.
return (int)((size*1.5f) + .5f);
}
}
上記を見てみると、case DisplayMetrics.DENSITY_XHIGH の場合に return DisplayMetrics.DENSITY_XXHIGH のように返しています。これが該当する部分のようです。
ホームアプリのサンプルの launcher2 では以下のようにこのAPIを利用しています。
public IconCache(LauncherApplication context) {
ActivityManager activityManager =
(ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
mContext = context;
mPackageManager = context.getPackageManager();
mIconDpi = activityManager.getLauncherLargeIconDensity();
// need to set mIconDpi before getting default icon
mDefaultIcon = makeDefaultIcon();
}
public Drawable getFullResIcon(Resources resources, int iconId) {
Drawable d;
try {
d = resources.getDrawableForDensity(iconId, mIconDpi);
} catch (Resources.NotFoundException e) {
d = null;
}
return (d != null) ? d : getFullResDefaultActivityIcon();
}
アイコンのキャッシュ機構のクラスの中でアイコンのDPIを取得して、そのDPIのアイコン画像をリソースから取得しているようです。アプリ一覧などを表示するアプリを作っている方は同じ方法を使えば、より綺麗なアイコンが利用できると思います。
xxhdpi以外のリソースのサイズなどについては、Androidアプリーリソース画像サイズ&種類ーのブログが大変よくまとまっています。


Androidタブレットアプリのホームアイコンは1段階大きなアイコンが必要 | Bescottee – http://andbrowser.com/develop...
だから滲んでるアイコンあるんだな #Nexus7 "Tabletデバイスでは、ホーム画面では一段階大きなアイコンが利用されます"
だから滲んでるアイコンあるんだな #Nexus7 "Tabletデバイスでは、ホーム画面では一段階大きなアイコンが利用されます" / “Androidタブレットアプリのホームアイコンは1段階大きなアイコンが必要 | Bescottee” http://t.co/VOfIoal0
Androidタブレットアプリのホームアイコンは1段階大きなアイコンが必要 | Bescottee – http://andbrowser.com/develop...
[Android] / “Androidタブレットアプリのホームアイコンは1段階大きなアイコンが必要 | Bescottee” http://t.co/H8iZY6G9
[Android] / “Androidタブレットアプリのホームアイコンは1段階大きなアイコンが必要 | Bescottee” http://t.co/H8iZY6G9
android: Androidタブレットアプリのホームアイコンは1段階大きなアイコンが必要 | Bescottee http://t.co/2pWd2FFG
via http://j.mp/ViuiJx
Androidタブレットアプリのホームアイコンは1段階大きなアイコンが必要 | Bescottee http://t.co/OLMnQD01
Androidタブレットアプリのホームアイコンは1段階大きなアイコンが必要 | Bescottee – http://andbrowser.com/develop...
Androidタブレットアプリのホームアイコンは1段階大きなアイコンが必要 | Bescottee http://t.co/OLMnQD01
Androidタブレットアプリのホームアイコンは1段階大きなアイコンが必要 | Bescottee (4 users) http://t.co/7NXuyw7y #androidjp
Androidタブレットアプリのホームアイコンは1段階大きなアイコンが必要 | Bescottee http://t.co/cMVrsott
Androidタブレットアプリのホームアイコンは1段階大きなアイコンが必要 | Bescottee http://t.co/9h9RUX0d
xxhdpiは既に実装されていたのか!
[Android]xxhdpiは既に実装されていたのか! / “Androidタブレットアプリのホームアイコンは1段階大きなアイコンが必要 | Bescottee” http://t.co/RNR8B8Ho
この仕様に苦しめられている // Androidタブレットアプリのホームアイコンは1段階大きなアイコンが必要 http://t.co/BStQZeaH
Androidタブレットアプリのホームアイコンは1段階大きなアイコンが必要 http://t.co/GFGLRour