文字大小和不同的Android屏幕尺寸

时间:2012-03-26 18:52:24

标签: android screen-size text-size

我知道,已经讨论了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

我试图同时使用&#39; sp&#39;和&#39; dp&#39;结果相同。

您能解释一下如何在任何屏幕上使这些按钮看起来一样吗?

完整的自定义按钮样式

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

11 个答案:

答案 0 :(得分:147)

@forcelain我认为您需要检查Google IO Pdf for Design。在那个pdf转到第No:77页,你将在其中找到如何建议使用dimens.xml为android的不同设备示例请参见下面的结构:

res/values/dimens.xml

res/values-small/dimens.xml

res/values-normal/dimens.xml

res/values-large/dimens.xml

res/values-xlarge/dimens.xml

例如,您在values中使用了以下的dimens.xml。

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

在其他值文件夹中,您需要更改文字大小的值。

注意:正如@espinchi所指出的那样,自Android 3.2以来,不推荐使用small,normal,large和xlarge以支持以下内容:

Declaring Tablet Layouts for Android 3.2

  

适用于运行Android 3.0的第一代平板电脑   声明平板电脑布局的方法是将它们放在一个目录中   xlarge配置限定符(例如,res / layout-xlarge /)。在   以适应其他类型的平板电脑和屏幕尺寸   特别是7&#34;平板电脑-Android 3.2引入了一种新的指定方式   更多离散屏幕尺寸的资源。新技术的基础   在您的布局需要的空间量(例如600dp的宽度),   而不是试图使您的布局适合广义大小组   (例如大或xlarge)。

     

设计7&#34;使用时,平板电脑很棘手   广义大小群是一个7&#34;平板电脑在技术上是一样的   小组作为5&#34;手机(大集团)。虽然这两个设备是   看似彼此接近的大小,空间的大小   应用程序的UI与用户的风格明显不同   相互作用。因此,7&#34;和5&#34;屏幕不应该总是使用相同的   布局。使您可以为其提供不同的布局   这两种屏幕,Android现在允许您指定您的   基于实际宽度和/或高度的布局资源   可用于您的应用程序布局,以dp单位指定。

     

例如,在您设计了要用于的布局之后   平板电脑风格的设备,您可能会确定布局停止   屏幕宽度小于600dp时工作正常。这个门槛   因此成为平板电脑布局所需的最小尺寸。   因此,您现在可以指定这些布局资源   仅当有至少600dp的宽度可供您使用时使用   应用程序的用户界面。

     

你应该选择宽度并将其设计为最小尺寸,   或测试一旦布局支持的最小宽度是多少   完整。

     

注意:请记住,这些新尺寸API使用的所有数字都是   密度无关像素(dp)值和布局尺寸   也应始终使用dp单位定义,因为你关心的是什么   about是系统后可用的屏幕空间量   占屏幕密度(与使用原始像素相反)   解析度)。有关与密度无关的像素的更多信息,   阅读本文档前面的术语和概念。使用新的尺寸   限定符

     

您可以基于的指定的不同资源配置   表2总结了可用于布局的空间   新的限定符可让您更好地控制特定的屏幕尺寸   与传统的屏幕尺寸相比,您的应用程序支持   组(小,普通,大和xlarge)。

     

注意:使用这些限定符指定的大小不是   实际屏幕尺寸。相反,尺寸是宽度或高度   您的活动窗口可用的dp单位。 Android   系统可能会将某些屏幕用于系统UI(例如系统)   屏幕底部的栏或顶部的状态栏),所以有些   屏幕可能无法用于您的布局。因此,尺寸   你声明应该具体说明你需要的尺寸   activity - 系统占用系统UI使用的任何空间   声明它为您的布局提供了多少空间。还要注意这一点   操作栏被视为应用程序窗口的一部分   空间,虽然你的布局没有声明它,所以它减少了   可用于您的布局的空间,您必须在您的布局中考虑它   设计。

     

