1

更新:一部の調査では、Asus Transformer TF700T (ハイエンド) のピクセル密度は約 224 であることが判明したため、報告されている 159 android の値は誤りであるか、何らかの形で変更されています (/ の lcd-density キーsystem/build.prop)、何らかの理由で見つかりません。

ASUS Transformer と 10.1" の 2 台のほぼ同一のタブレットを開発しています。

ハイエンド モデルの仕様は次のとおりです (dm = ApplicationContext.Resources.DisplayMetrics)。

dm.Density = 1.5
dm.DensityDpi = High
dm.WidthPixels = 1920
dm.HeightPixels = 1128
dm.Xdpi = 159.8951
dm.Ydpi = 159.5811

ローエンドモデルには次のものがあります。

dm.Density = 1
dm.DensityDpi = Default
dm.WidthPixels = 1280
dm.HeightPixels = 752
dm.Xdpi = 160.1576
dm.Ydpi = 160

ハイエンドモデルには違いがあります。Density/DensityDpi は 1.5/High であり、これは 10.1 インチ画面内の高解像度の b/c に意味があります。しかし、1.5 の値を取得するには、Xdpi/Ydpi = 240 ではありません (式については、httpを参照してください)。 ://developer.android.com/guide/practices/screens_support.html )

px = dp * (dpi / 160) 

どこ

scale = (dpi / 160)

それで

240/160 = 1.5 

160 の Xdpi/Ydpi は、1.5 密度 (スケーリング) 係数に対応していません。これは、160/160 = 1 になります。正しいですか?

この DPI とスケーリング係数の不一致により、2 つのタブレット間でサイズの不一致が発生しています。これは、私が使用している関数 (Context.Resources.GetDimension) がハイエンドのタブレットで値を拡大しすぎているためです (または大きすぎます)。下端が小さく、「通常/良好」サイズの基準に応じて)。

つまり、最初のタブレットで密度が 1 の場合、または xdpi/Ydpi が 240 の場合、この問題は発生しません。これらの値は、接続されている必要があるため、接続されているようには見えません。これは、ASUS がより高い解像度を取得するために LCD 密度設定を 159 に設定した可能性があるためです (/system/build.prop で - ro.sf.lcd_density キーを探して (ROM ツールボックスを使用して) 確認しましたが、できませんでした)。それを見つける)。


カスタムビューのコンストラクターからの参照用の出力を次に示します。

ハイエンドタブレット:

Context.Resources.GetDimension(control_panel_height_id) = 75
Context.Resources.GetDimension(grid_cell_boarder_width_id) = 1.5
Context.Resources.GetDimension(list_title_height_id) = 40.5
Context.Resources.GetDimension(list_title_text_size_id) = 21
Context.Resources.GetDimension(list_item_text_size_1_id) = 18
Context.Resources.GetDimension(list_item_text_size_2_id) = 15
Context.Resources.GetDimension(month_label_text_size_id) = 33

ローエンドのタブレット:

Context.Resources.GetDimension(control_panel_height_id) = 50
Context.Resources.GetDimension(grid_cell_boarder_width_id) = 1
Context.Resources.GetDimension(list_title_height_id) = 27
Context.Resources.GetDimension(list_title_text_size_id) = 14
Context.Resources.GetDimension(list_item_text_size_1_id) = 12
Context.Resources.GetDimension(list_item_text_size_2_id) = 10
Context.Resources.GetDimension(month_label_text_size_id) = 22

ビューのレイアウト宣言はどこにありますか

<AppName.Droid.Views.Custom.CustomView
  xmlns:calendar="http://schemas.android.com/apk/res/namespace"
  android:id="@+id/CustomView1"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="#1100FF00"
  calendar:control_panel_height="@dimen/control_panel_height"
  calendar:grid_cell_boarder_width="@dimen/grid_cell_boarder_width"
  calendar:list_title_height="@dimen/list_title_height"
  calendar:list_title_text_size="@dimen/list_title_text_size"
  calendar:list_item_text_size_1="@dimen/list_item_text_size_1"
  calendar:list_item_text_size_2="@dimen/list_item_text_size_2"
  calendar:month_label_text_size="@dimen/month_label_text_size"/>

それが参照する次元は次のように定義されます

<resources>
  <dimen name="control_panel_height">50dip</dimen>
  <dimen name="grid_cell_boarder_width">1dip</dimen>
  <dimen name="list_title_height">27dip</dimen>
  <dimen name="list_title_text_size">14dip</dimen>
  <dimen name="list_item_text_size_1">12dip</dimen>
  <dimen name="list_item_text_size_2">10dip</dimen>
  <dimen name="month_label_text_size">22dip</dimen>
</resources>
4

2 に答える 2

0
于 2013-05-24T09:39:33.847 に答える
0

注:私は自分の答えを受け入れていないので、これで何が起こっているのかを知っている人が試してくれることを願っています. この回答を投稿して問題を解決しましたが、根本的な質問や謎にはまだ対処していません。


私自身のいくつかの計算を行った後、ハイエンド デバイスの Xdpi/Ydpi 値はより正確であり、ローエンド デバイスは計算値よりも高い値を報告しているように見えます。どちらも物理的な寸法は

length = 7.12"
width = 10.35"

ハイエンドタブレット向けの

Xdpi = 1920 / 10.35 = 185.5
Ydpi = 1128 / 7.12 = 158.4

そしてローエンドのもののために

Xdpi = 1280 / 10.35 = 123.7
Ydpi = 752 / 7.12 = 105.6

Asusのドキュメントには、

dpi (high-end) = 224
dpi (low-end) = 149

私は、Androidが密度に基づいてデバイスを 4 つのグループに「バケット化」することを認識しています: low、medium、high、very-high、および (抽象) dpi 値 (/system/build.prop 内) をこれらに基づくプリセット値に割り当てます。それぞれ120、160、240、および 320

これらの値にもかかわらず、アンドロイドはそれぞれの密度 (倍率) を正しく報告しました。

Density (high-end) = 1.5
Density (low-end) = 1

したがって、複数の画面をサポートするために Android ( http://developer.android.com/guide/practices/screens_support.html ) で提案されているように、dimens.xml の 2 つのバージョン (サイズが定義されている場所) に対して 2 つの Values フォルダーを作成しました。

Resources/Values-Hdpi/dimens.xml
Resources/Values-Mdpi/dimens.xml

ここで、Values-Hdpi/dimens.xml は 1.5 のスケーリング係数を補うためにより小さい値を持ち、Values-Mdpi/dimens.xml は 1 でスケーリングされる「正規化された」値を持っていました。両方のタブレットが正しく表示されるようになりました。正しいサイズ。しかし、それが dp/dip メトリックの目的ではないので、これらの個別の値セットを明示的に定義する必要はありませんか?

于 2013-05-22T19:12:24.567 に答える