web-dev-qa-db-ja.com

文字サイズとさまざまなAndroidの画面サイズ

私は知っています、それはすでに1000回議論されました、しかし私は異なるスクリーンサイズのためにテキストサイズを調整することができません。私は私のカスタムスタイルでサイズの単位として 'sp'を使おうとします:

<style name="CustumButtonStyle" parent="@Android:style/Widget.Button">
    ...
    <item name="Android:textSize">30sp</item>
    ...
</style>

2.7 QVGAではそれは問題ないようです。

2.7QVGA 30sp

しかし7in WSVGAでは、このようになります。

7in WSVGA 30sp

私は同じ結果で 'sp'と 'dp'の両方を使用しようとしました。

どの画面でもこれらのボタンを同じように見せる方法を教えてください。

フルカスタムボタンスタイル

<style name="CustumButtonStyle" parent="@Android:style/Widget.Button">
    <item name="Android:background">@drawable/custom_button</item>
    <item name="Android:layout_width">fill_parent</item>
    <item name="Android:layout_height">wrap_content</item>
    <item name="Android:layout_margin">3dp</item>
    <item name="Android:textColor">#ffffff</item>
    <item name="Android:gravity">center</item>
    <item name="Android:textSize">30sp</item>
    <item name="Android:textStyle">bold</item>
    <item name="Android:shadowColor">#000000</item>
    <item name="Android:shadowDx">1</item>
    <item name="Android:shadowDy">1</item>
    <item name="Android:shadowRadius">2</item>
</style>

そして私のアプリケーションテーマには

<item name="Android:buttonStyle">@style/CustumButtonStyle</item>

そして私のレイアウトがあります:

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/RelativeLayout1"
Android:layout_width="fill_parent"
Android:background="@drawable/grid"
Android:gravity="center"
Android:orientation="vertical" Android:layout_height="fill_parent">

<Button
    Android:id="@+id/buttonContinue"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_alignParentTop="true"
    Android:layout_centerHorizontal="true"
    Android:layout_gravity="center"
    Android:gravity="center"
    Android:text="@string/continue_game" Android:layout_marginTop="3dp" Android:layout_marginBottom="3dp"/>



<Button
    Android:id="@+id/buttonNewGame"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_alignLeft="@+id/buttonContinue"
    Android:layout_alignRight="@+id/buttonContinue"
    Android:layout_below="@+id/buttonContinue"
    Android:layout_gravity="center"
    Android:gravity="center"
    Android:text="@string/new_game" Android:layout_marginTop="3dp" Android:layout_marginBottom="3dp"/>



<Button
    Android:id="@+id/ButtonAbout"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_alignLeft="@+id/buttonNewGame"
    Android:layout_alignRight="@+id/buttonNewGame"
    Android:layout_below="@+id/buttonNewGame"
    Android:layout_gravity="center"
    Android:gravity="center"
    Android:text="@string/about" Android:layout_marginTop="3dp" Android:layout_marginBottom="3dp"/>
106
forcelain

@forcelainこれをチェックする必要があると思います Google IOデザイン用Pdf 。そのpdfであなたがそこにあなたがどのように例のためにアンドロイドの異なった装置のためにdimens.xmlを使うためにそれが示唆しているか見いだされるページNo:77に行く。

res/values/dimens.xml

res/values-small/dimens.xml

res/values-normal/dimens.xml

res/values-large/dimens.xml

res/values-xlarge/dimens.xml

例えば、あなたは値の中でdimens.xmlの下で使用しました。

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <dimen name="text_size">18sp</dimen>
</resources>

他の値フォルダでは、テキストサイズの値を変更する必要があります。

注:@espinchiで示されているように、small、normal、large、xlargeは、Android 3.2以降、次の理由で廃止されました。

Android 3.2用のタブレットレイアウトの宣言

