テキストサイズとさまざまなAndroid画面サイズ


121

私は知っています、それはすでに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では次のようになります。

7インチWSVGA 30 sp

私は同じ結果で「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"/>


画面上では同じに見えます。視聴者のスケールが100%であることを確認してください
Dmitry Zaytsev 2012年

あなたはここから答えを見つけることができますstackoverflow.com/questions/16706076/...
Bhavesh Jethani

回答:


160

@forcelainこのGoogle IO Pdf for Designを確認する必要があると思います。そのpdfのページNo:77に移動すると、Androidのさまざまなデバイスにdimens.xmlを使用する方法の例が表示されます。以下の構造を参照してください。

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では、より個別の画面サイズのリソースを指定する新しい方法が導入されています。新しい手法は、レイアウトに必要なスペースの量( 600dpの幅)、レイアウトを一般的なサイズのグループ(largeやxlargeなど)に合わせようとするのではなく、

一般的なサイズのグループを使用するときに7インチタブレットを設計するのが難しいのは、7インチタブレットが技術的には5インチハンドセット(大グループ)と同じグループにあるためです。これらの2つのデバイスはサイズが互いに近いようですが、アプリケーションのUIのスペースの量は、ユーザー操作のスタイルと同様に大きく異なります。したがって、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

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

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

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

これは、UIで使用可能な有効サイズの離散数を定義できる、一般化された画面サイズ修飾子(小、標準、大、xlarge)の代替です。幅は多くの場合レイアウトを設計する際の原動力となるため、最小幅を使用して一般的な画面サイズを決定すると便利です。UIは垂直方向にスクロールすることがよくありますが、水平方向に必要な最小スペースにはかなり厳しい制約があります。利用可能な幅は、ハンドセットに1ペインレイアウトを使用するか、タブレットに複数ペインレイアウトを使用するかを決定する際の重要な要素でもあります。したがって、各デバイスで可能な最小の幅が何であるかを最も気にする可能性があります。利用可能な画面幅wdp

例:w720dp w1024dp

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

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

例:h720dp h1024dpなど。

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

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

これらの修飾子を使用すると、画面サイズグループを使用するよりも複雑に思えるかもしれませんが、UIの要件を決定すれば、実際はより簡単になるはずです。UIを設計するとき、おそらく重要なのは、アプリケーションがハンドセットスタイルのUIと複数のペインを使用するタブレットスタイルのUIとの間で切り替わる実際のサイズです。このスイッチの正確なポイントは、特定のデザインによって異なります。タブレットのレイアウトに720 dpの幅が必要な場合もあれば、600 dpで十分な場合もあれば、480 dpで十分な場合もあります。表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のサイズ修飾子を使用すると、アプリケーションは、幅または高さ、あるいはその両方に任意の数を使用して、ハンドセットとタブレットのさまざまなレイアウトリソースを切り替えることができます。たとえば、600 dpがタブレットレイアウトでサポートされる利用可能な最小の幅である場合、次の2つのレイアウトセットを提供できます。

res / layout / main_activity.xml#ハンドセット用res / layout-sw600dp / main_activity.xml#タブレット用

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

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

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番目のセットは「利用可能な幅」修飾子wdpを使用していることに注意してください。この方法では、画面の向きに応じて、1つのデバイスが実際に両方のレイアウトを使用する場合があります(使用可能な幅が1つの向きで少なくとも600dpで、他の向きで600dp未満の場合)。

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


7
これらのsmall / normal / large / xlargeは現在非推奨です(2014年12月)。現在は、「swxxxdp」を使用することをお勧めします。developer.android.com/guide/practices/…を
espinchi

1
@espinchiありがとうございます。これも回答として投稿してください。推奨されるdpもありますか?たとえば、標準は100sw、200sw、400sw、600swです。
Vince V.

19

このスレッドで返信するには遅すぎると思います。しかし、異なる解像度のデバイスでテキストサイズの問題を解決するための私のアイデアまたは方法を共有したいと思います。多くの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のコードを示しています。同様に、他の解像度の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:18px
  3. xxhdpi:24px
  4. xxxhdpi:36px

