8

私は現在、間もなくリリースされるAmazonKindleFireタブレットとの互換性について既存のアプリケーションをテストしようとしています。彼らはエミュレーターを600x1024に設定し、LCD密度を169に設定すると言っています(https://developer.amazon.com/help/faq.html?ref_=pe_132830_21362890#KindleFire、メールでは169ではなく160と言っています) 。 「xlarge」ではなく「large」であると見なされます(これは、サポートチームとのメール交換で、機能しないと不満を言っています)。

Googleは、この解像度とMDPIを「大きい」とリストしている場合、複数の画面サイズのテストに関するセクションでこれが正しいとサポートしているようです(http://developer.android.com/guide/practices/screens_support.html#testing) 。ただし、「layout-large」と一緒に「layout-xlarge」フォルダーを含めると、エミュレーターは常に「xlarge」をロードします。LCD密度を240のようなものに変更すると、「xlarge」ではなく「large」が読み込まれますが、これは正しくないはずであり、最終的なデバイスでは機能しないのではないかと心配しています。これをテストするために、「Multi-Res」のAPI-10サンプルを取得し、上記の一連のレイアウトフォルダーを作成しました。「xlarge」がロードされ、「large」がロードされるたびに、

だから、私の質問は、私がドキュメントを正しく読んでいるのか、それともAmazonの人々が「大きい」と報告する必要があると主張しているためにエミュレータが混乱しているのか、それが本当なら「xlarge」を正しくロードしないのかということです?

これをテストするために変更したMulti-Resの例のマニフェストにあるものは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<manifest
  xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.example.android.multires"
  android:versionCode="1"
  android:versionName="1.0">

  <uses-permission
    android:name="android.permission.INTERNET"/>

  <application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name">

    <activity
      android:name=".MultiRes"
      android:label="@string/app_name">
      <intent-filter>
        <action
          android:name="android.intent.action.MAIN"/>
        <category
          android:name="android.intent.category.LAUNCHER"/>
      </intent-filter>
    </activity>
  </application>

  <uses-sdk android:minSdkVersion="4" />

  <supports-screens android:anyDensity="true"
                    android:xlargeScreens="true"
                    android:largeScreens="true"
                    android:normalScreens="true"
                    android:smallScreens="true" />

</manifest>
4

1 に答える 1

6

これはドキュメントのバグのようです。画面サイズの計算に使用される実際のコードを見ると、160dpiの600x1024画面が実際にxlargeと見なされることがわかります。

私の言葉を信じないでください。実装はWindowManagerService.computeNewConfigurationLocked()にあります(JavaScriptが遅い場合の警告)。興味深い点は次のとおりです。ピクセル単位の画面サイズは、密度に基づいてスケーリングされます。

    longSize = (int)(longSize/dm.density);
    shortSize = (int)(shortSize/dm.density);

mdpi(160 dpi)画面の場合、dm.densityは1.0になります。hdpi(240 dpi)の場合、1.5になります。この例では、mdpi画面があります。したがって、このコードが実行された後、longSize == 1024およびshortSize == 600。その後すぐに、次のコードに到達します。

    // What size is this screen screen?
    if (longSize >= 800 && shortSize >= 600) {
        // SVGA or larger screens at medium density are the point
        // at which we consider it to be an extra large screen.
        mScreenLayout = Configuration.SCREENLAYOUT_SIZE_XLARGE;
    } else if ( // ...

これは、の値longSizeとが割り当てられることをshortSize意味します。つまり、画面は「xlarge」と見なされます。画面の短辺が1ピクセル小さければ、「大きい」としか見なされないことに注意してください。mScreenLayoutConfiguration.SCREENLAYOUT_SIZE_XLARGE

したがって、ドキュメントを正しく読んでいますが、私が見る限り、ドキュメントは間違っており、エミュレータは問題ありません。

于 2011-11-15T15:13:39.003 に答える