Android 3.0を実行している第1世代のタブレットの場合、タブレットレイアウトを宣言する適切な方法は、それらをxlarge設定修飾子を使用してディレクトリに配置することです(たとえば、res/layout-xlarge /)。他の種類のタブレットや画面サイズ、特に7インチタブレットに対応するために、Android 3.2では、より離散的な画面サイズのリソースを指定する新しい方法が導入されています。新しい手法は、レイアウトに必要なスペースの量に基づいています。あなたのレイアウトを一般化されたサイズグループ(例えば大きいかxlargeのような)に合うようにすることよりもむしろ幅の600dp)。

一般的なサイズのグループを使用する場合、7インチタブレット用に設計するのが難しいのは、7インチタブレットは技術的には5インチのハンドセット(大規模グループ)と同じグループに属しているためです。つまり、7 "と5"の画面では必ずしも同じレイアウトを使用しないようにする必要があります。 2種類の画面で、Androidでは、アプリケーションのレイアウトで実際に使用可能な幅や高さ(dp単位で指定)に基づいてレイアウトリソースを指定できます。

たとえば、タブレットスタイルのデバイスに使用するレイアウトを設計した後で、画面の幅が600dp未満になると、レイアウトがうまく機能しなくなることがあります。したがって、このしきい値は、タブレットのレイアウトに必要な最小サイズになります。そのため、アプリケーションのUIに600dp以上の幅がある場合にのみこれらのレイアウトリソースを使用するように指定できます。

幅を選んでそれを最小サイズとしてデザインするか、完成したらレイアウトがサポートする最小幅をテストする必要があります。

注:これらの新しいサイズのAPIで使用されるすべての数値は密度に依存しないピクセル(dp)値であり、レイアウト寸法も常にdp単位を使用して定義する必要があります。 (生のピクセル解像度を使用するのではなく)画面密度を考慮します。濃度に依存しないピクセルの詳細については、このドキュメントの前半の「用語と概念」を参照してください。新しいサイズ修飾子を使う

レイアウトに使用可能なスペースに基づいて指定できるさまざまなリソース構成を表2にまとめています。これらの新しい修飾子を使用すると、従来の画面サイズグループ(小、通常、標準)と比較してアプリケーションがサポートする画面サイズをより細かく制御できます。大きい、そしてxlarge)。

注:これらの修飾子を使用して指定したサイズは実際の画面サイズではありません。そうではなく、サイズはあなたの活動のウィンドウに利用可能なdp単位の幅または高さのためのものです。 Androidシステムでは、システムUIに画面の一部(画面下部のシステムバーや上部のステータスバーなど)を使用することがあるため、レイアウトによっては使用できない画面もあります。したがって、宣言するサイズは、具体的には自分のアクティビティに必要なサイズに合わせる必要があります。システムは、レイアウトに必要なスペースを宣言するときにシステムUIで使用されるスペースを考慮します。また、レイアウトでは宣言されていませんが、アクションバーはアプリケーションのウィンドウスペースの一部と見なされるため、レイアウトに使用できるスペースが少なくなるため、デザインで考慮する必要があります。

表2.画面サイズ用の新しい構成修飾子(Android 3.2で導入)画面構成修飾子値説明leastWidth swdp

例:sw600dp sw720dp

利用可能な画面領域の最短寸法で示される、画面の基本サイズ。具体的には、デバイスの最小幅は、利用可能な画面の高さと幅のうち、最も短いものです(これを画面の「可能な最小幅」と見なすこともできます)。この修飾子を使用すると、現在の画面の向きに関係なく、アプリケーションのUIに少なくともdpsの幅を確保できます。

たとえば、画面の最小サイズの画面領域を常に600 dp以上にする必要があるレイアウトでは、この修飾子を使用してレイアウトリソースres/layout-sw600dp /を作成できます。利用可能なスクリーンの最小寸法が少なくとも600dpである場合にのみ、システムはこれらのリソースを使用します、600dpの辺がユーザーが知覚する高さか幅かにかかわらず。 smallWidthは、デバイス固有の固定画面サイズです。画面の向きが変わっても、デバイスの最小幅は変わりません。

