Bescottee苦しいときは伸びてるとき、楽なときは伸びていないとき

18 Androidタブレットアプリのホームアイコンは1段階大きなアイコンが必要

admin to development — Tags:  

AndroidDeveloperLiveAndroidTabletApp

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.

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を利用しています。

launcher2/IconCache.java

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アプリーリソース画像サイズ&種類ーのブログが大変よくまとまっています。

18件のコメント »

  1. Androidタブレットアプリのホームアイコンは1段階大きなアイコンが必要 | Bescottee – http://andbrowser.com/develop...

  2. ktakeda47 より:

    だから滲んでるアイコンあるんだな #Nexus7 "Tabletデバイスでは、ホーム画面では一段階大きなアイコンが利用されます"

  3. ktakeda47 より:

    だから滲んでるアイコンあるんだな #Nexus7 "Tabletデバイスでは、ホーム画面では一段階大きなアイコンが利用されます" / “Androidタブレットアプリのホームアイコンは1段階大きなアイコンが必要 | Bescottee” http://t.co/VOfIoal0

  4. わかめ より:

    Androidタブレットアプリのホームアイコンは1段階大きなアイコンが必要 | Bescottee – http://andbrowser.com/develop...

  5. vvakame より:

    [Android] / “Androidタブレットアプリのホームアイコンは1段階大きなアイコンが必要 | Bescottee” http://t.co/H8iZY6G9

  6. arubaitoshain より:

    [Android] / “Androidタブレットアプリのホームアイコンは1段階大きなアイコンが必要 | Bescottee” http://t.co/H8iZY6G9

  7. rss_hateb_roy より:

    android: Androidタブレットアプリのホームアイコンは1段階大きなアイコンが必要 | Bescottee http://t.co/2pWd2FFG

  8. andropink より:

    Androidタブレットアプリのホームアイコンは1段階大きなアイコンが必要 | Bescottee http://t.co/OLMnQD01

  9. siyo より:

    Androidタブレットアプリのホームアイコンは1段階大きなアイコンが必要 | Bescottee – http://andbrowser.com/develop...

  10. daminya より:

    Androidタブレットアプリのホームアイコンは1段階大きなアイコンが必要 | Bescottee http://t.co/OLMnQD01

  11. hatebu_android より:

    Androidタブレットアプリのホームアイコンは1段階大きなアイコンが必要 | Bescottee (4 users) http://t.co/7NXuyw7y #androidjp

  12. android_matome より:

    Androidタブレットアプリのホームアイコンは1段階大きなアイコンが必要 | Bescottee http://t.co/cMVrsott

  13. rssfeed7 より:

    Androidタブレットアプリのホームアイコンは1段階大きなアイコンが必要 | Bescottee http://t.co/9h9RUX0d

  14. gabuchan より:

    xxhdpiは既に実装されていたのか!

  15. gabu より:

    [Android]xxhdpiは既に実装されていたのか! / “Androidタブレットアプリのホームアイコンは1段階大きなアイコンが必要 | Bescottee” http://t.co/RNR8B8Ho

  16. u1aryz より:

    この仕様に苦しめられている // Androidタブレットアプリのホームアイコンは1段階大きなアイコンが必要 http://t.co/BStQZeaH

  17. Androidタブレットアプリのホームアイコンは1段階大きなアイコンが必要 http://t.co/GFGLRour

このコメント欄の RSS フィード トラックバック URL

コメントをどうぞ