表2.屏幕尺寸的新配置限定符(在   Android 3.2)。屏幕配置限定符值说明   smallestWidth swdp

     

示例:sw600dp sw720dp

     

屏幕的基本尺寸,如最短的指示   可用屏幕区域的尺寸。具体来说,就是设备   smallestWidth是屏幕可用高度和最短的   宽度(您也可以将其视为&#34;最小可能宽度&#34; for   屏幕)。您可以使用此限定符来确保无论如何   屏幕的当前方向,您的应用程序至少有   宽度的dps可用于其UI。

     

例如,如果您的布局要求其最小尺寸为   屏幕区域始终至少600 dp,然后你可以使用它   限定符来创建布局资源res / layout-sw600dp /。该   系统将仅在最小维度时使用这些资源   可用屏幕至少600dp,无论是否600dp   side是用户感知的高度或宽度。最小宽度是a   固定屏幕尺寸特征的设备;设备的   当屏幕方向改变时,smallestWidth不会改变。

     

设备的最小宽度考虑了屏幕装饰   和系统UI。例如,如果设备具有一些持久性UI   屏幕上的元素占据了轴的空间   smallestWidth,系统声明最小宽度更小   比实际的屏幕尺寸,因为那些屏幕像素不是   适用于您的用户界面。

     

这是广义屏幕尺寸限定符的替代方法   (小,正常,大,xlarge),允许您定义离散   可用于UI的有效大小的数字。运用   tinyWidth确定一般的屏幕大小是有用的,因为   宽度通常是设计布局的驱动因素。用户界面会   经常垂直滚动,但有相当严格的约束   它需要水平的最小空间。可用的宽度也是   决定是否使用单窗格布局的关键因素   平板电脑的手机或多窗格布局。因此,您可能最关心   关于每个设备上可能的最小宽度。   可用的屏幕宽度wdp

     

示例:w720dp w1024dp

     

以dp为单位指定资源的最小可用宽度   应该使用 - 由值定义。系统对应   当屏幕方向切换时,宽度值会发生变化   在横向和纵向之间反映当前的实际宽度   这可用于您的用户界面。

     

这通常有助于确定是否使用多窗格布局,   因为即使在平板电脑设备上,你也经常不会想要同样的东西   用于纵向的多窗格布局,与横向一样。   因此,您可以使用它来指定所需的最小宽度   布局,而不是同时使用屏幕尺寸和方向   资格赛一起。可用屏幕高度hdp

     

示例:h720dp h1024dp等

     

以dp为单位指定资源的最小屏幕高度   应该使用 - 由值定义。系统对应   屏幕方向切换时,高度值会发生变化   在横向和纵向之间反映当前的实际高度   这可用于您的用户界面。

     

使用它来定义布局所需的高度非常有用   与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是   您可以使用平板电脑布局支持的最小可用宽度   提供这两组布局:

     

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#For 7“   平板电脑(600dp宽大)res / layout-sw720dp / main_activity.xml

     

对于10“片剂(720dp宽和更大)

     

请注意前两组示例资源使用   &#34;最小宽度&#34;限定符,swdp,指定最小的   屏幕的两面,无论设备的电流如何   取向。因此,使用swdp是一种指定的简单方法   通过忽略屏幕,可以为您的布局提供整体屏幕尺寸   取向。

     

但是,在某些情况下,对您的布局可能很重要的是   确切地说当前有多少宽度或高度。例如,   如果你有一个双窗格布局,两个片段并排,你   可能想要在屏幕提供至少600dp时使用它   宽度,设备是横向还是纵向。在   在这种情况下,您的资源可能如下所示:

     

res / layout / main_activity.xml#适用于手机(小于   600dp可用宽度)res / layout-w600dp / main_activity.xml#   多窗格(任何宽度为600dp或更长的屏幕)

     

请注意,第二组使用&#34;可用宽度&#34;预选赛,   WDP。这样,一个设备实际上可以使用两种布局,具体取决于   在屏幕方向上(如果可用宽度至少为   一个方向600dp,另一个方向小于600dp   取向)。

     

如果您可以考虑可用的高度,那么您也可以这样做   使用hdp限定符。或者,甚至结合使用wdp和hdp   限定词,如果你需要非常具体。

答案 1 :(得分:14)

我认为在这个帖子上回复为时已晚。但我想分享我的想法或方法来解决差异分辨率设备上的文本大小问题。许多Android开发者网站建议我们必须使用 sp 单位来处理文本大小,这将处理差异分辨率设备的文本大小。但我总是无法得到理想的结果。所以我找到了一个解决方案,我在过去的4-5个项目中使用它并且工作正常。根据我的建议,你必须为每个分辨率设备放置文本大小,这是一项繁琐的工作,但它将满足你的要求。每个开发人员都必须听取比例,如 4:6:8:12(分别为h:xh:xxh:xxxh) 。现在,在项目 res 文件夹中,您必须创建具有尺寸文件的4个文件夹,例如

  1. RES /值-HDPI / dimens.xml
  2. RES /值-xhdpi / dimens.xml
  3. RES /值-xxhdpi / dimens.xml
  4. RES /值-xxxhdpi / dimens.xml
  5. 现在在dimens.xml文件中,您必须放置文本大小。我正在向您展示 values-hdpi 的代码,类似地,您必须为其他分辨率值/ 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
    5. 这是为所有分辨率实现所需文本大小的简单解决方案。我在这里不考虑 values-mdpi 分辨率设备。如果任何人想要包含此分辨率的文字大小,那么定量就像 3:4:6:8:12 。如有任何疑问,请告诉我。希望它会帮助你们。

答案 2 :(得分:9)

我通过维度做了同样的事情并绘制了类似的内容(使用dp,但仅用于文本和drawText())

XML:

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

代码:

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

答案 3 :(得分:8)

有时,最好只有三个选项

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

使用此功能,您可以避免测试和指定不同屏幕尺寸的尺寸。

答案 4 :(得分:4)

每个人都可以使用下面提到的android库,这是使文本大小与几乎所有设备屏幕兼容的最简单方法。它实际上是基于屏幕大小的新Android配置限定符(在Android 3.2中引入)SmallestWidth swdp开发的。

https://github.com/intuit/sdp

答案 5 :(得分:1)

如果您拥有API 26,则可以考虑使用 autoSizeTextType

<Button
  app:autoSizeTextType="uniform" />

默认设置可让TextView的自动大小调整在水平和垂直轴上均匀缩放。

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

答案 6 :(得分: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

答案 7 :(得分:0)

统一所有屏幕以显示相同的元素大小,包括字体大小: - 在一个屏幕尺寸上设计UI,使用您在设计中找到的任何尺寸,即TextView字体大小为14dp,默认屏幕尺寸为4'6英寸。

  • 以编程方式计算其他手机的物理屏幕尺寸,即5英寸2英寸的其他手机/屏幕。

  • 使用公式计算2个屏幕之间的百分比差异。即4'6和5'2之间的差异是什么。

  • 根据上述公式计算2个TextView之间的像素差异。

  • 获取TextView字体大小的实际大小(以像素为单位),并将像素差异(您之前计算的)应用于默认字体大小。

通过这种方式,您可以将动态宽高比应用于所有屏幕尺寸,结果非常棒。每个屏幕上的布局和大小都相同。

起初可能有点棘手但是一旦你计算出公式就完全达到了目标。使用此方法,您无需为了适应不同的屏幕尺寸而制作多个布局。

答案 8 :(得分:0)

您还可以使用weightSumlayout_weight属性来调整其他屏幕。

为此,您必须使android:layout_width = 0dp, 和android:layout_width =(随便什么);

答案 9 :(得分:0)

我知道已经晚了,但这可能会帮助某人...

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

仅此而已。

答案 10 :(得分:-1)

不要硬编码尺寸。

为了灵活性和新的屏幕分辨率 - 最佳做法是将虚拟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作为参考,您可以添加常量或感知大小(通过计算)。