Android sp和dp文本-什么会调整“比例”,以及支持的哲学是什么?

28

我们知道在Android中,对于文本我们应该使用sp而不是dp,原因是尊重“用户的偏好”。但是到底这些偏好是什么呢?用户如何更改这个设置?

我在手机的设置中没有找到任何相关的参考资料(我本来以为会在“无障碍”或“显示”中找到)。那么用户设置是什么?只能通过诸如“大字体”之类的应用程序进行设置吗?

假设它是通过像大字体这样的应用程序进行设置的,我已经将Google文档和一些其他谷歌应用程序的字体设置为130%。虽然大多数布局都不错,但有些内容被裁剪了,无法阅读(这是在一个大屏幕SGS2上)。因此,使用“sp”开发具有文本大小的应用程序的方法是什么?我们是确保其在100%缩放下工作并忽略其他设置——将其称为用户可以担心的特殊情况,还是我们要竭尽全力确保内容可以扩展或者滚动,以防文本溢出?

有一种观点是我们应该使用“dp”,以确保用户有机会看到文本(即使他们需要使用放大镜)。

有什么想法或评论吗?

3个回答

62

在某些Android设备上(取决于制造商),它将出现在设置菜单中。此外,某些辅助功能选项(依赖于设备)还可以更改它。

一般而言,尤其是对于大量文本,您应始终使用无关缩放比例的像素。

但是,如果您的文本必须适合已知大小的边界框,则应使用密度无关像素来确保文本始终适合并且所有字符可见,无论用户的设置如何。

简而言之:将文本大小增加约5sp是否导致文本不可读或损坏您的用户界面?如果是,请使用密度无关像素。如果不是,请使用无关缩放比例的像素。然而,您通常应该尽可能使用无关缩放比例的像素,这意味着设计可以容纳不同文本大小的用户界面。


谢谢您的回复,这是一个不错的经验法则。我想知道是否可以在ADT布局查看器中快速设置它...实际上,在我的SGS2上并没有ICS,所以我猜制造商仍然可以将其省略。 - Sam
谢谢提供这个信息,我会更新我的答案以反映这个选项并不适用于所有ICS设备。 - Joseph Earl
1
这是我见过的关于何时使用dp或sp的最好解释。我一直听说应该始终使用sp来显示文本,但实际上有些情况下这并不太合理。 - Brian
2
如果您需要将文本适配到已知大小的框中,则最好实际使用 sp 作为块大小(而不是用于文本的 dp)。 - Dmitry Zaytsev
我刚刚添加了一个关于@DmitryZaitsev的编辑 - 我最近使用的技术是在我的TextView或框上使用minHeight,然后仍然在文本本身上使用sp。这应该是一种更好的通用方法,可以处理更多情况(例如,多行文本溢出)。 - Sam

7
使用“sp”单位是文本推荐的,因为在ICS及以上版本中(也可能是Honeycomb,如果我错了请纠正),用户的字体大小有偏好设置。所以,如果您使用Gingerbread或更低版本,则无法找到此设置。
该偏好设置位于“设置”、“显示”、“字体大小”下。还有一个选项在“设置”、“无障碍性”、“大号文字”下。
关于如何使用“sp”的问题,需要注意默认情况下(未更改任何字体大小偏好设置),“1sp”等同于“1dp”(此前介绍了它们之间的等价性)。就像您指出的那样,设计用于用户具有巨大文本的情况可能需要您假设某些内容需要滚动,而您可能不会预期这种情况。

其实我认为在Honeycomb很久以前我就看到过“sp”单位,所以我认为它早就可用了。 - android developer
1
他谈到的是终端用户文本大小偏好设置在3.0+中可用,而不是“sp”单位。自API 1以来就一直存在。 - Cat
正如Joseph Earl所提到的,这并不适用于所有设备(可能是我找不到它的原因)。 - Sam
没错,这个单元在较早的版本中是存在的,但我相信这个偏好设置是后来引入的。 - wsanville

1
答案在于全面地看待这个问题。
使用“sp”作为字体大小的动机在于给开发者控制布局的能力,以应对用户在其设备上更改字体大小的情况。
例子:
让我们看两种极端情况:
1)用户选择字体大小“小”
我的布局如下所示:

http://postimg.org/image/kiyqeo2bh/

这是布局的XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="16dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
tools:context=".MainActivity"
android:orientation="vertical">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_row="0"
    android:layout_column="0"
    android:text="Material-Design ist die Scheiße"
    android:textSize="18sp"
    android:background="#ffff0000" />
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_row="0"
    android:layout_column="0"
    android:text="Material-Design ist die Scheiße"
    android:textSize="25sp"
    android:background="#ffff0000" />

2)如果用户选择字体大小为“巨大”:

这是我的布局样式:

http://postimg.org/image/d7rax9wob/

在情况1)中,我的布局XML与上面相同。

因此,正如您所看到的,在情况2)中,顶部TextView的字体大小在sp中有点完美,因为它不会在字体大小范围(小到巨大)的整个范围内换行。但是底部TextView会完全破坏您的布局/设计。

因此,作为开发人员,您可以迭代并决定在sp中适用于您的设计的大小,而Android将为您绘制它。


如果屏幕更窄会怎样? - Sam
嗨@Sam。我们可以为较窄的屏幕定义单独的布局。您可能在浏览大量文档时遇到了此页面 :) - http://developer.android.com/training/multiscreen/screensizes.html。上面的示例是针对给定大小的,并指出“sp”是与分辨率无关的单位。因此,假设我们想要在两个尺寸相同但分辨率不同的设备上显示单词“Lizzy”-一个设备的分辨率是另一个设备的两倍。在低分辨率设备上,如果Lizzy水平占据2厘米-在高分辨率设备上也将占用相同的空间。 - dessertcook
抱歉,是的,我已经多次查阅了所有文档 - 我有点在寻求更多信息,因为仅仅在你的示例中迭代 SP 是不够的,你还需要考虑你的屏幕尺寸(也许还要考虑本地化!) - Sam
两张图片都是无效链接。 - Jcorretjer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接