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


121

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

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

在2.7 QVGA中看起来不错:

2.7QVGA 30分

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

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


在您的屏幕上,它们看起来一样。确保您的观众比例为100%
Dmitry Zaytsev 2012年

Answers:


160

@forcelain我认为您需要检查此Google IO Pdf for Design。在该pdf中,转到第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所示,自Android 3.2起不推荐使用small,normal,large和xlarge,而推荐使用以下内容:

声明Android 3.2的平板电脑布局

对于运行Android 3.0的第一代平板电脑,声明平板电脑布局的正确方法是将它们放置在带有xlarge配置限定符的目录中(例如res / layout-xlarge /)。为了适应其他类型的平板电脑和屏幕尺寸(特别是7英寸平板电脑),Android 3.2引入了一种新的方式来指定用于更大屏幕尺寸的资源。这项新技术基于您布局所需的空间量(例如宽度为600dp),而不是尝试使布局适合广义尺寸组(例如大号或xlarge号)。

在使用通用尺寸组时,为7“平板电脑设计的原因很棘手,因为技术上7”平板电脑与5“手机在同一组中(较大的一组)。这两个设备的尺寸似乎彼此接近,应用程序UI的空间量和用户交互方式也将有很大不同。因此7“和5”屏幕不应始终使用相同的布局。因此,您可以为这些屏幕提供不同的布局两种屏幕,Android现在允许您基于应用布局实际可用的宽度和/或高度(以dp单位指定)来指定布局资源。

例如,设计好要用于平板电脑式设备的布局后,可以确定当屏幕宽度小于600dp时,该布局不能正常工作。因此,此阈值成为平板电脑布局所需的最小尺寸。这样,您现在可以指定仅当应用程序的UI至少有600dp的可用宽度时才应使用这些布局资源。

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

注意:请记住,这些新尺寸的API使用的所有图形都是与密度无关的像素(dp)值,并且布局尺寸也应始终使用dp单位进行定义,因为您关心的是系统之后可用的屏幕空间量考虑到屏幕密度(与使用原始像素分辨率相反)。有关与密度无关的像素的更多信息,请阅读本文档前面的术语和概念。使用新的大小限定符

表2总结了可根据布局可用空间指定的不同资源配置。与传统的屏幕尺寸组(小,常规,大和xlarge)。

注意:使用这些限定符指定的尺寸不是实际的屏幕尺寸。相反,大小是针对活动窗口可用的dp单位的宽度或高度。Android系统可能会将某些屏幕用于系统UI(例如,屏幕底部的系统栏或顶部的状态栏),因此某些屏幕可能不适用于您的布局。因此,您声明的大小应该特别适合您的活动所需的大小-系统在声明为布局提供多少空间时会考虑系统UI使用的任何空间。还请注意,尽管布局未声明操作栏,但它仍被视为应用程序窗口空间的一部分,因此它会减小布局可用的空间,因此必须在设计中加以考虑。

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

示例:sw600dp sw720dp

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

例如,如果您的布局始终要求其最小的屏幕区域尺寸至少为600 dp,则可以使用此限定符来创建布局资源res / layout-sw600dp /。仅当可用屏幕的最小尺寸至少为600dp时,系统才会使用这些资源,而不管600dp的边是用户感知的高度还是宽度。minimumWidth是设备的固定屏幕尺寸特征;屏幕方向改变时,设备的smallestWidth不变。

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

这是通用屏幕尺寸限定符(小,标准,大,xlarge)的替代方法,它使您可以为UI可用的有效尺寸定义一个离散数字。由于最小宽度通常是设计版面设计的驱动因素,因此使用最小宽度确定总体屏幕尺寸非常有用。UI通常会垂直滚动,但对水平所需的最小空间有严格的限制。可用宽度也是决定是在手机上使用单窗格布局还是在平板电脑上使用多窗格布局的关键因素。因此,您可能最在意每个设备上的最小最小宽度。可用屏幕宽度wdp