これは、すべての解像度に必要なテキストサイズを実装する簡単なソリューションです。ここでは、values-mdpi解決デバイスについては考慮していません。この解像度のテキストサイズを含める場合は、比率は3:4:6:8:12のようになります。どんな質問でも私に知らせてください。それがあなたの人々を助けることを願っています。


4
テキストサイズにspではなくpxを使用するのは悪い習慣ではありませんか?pxの代わりにspを使用して次の比率を達成する方法はありますか?
Red M

私はこれがうまく機能していることを確認しましたが、それでも混乱しています。dp/ spの代わりにpxで値を使用するのは良い習慣ですか?私は公式のドキュメントからpxで値を使用することを見たことはありません。
shaby

1
フォントサイズにはspを使用します。これが法律です。Rahulが示したアプローチは正しく、pxの代わりにspを使用するだけです。
Mihir Patel

アプリのフォントサイズとシステムのフォントサイズをリンクする場合は、spを使用する必要があります。それ以外の場合、この解決策は悪くありません。
Irfan Ul Haq

12

時々、それは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"/>

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


10

私は同じことを次元で行い、次のようなものを描きました(dpを使用して、テキストとdrawText()のみ)

XML:

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

コード:

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

8
dpテキストサイズには使用しないでください... sp代わりに使用してください。
Yousha Aleayoub 2016

テキストサイズにはspを使用してください
Thinsky

ユーザー設定に基づいてサイズを変更したくない特定の状況では、dpを使用できます。

7

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

https://github.com/intuit/sdp


2
sdpは画面サイズ用です。使用SSPテキストサイズについて
ecle

これは私にとってはうまくいきますが、追加するファイルが多すぎると思われます。これにより、アプリのサイズが大きくなります。@ Muhammadサイズを変更して必要なクラスだけを追加できます
Kirtikumar A.

1

API 26がある場合は、autoSizeTextTypeの使用を検討してください。

<Button
  app:autoSizeTextType="uniform" />

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

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


これの問題は、異なる長さの文字列を持つ複数のテキストビューのテキストサイズが均一に変更されないことです
Sourabh S Nath

0

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

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


2
res / values-smallを使用することをお勧めします。
einverne

1
悪い実装の1つ。異なるサイズをサポートするためだけに5つのレイアウトを維持する必要がありますか?
SolidSnake

さまざまな画面でテキストサイズを縮小するためだけに異なるレイアウトを作成することは、非常に悪い考えです。お勧めしません
Saman Salehi

0

フォントサイズを含む同じ要素サイズを表示するようにすべての画面を統合するには:-UIを1つの画面サイズで設計中に適切なサイズで設計します。つまり、TextViewフォントサイズはデフォルトの画面サイズで4d6で14dpです。

  • 他の電話の物理的な画面サイズ、つまり他の電話/画面の5'2インチをプログラムで計算します。

  • 式を使用して、2つの画面間のパーセンテージの差を計算します。つまり、4'6と5'2の間の%差は何ですか。

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

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

この方法で、すべての画面サイズに動的アスペクト比を適用でき、結果は素晴らしいです。各画面で同じレイアウトとサイズになります。

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


0

プロパティを使用weightSumしてlayout_weight、別の画面を調整することもできます。

そのためには、android:layout_width= 0dp、およびandroid:layout_width=(必要なもの)を作成する必要があります。



-2

サイズをハードコードしないでください。

柔軟性と新しい画面解像度の場合-ダミーのTextViewをレイアウトに配置して、textSizeを取得することをお勧めします。

<TextView
        android:id="@+id/dummyTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="gone"
        android:text="TextView" />

そしてあなたのコードで例えば:

TextView testTextView = (TextView) rootView.findViewById(R.id.dummyTextView);
float textSize = testTextView.getTextSize();

textSize(計算によって)定数またはパーチェテージのサイズを追加できる参照として保持します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.