デバイスの最小幅は、画面装飾とシステムUIを考慮したものです。たとえば、デバイスの画面上に最小の幅の軸に沿ったスペースを占める永続的なUI要素がある場合、それらはUIで使用できない画面ピクセルであるため、システムは最小の幅を実際の画面サイズよりも小さくすると宣言します。

これは、一般的な画面サイズ修飾子(small、normal、large、xlarge)に代わるものであり、これを使用すると、UIで使用可能な有効サイズに個別の数値を定義できます。通常の画面サイズを決定するためにsmallWidthを使用すると便利です。これは、レイアウトを設計する際に幅が駆動要因になることが多いためです。 UIは垂直方向にスクロールすることがよくありますが、水平方向に必要な最小スペースにはかなり厳しい制約があります。使用可能な幅も、携帯電話に1ペインレイアウトを使用するかタブレットにマルチペインレイアウトを使用するかを決定する際の重要な要素です。そのため、各デバイスの最小幅の幅を最も気にする必要があります。利用可能な画面幅wdp

例:w720dp w1024dp

リソースを使用する必要がある最小幅(dp単位)を値で定義します。システムの幅に対する対応する値は、画面の向きが横長と縦長の間で切り替わるときに、UIで使用可能な現在の実際の幅を反映して変わります。

これは、マルチペインレイアウトを使用するかどうかを判断するのに便利です。タブレットデバイスでも、縦方向にマルチペインレイアウトを使用したくない場合が多いためです。したがって、画面サイズと向きの両方の修飾子を一緒に使用する代わりに、これを使用してレイアウトに必要な最小幅を指定できます。利用可能な画面の高さのhdp

例:h720dp、h1024dpなど.

リソースを使用する最小画面高さをdp単位で指定します。これは値で定義されます。システムの対応する高さの値は、画面の向きが横と縦の間で切り替わったときに、UIで使用可能な現在の実際の高さを反映して変わります。

これを使用してレイアウトに必要な高さを定義することは、画面サイズと向きの両方の修飾子を使用する代わりに、wdpが必要な幅を定義するのと同じ方法で役立ちます。ただし、ほとんどのアプリではこの修飾子は必要ありません。UIが垂直方向にスクロールすることが多いため、使用できる高さの幅が柔軟である一方で、幅が硬いためです。

これらの修飾子を使用すると、画面サイズグループを使用するよりも複雑に見えるかもしれませんが、UIの要件を判断したら、実際にはもっと単純になるはずです。あなたがあなたのUIをデザインするとき、あなたがおそらく気にする主なことはあなたのアプリケーションがハンドセットスタイルのUIと複数のペインを使うタブレットスタイルのUIの間で切り替わる実際のサイズです。このスイッチの正確なポイントはあなたの特定のデザインに依存するでしょう - 多分あなたはあなたのタブレットレイアウトのために720dp幅を必要とします、多分600dp、または480dp、またはこれらの間のいくつかの数です。表2のこれらの修飾子を使用して、あなたはあなたのレイアウトが変わる正確なサイズを管理しています。

これらのサイズ設定修飾子についての詳細は、「提供リソース」を参照してください。設定例

いくつかのデザインをさまざまな種類のデバイス用にターゲットとするために、一般的な画面幅をいくつか示します。

320dp: a typical phone screen (240x320 ldpi, 320x480 mdpi, 480x800 hdpi, etc).
480dp: a tweener tablet like the Streak (480x800 mdpi).
600dp: a 7” tablet (600x1024 mdpi).
720dp: a 10” tablet (720x1280 mdpi, 800x1280 mdpi, etc).

