129

すでに1000回議論されていますが、画面サイズごとにテキストサイズを調整することはできません。カスタムスタイルのサイズ単位として「sp」を使用しようとしています。

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

2.7 QVGAでは、問題ないように見えます。

2.7QVGA 30sp

しかし、7インチWSVGAでは次のようになります。

7インチWSVGA30sp

'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"/>

4

12 に答える 12

170

@forcelainこのGoogleIOPdfforDesignを確認する必要があると思います。その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以降非推奨になり、次のようになりました。

Android3.2用のタブレットレイアウトの宣言

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

一般化されたサイズのグループを使用するときに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で導入)。画面構成修飾子の値説明smallestWidthswdp

例:sw600dp sw720dp

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

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

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

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

例:w720dp w1024dp

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

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

例:h720dph1024dpなど。

リソースが使用される最小画面高さを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にする必要があります。

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セットのサンプルリソースは、デバイスの現在の向きに関係なく、画面の2つの側面のうち最小のものを指定する「最小幅」修飾子swdpを使用していることに注意してください。したがって、swdpを使用すると、画面の向きを無視して、レイアウトに使用できる全体的な画面サイズを簡単に指定できます。

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

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

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

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

于 2012-03-27T05:07:02.560 に答える
24

このスレッドに返信するには遅すぎると思います。しかし、私は、差分解像度デバイスでのテキストサイズの問題を解決するための私のアイデアまたは方法を共有したいと思います。多くの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

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

于 2017-09-11T16:13:07.620 に答える
15

場合によっては、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"/>

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

于 2015-01-21T09:06:31.103 に答える
10

私は次元で同じことをし、次のようなものをペイントしました(dpを使用しますが、テキストとdrawText()のみ)

XML:

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

コード:

   Paint p =new Paint();
       p.setTextSize(getResources().getDimension(R.dimen.text_Size));
于 2012-03-26T20:27:31.273 に答える
9

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

https://github.com/intuit/sdp

于 2018-05-22T01:09:20.573 に答える
2

私はそれが遅いことを知っていますが、これは誰かを助けるかもしれません...

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:autoSizeTextType="uniform"
        android:gravity="center_horizontal|bottom"
        android:text="Your text goes here!"
        android:layout_centerInParent="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHeight_percent="0.05"
        app:layout_constraintHorizontal_bias="0.50"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.50"
        app:layout_constraintWidth_percent="0.50" />
</androidx.constraintlayout.widget.ConstraintLayout>

また、テキストサイズを調整したい場合は、変更してみてください

app:layout_constraintWidth_percent="0.50" 
app:layout_constraintHeight_percent="0.05"

それで全部です。

于 2020-12-08T16:54:00.630 に答える
1

すべての画面を統合して、フォントサイズを含む同じ要素サイズを表示するには:-デザイン中に適切と思われるサイズでUIを1つの画面サイズでデザインします。つまり、TextViewフォントサイズはデフォルトの画面サイズで14dp、4'6インチです。

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

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

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

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

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

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

于 2018-04-20T20:30:38.183 に答える
1

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

<Button
  app:autoSizeTextType="uniform" />

デフォルト設定では、TextViewの自動サイズ設定が水平軸と垂直軸で均一に拡大縮小されます。

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

于 2019-08-07T10:40:05.357 に答える
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

于 2012-03-27T04:40:22.060 に答える
0

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

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

于 2019-07-08T07:49:47.163 に答える
-1

@espinchiが3.2(APIレベル13)で述べたように、サイズグループは非推奨になりました。 画面サイズの範囲は、今後推奨されるアプローチです。

于 2015-08-16T12:31:04.760 に答える
-3

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

柔軟性と新しい画面解像度のために-ベストプラクティスは、ダミーの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(計算によって)一定またはパーセテージサイズを追加できる参照として保持します。

于 2013-08-06T10:19:20.733 に答える