示例:w720dp w1024dp

以dp单位指定应使用资源的最小可用宽度(由值定义)。当屏幕的方向在横向和纵向之间切换以反映用户界面可用的当前实际宽度时,系统相应的宽度值就会更改。

这对于确定是否使用多窗格布局通常很有用,因为即使在平板电脑设备上,您通常也不希望像横向那样使用相同的多窗格布局进行纵向放置。因此,您可以使用它来指定布局所需的最小宽度,而不是同时使用屏幕尺寸和方向限定符。可用屏幕高度hdp

例如:h720dp,h1024dp等。

以dp单位指定应该使用资源的最小屏幕高度(由值定义)。当屏幕的方向在横向和纵向之间切换以反映用户界面可用的当前实际高度时,系统相应的高度值就会更改。

使用wdp定义布局所需的高度与使用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#对于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限定词。


7
目前(2014年12月)不推荐使用这些small / normal / large / xlarge。现在首选的方法是使用“ swxxxdp”。见developer.android.com/guide/practices/...
espinchi

1
@espinchi谢谢,您也应该将其发布为答案。还有推荐的dp吗?例如,标准为:100sw,200sw,400sw,600sw。
文斯五世

19

我认为现在就此话题回复为时已晚。但我想分享我的想法或方法来解决差异分辨率设备上的文本大小问题。许多android开发人员网站建议我们必须使用sp单位来显示文本大小,这将处理差异分辨率设备的文本大小。但是我总是无法获得理想的结果。因此,我在最近的4-5个项目中找到了我正在使用的一种解决方案,并且该解决方案运行良好。根据我的建议,您必须为每个分辨率设备放置文本大小,这虽然有点繁琐,但可以满足您的要求。每个开发人员必须聆听4:6:8:12之类的比例(分别为h:xh:xxh:xxxh)。现在在您的项目res文件夹中,您必须创建4个带有dimens文件的文件夹,例如

  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:18像素
  3. xxhdpi:24px
  4. xxxhdpi:36像素

这是实现所有分辨率所需的文本大小的简单解决方案。我不在这里考虑值-mdpi分辨率设备。如果有人想为此分辨率添加文本大小,则比例就像3:4:6:8:12。如有任何疑问,请通知我。希望它能帮助您。


4
在文本大小中使用px而不是sp不是不好的做法吗?有没有办法使用sp而不是px来达到以下比率?
Red M

我检查了它是否工作正常,但我仍然感到困惑,在px中使用值而不是dp / sp是一种好习惯吗?我从未在官方文档中见过使用px中的值的地方。
shaby

1
使用sp表示字体大小,这就是法律。Rahul显示的方法是正确的,只需使用sp而不是px。
米希尔·帕特尔

如果计划将应用程序字体大小与系统字体大小链接起来,则应使用sp。否则此解决方案还不错。
Irfan Ul Haq

12

有时候,最好只有三个选择

 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'9

请使用sp作为文字大小
Thinsky '16

当您不希望根据用户偏好调整dp的大小时,可以在特定情况下使用dp。

7

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

https://github.com/intuit/sdp


2
sdp用于屏幕尺寸;使用ssp来显示文字大小
ecle

这对我有用,但我怀疑要添加的文件太多,这会增加应用程序的大小,@ Muhammad您可以调整大小并仅添加任何需要的类
Kirtikumar A.19 / 10/21


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
较差的实现之一。我们必须维持5种布局以仅支持不同的尺寸?
SolidSnake

创建不同的布局以仅减小变体屏幕中的文本大小确实不是一个好主意。我不建议您
萨曼·萨利

0

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

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

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

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

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

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

一开始可能会有些棘手,但是一旦您弄清楚了公式,就可以完全实现目标。使用这种方法,您不必为了适应不同的屏幕尺寸而进行多种布局。


0

您还可以使用weightSumlayout_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作为参考,您可以添加常量或percetage大小(通过计算)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.