表2のサイズ修飾子を使用して、アプリケーションは、幅や高さに必要な数を使用して、ハンドセットとタブレットのさまざまなレイアウトリソースを切り替えることができます。たとえば、600dpがタブレットレイアウトでサポートされている最小の幅である場合は、次の2つのレイアウトセットを指定できます。

res/layout/main_activity.xml#携帯電話用res/layout-sw600dp/main_activity.xml#タブレット用

この場合、タブレットレイアウトを適用するには、利用可能な画面スペースの最小幅が600dpである必要があります。

7インチタブレットと10インチタブレットなどのサイズを区別するためにUIをさらにカスタマイズしたい場合は、追加の最小幅レイアウトを定義できます。

res/layout/main_activity.xml#受話器用(利用可能な幅600dp以下)res/layout-sw600dp/main_activity.xml#7インチタブレット(幅600dp以上)用res/layout-sw720dp/main_activity.xml

10インチタブレット用(幅720dp以上)

前の2セットのリソース例では、デバイスの現在の向きに関係なく、画面の両側のうち最小のものを指定する「最小幅」修飾子swdpを使用しています。したがって、swdpを使用すると、画面の向きを無視してレイアウトに使用できる全体の画面サイズを簡単に指定できます。

ただし、場合によっては、レイアウトに重要となる可能性があるのは、現在使用可能な幅または高さです。たとえば、2つのフラグメントを並べた2ペインのレイアウトがある場合は、デバイスが横向きでも縦向きでも、画面の幅が少なくとも600dpになるときはいつでも使用できます。この場合、リソースは次のようになります。

res/layout/main_activity.xml#受話器用(利用可能な幅が600dp未満)res/layout-w600dp/main_activity.xml#マルチペイン(利用可能な幅が600dp以上の任意の画面)

2番目のセットは "available width"修飾子、wdpを使用していることに注意してください。このように、画面の向きに応じて、1つのデバイスが実際に両方のレイアウトを使用することがあります(利用可能な幅が一方の向きで600dp以上、もう一方の向きで600dp未満の場合)。

利用可能な高さが問題になる場合は、hdp修飾子を使用して同じことができます。あるいは、wdp修飾子とhdp修飾子を組み合わせて、本当に具体的にする必要がある場合もあります。

149
Herry

このスレッドで返信するには遅すぎると思います。しかし、私は自分の考えや方法を異なる解像度のデバイスでテキストサイズの問題を解決するために共有したいと思います。多くのAndroid開発者サイトでは、テキストサイズにsp単位を使用する必要があることを推奨しています。これは、解像度が異なるデバイスのテキストサイズを処理します。しかし、私はいつも望ましい結果を得ることができません。それで私は私が私の最後の4-5プロジェクトから使用している1つの解決策とそのうまく働いているのを見つけました。私の提案によると、あなたはそれぞれの解像度デバイスのためにテキストサイズを置かなければなりません、それは少し退屈な仕事です、しかし、それはあなたの要求を満たします。各開発者は4:6:8:12(それぞれh:xh:xxh:xxxh)のような比率について聞いている必要があります=。今すぐあなたのプロジェクト内--- resフォルダあなたはDimensファイルで4フォルダを作成する必要があります。

  1. res/values-hdpi/dimens.xml
  2. res/values-xhdpi/dimens.xml
  3. res/values-xxhdpi/dimens.xml
  4. res/values-xxxhdpi/dimens.xml

今すぐdimens.xmlファイルの中にあなたはテキストサイズを配置しなければなりません。 values-hdpiのコードを表示していますが、同様に他のresolution values/dimens.xmlファイルのコードを配置する必要があります。

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <dimen name="text_size">4px</dimen>
</resources>

他の解像度ではxhdpi:6px、xxhdpi:8px、xxxhdpi:12pxのようになります。これは私が上で書いた比率(3:4:6:8:12)で計算されます。上記の比率で他のテキストサイズの例を説明しましょう。あなたがhdpiで12pxのテキストサイズを取りたいならば、それから他の解像度でそれはそうなるでしょう

  1. hdpi:12px
  2. xhdpi:18ピクセル
  3. xxhdpi:24px
  4. xxxhdpi:36px

