【问题标题】:Text size and different android screen sizes文字大小和不同的安卓屏幕大小
【发布时间】:2012-04-10 07:12:12
【问题描述】:

我知道,已经讨论了 1000 次,但我无法针对不同的屏幕尺寸调整文本大小。我尝试在我的自定义样式中使用“sp”作为尺寸单位:

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

在 2.7 QVGA 中看起来还可以:

但在 7in WSVGA 中它看起来像这样:

我尝试同时使用“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"/>

【问题讨论】:

标签: android screen-size text-size


【解决方案1】:

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

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

就是这样。

【讨论】:

    【解决方案2】:

    如果您有 API 26,那么您可以考虑使用 autoSizeTextType

    <Button
      app:autoSizeTextType="uniform" />
    

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

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

    【讨论】:

    • 这样做的问题是它不会统一改变具有不同长度字符串的多个文本视图的文本大小
    【解决方案3】:

    您还可以使用weightSumlayout_weight 属性来调整您的不同屏幕。

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

    【讨论】:

      【解决方案4】:

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

      https://github.com/intuit/sdp

      【讨论】:

      • sdp 用于屏幕尺寸;使用ssp 设置文本大小
      • 这对我有用,但我怀疑要添加的文件太多,这会增加应用程序的大小,@Muhammad 你可以调整大小并只添加任何需要的类
      • 看起来这个库不再维护了。
      【解决方案5】:

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

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

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

      • 根据以上公式计算2个TextView的像素差。

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

      通过这种方式,您可以将动态纵横比应用于所有屏幕尺寸,效果非常好。您将在每个屏幕上拥有相同的布局和大小。

      一开始可能有点棘手,但一旦你弄清楚了公式,就完全实现了目标。使用这种方法,您无需为了适应不同的屏幕尺寸而制作多种布局。

      【讨论】:

      • 我不建议这样做,以英寸为单位的屏幕尺寸计算非常不可靠。
      • @Zui0per - 我已经在我的应用程序中实现了这种方法,它在所有屏幕尺寸下看起来都不错。基本上所有屏幕上都有相同大小的 UI 元素,除非您不希望这样,那么您应该为不同的屏幕使用不同的布局。
      • 我试过了,文字大小的计算不能正常工作。 (codepile.net/pile/AX46avDn) 也许你可以快速浏览一下? :) 但是,以英寸为单位的屏幕尺寸的计算非常不可靠。有时,由于 xdpi 和 ydpi 不一致,我会在某些设备上得到奇怪的值。此外,如果用户改变他的设备分辨率,文本大小也会改变。
      • @Zui0per - 您可以在编写公式时始终将其考虑在内。总会有更好的方法来增强这种方法,并且总会有需要考虑的极端情况。我基本上说它是为了让您了解如何开始
      【解决方案6】:

      我按尺寸做了同样的事情并绘制了类似的东西(使用 dp,但仅用于文本和 drawText())

      XML:

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

      代码:

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

      【讨论】:

      • 您不应该使用dp 来表示文本大小...改用sp
      • 文字大小请使用sp
      • 您可以在不希望根据用户偏好调整大小的特定情况下使用 dp。
      【解决方案7】:

      我认为在此线程上回复为时已晚。但我想分享我的想法或方法来解决不同分辨率设备上的文本大小问题。许多 android 开发者网站建议我们必须使用 sp 单位作为文本大小,这将处理不同分辨率设备的文本大小。但我总是无法得到想要的结果。因此,我从最近的 4-5 个项目中找到了一个我正在使用的解决方案,并且工作正常。根据我的建议,您必须为每个分辨率设备放置文本大小,这有点繁琐,但它会满足您的要求。每个开发者都必须听听像4:6:8:12(分别为h:xh:xxh:xxxh)这样的比例。现在在您的项目 res 文件夹中,您必须创建 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 的代码,同样您必须为其他分辨率值/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 : 24 像素
      4. xxxhdpi : 36px

      这是为所有分辨率实现所需文本大小的简单解决方案。我在这里不考虑 values-mdpi 分辨率设备。如果有人想包含此分辨率的文本大小,那么配给就像 3:4:6:8:12。如有任何疑问,请告诉我。希望对大家有所帮助。

      【讨论】:

      • 在文本大小中使用 px 而不是 sp 不是不好的做法吗?有没有办法使用 sp 而不是 px 来实现以下比率?
      • 我检查过它工作正常,但我仍然很困惑在 px 中使用值而不是 dp/sp 是一种好习惯吗?我从未在官方文档中看到过在 px 中使用值。
      • 使用 sp 作为字体大小,这是规律。 Rahul 展示的方法是正确的,只需使用 sp 而不是 px。
      • 如果打算将应用字体大小与系统字体大小联系起来,应该使用sp。否则这个解决方案还不错。
      • @Rahul Sharma,我使用 sp 而不是 px 并使用了您提到的比率,它们工作正常,谢谢!
      【解决方案8】:

      @forcelain 我认为您需要检查此Google IO Pdf for Design。在该 pdf 中转到第 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
      

      例如,您在下面的 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 英寸平板电脑——Android 3.2 引入了一种新的方式来指定 更多离散屏幕尺寸的资源。新技术基于 关于您的布局需要的空间量(例如 600dp 的宽度), 而不是试图使您的布局适合通用尺寸组 (例如 large 或 xlarge)。

      为 7 英寸平板电脑设计的原因是使用 通用尺寸组是 7" 平板电脑在技术上是相同的 分组为 5" 手机(大组)。虽然这两个设备是 看似大小相近,一个空间的大小 应用程序的 UI 明显不同,用户的风格也是如此 相互作用。因此,7" 和 5" 屏幕不应该总是使用相同的 布局。使您可以为不同的布局提供 这两种屏幕,Android 现在允许您指定您的 基于实际宽度和/或高度的布局资源 可用于您的应用程序布局,以 dp 为单位指定。

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

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

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

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

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

      表 2. 屏幕尺寸的新配置限定符(在 安卓 3.2)。屏幕配置 限定符值 说明 最小宽度swdp

      示例:sw600dp sw720dp

      屏幕的基本尺寸,由最短的 可用屏幕区域的尺寸。具体来说,该设备的 minimumWidth 是屏幕可用高度中最短的,并且 宽度(您也可以将其视为“可能的最小宽度” 屏幕)。您可以使用此限定符来确保,无论 屏幕的当前方向,您的应用程序至少有 其 UI 可用的宽度 dps。

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

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

      这是通用屏幕尺寸限定符的替代方案 (small, normal, large, xlarge) 允许您定义一个离散的 可用于您的 UI 的有效大小的数字。使用 minimumWidth 确定一般屏幕尺寸很有用,因为 宽度通常是设计布局的驱动因素。一个 UI 将 经常垂直滚动,但对 它水平所需的最小空间。可用宽度也是 决定是否使用单窗格布局的关键因素 手机或平板电脑的多窗格布局。因此,您可能最关心 关于每个设备上的最小可能宽度。 可用屏幕宽度 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 是 您的平板电脑布局支持的最小可用宽度,您可以 提供这两组布局:

      res/layout/main_activity.xml # 用于手机 res/layout-sw600dp/main_activity.xml # 对于平板电脑

      在这种情况下,可用屏幕空间的最小宽度必须是 600dp 以便应用平板电脑布局。

      对于您希望进一步自定义用户界面的其他情况 区分大小,例如 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 宽和更大)

      请注意,前两组示例资源使用 “最小宽度”限定符,swdp,它指定最小宽度 屏幕的两侧,与设备的当前电流无关 方向。因此,使用 swdp 是指定 通过忽略屏幕的整体屏幕尺寸可用于您的布局 方向。

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

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

      请注意,第二组使用“可用宽度”限定符, wdp。这样,一台设备实际上可能会同时使用两种布局,具体取决于 在屏幕的方向上(如果可用宽度至少为 一个方向 600dp,另一个方向小于 600dp 方向)。

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

      【讨论】:

      • 这些 small/normal/large/xlarge 目前已被弃用(2014 年 12 月)。现在首选的方法是使用“swxxxdp”。见developer.android.com/guide/practices/…
      • @espinchi 谢谢你,你也应该发布这个作为答案。还有推荐的dp吗?例如标准是:100sw、200sw、400sw、600sw。
      【解决方案9】:

      正如@espinchi 在 3.2(API 级别 13)中提到的那样,大小组已被弃用。 Screen size ranges 是未来最受欢迎的方法。

      【讨论】:

        【解决方案10】:

        有时,最好只有三个选项

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

        使用 small 和 large 来区分正常的屏幕尺寸。

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

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

        【讨论】:

          【解决方案11】:

          不要对尺寸进行硬编码。

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

          【讨论】:

            【解决方案12】:

            我认为您可以通过为每个屏幕尺寸添加多个布局资源来存档,例如:

            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

            【讨论】:

            • 使用 res/values-small 可能会更好。
            • 最糟糕的实现之一。我们必须维护 5 种布局才能支持不同的尺寸?
            • 创建不同的布局来减少变体屏幕中的文本大小确实是个坏主意。我不建议这样做
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-08-12
            • 2023-03-22
            • 2021-06-05
            • 1970-01-01
            相关资源
            最近更新 更多