これは、すべての解像度に必要なテキストサイズを実装するための簡単な方法です。ここではvalues-mdpi解決策を検討していません。この解像度のテキストサイズを含めたい場合は、配給は:4:6:8:12のようになります。どんな質問でも私に知らせてください。それがあなたを助けてくれることを願っています。

14
Rahul Sharma

時々、それは3つの選択肢しかない方が良いです

 style="@Android:style/TextAppearance.Small"

通常の画面サイズと区別するために、大と小を使用してください。

<TextView
            Android:id="@+id/TextViewTopBarTitle"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            style="@Android:style/TextAppearance.Small"/>

通常は、何も指定する必要はありません。

<TextView
            Android:id="@+id/TextViewTopBarTitle"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"/>

これを使用すると、さまざまな画面サイズのテストや寸法の指定を避けることができます。

9
kalan

寸法とペイントを同じようにしました。

XML:

   <dimen name="text_size">30sp</dimen>

コード:

   Paint p =new Paint();
       p.setTextSize(getResources().getDimension(R.dimen.text_Size));
9
LifeStyle

誰もがテキストサイズをほぼすべてのデバイスの画面と互換性を持たせるための最も簡単な方法である下記のAndroidライブラリを使用することができます。それは実際には(Android 3.2で導入された)画面サイズのための新しいAndroid設定修飾子に基づいて開発されていますSmallestWidth swdp。

https://github.com/intuit/sdp

4

スクリーンサイズごとに複数のレイアウトリソースを追加することで、これをアーカイブできると思います。例:

res/layout/my_layout.xml             // layout for normal screen size ("default")
res/layout-small/my_layout.xml       // layout for small screen size with small text
res/layout-large/my_layout.xml       // layout for large screen size with larger text
res/layout-xlarge/my_layout.xml      // layout for extra large screen size with even larger text
res/layout-xlarge-land/my_layout.xml // layout for extra large in landscape orientation

参照:1 . http://developer.Android.com/guide/practices/screens_support.html

0
NguyenDat

フォントサイズを含む同じ要素サイズを表示するようにすべての画面を統一するには、次の手順に従います。 - デザイン中に適切なサイズを指定して、1つの画面サイズでUIをデザインします。

  • プログラム的に他の電話機の物理的な画面サイズ、すなわち他の電話機/スクリーンの5×2インチを計算する。

  • 2つの画面間の差異の割合を計算するために、式を使用してください。つまり、4'6と5'2の差は何%ですか。

  • 上記の式に基づいて2つのTextView間のピクセルの違いを計算します。

  • TextViewのfont-sizeの実際のサイズ(ピクセル単位)を取得し、ピクセルの差分(先ほど計算したもの)をデフォルトのfont-sizeに適用します。

このようにして、すべての画面サイズに動的縦横比を適用することができ、結果は素晴らしいです。各画面のレイアウトとサイズは同じです。

最初は少しややこしいかもしれませんが、数式を理解すれば目標を完全に達成できます。この方法では、異なる画面サイズに合わせて複数のレイアウトを作成する必要はありません。

0
SolidSnake

API 26がある場合は、autoSizeTextTypeの使用を検討できます。

<Button
  app:autoSizeTextType="uniform" />

デフォルト設定では、TextViewの自動サイズ変更は水平軸と垂直軸で均一にスケーリングできます。

https://developer.Android.com/guide/topics/ui/look-and-feel/autosizing-textview

0
Bonne Bogaert

weightSumおよびlayout_weightプロパティを使用して、異なる画面を調整することもできます。

そのためには、Android:layout_width = 0dp、およびAndroid:layout_width =(何でも)にする必要があります。

0
Harshit