文本大小和不同的安卓屏幕大小

我知道,这个问题已经讨论过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 中,它看起来是这样的:

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

328189 次浏览

我通过尺寸和绘制类似的内容(使用 dp,但只针对文本和 draText ())执行了相同的操作

XML:

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

密码:

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

我认为你可以为每个屏幕尺寸添加多个布局资源,例如:

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

参考文献: Http://developer.android.com/guide/practices/screens_support.html

@ 瓷娃娃,我想你需要检查一下这个 用于设计的 Google IO PDF。在这个 pdf 文件中,你可以看到第77页,在那里你可以找到如何建议在不同的 android 设备上使用营养素.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

例如,您已经在值中使用了如下维度.xml。

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

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

注意: 正如@espinchi 所指出的那样,自 Android 3.2以来,小、正常、大和 xlarge 已经被弃用,支持以下选项:

为 Android 3.2声明平板布局

对于第一代运行 Android 3.0的平板电脑来说, 声明平板电脑布局的方法是将它们放在一个包含 配置限定符(例如 res/layout-xlarge/) 以配合其他类型的平板电脑及屏幕尺寸ー 特别是7英寸的平板电脑ーー Android 3.2引入了一种新的方法来指定 更离散的屏幕大小的资源。新技术是基于 根据布局需要的空间大小(例如600dp 的宽度) , 而不是试图使您的布局适合通用的大小组 (如大型或 xlarge)。

为7寸平板电脑设计的原因是棘手的,当使用 广义尺寸组是指7英寸的平板电脑在技术上是一样的 组为一个5“手机(大组)。而这两个设备是 看起来彼此的大小很接近 应用程序的 UI 明显不同,用户的风格也不同 因此,一个7英寸和5英寸的屏幕不应该总是使用相同的 使您可以提供不同的布局 这两种屏幕,Android 现在允许你指定你的 基于宽度和/或高度的布局资源 可用于应用程序的布局,以 dp 单位指定。

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

你要么选择一个宽度,设计成你的最小尺寸, 或测试布局支持的最小宽度是多少 完整。

注意: 请记住,这些新大小 API 使用的所有数字都是 密度无关的像素(dp)值和布局尺寸 也应该始终使用 dp 单位定义,因为您关心的是 关于系统之后可用的屏幕空间量 说明屏幕密度(而不是使用原始像素 有关与密度无关的像素的详细信息,请参阅, 阅读本文前面的术语和概念。使用新的大小 资格赛

可以根据它指定的不同资源配置 表2总结了可用于布局的空间 新的限定符提供了对特定屏幕大小的更多控制 与传统的屏幕大小相比,您的应用程序支持 组(小组、正常组、大组和 xlarge 组)。

注意: 使用这些限定符指定的大小不是 实际屏幕大小。相反,这些大小适用于 你的活动窗口可用的 dp 单位 系统可能会使用一些屏幕作为系统 UI (例如系统 在屏幕底部的状态栏或在顶部的状态栏) ,所以一些 屏幕的大小可能不适用于您的布局 你的声明应具体说明你所需的尺寸 Activity ー系统占用系统 UI 在以下情况下使用的任何空间 声明它为您的布局提供了多少空间 操作栏被认为是应用程序窗口的一部分 空间,尽管您的布局没有声明它,所以它减少了 可用于布局的空间,并且必须在您的 设计。

表2. 屏幕大小的新配置限定符(在 屏幕配置限定符值描述 最小宽度

例如: sw600dp sw720dp

屏幕的基本尺寸,由最短的屏幕表示 可用屏幕面积的尺寸。具体来说,该设备的 SmallestWidth 是屏幕可用高度中最短的,并且 宽度(你也可以认为它是“最小可能的宽度”为 您可以使用这个限定符来确保,无论 屏幕的当前方向,您的应用程序的至少有 可用于其 UI 的宽度 dps。

例如,如果布局要求其最小维度为 屏幕面积在任何时候都至少600点,然后你可以使用这个 限定符来创建布局资源,res/lay-sw600dp/ 系统只会在下列情况下使用这些资源: 可用的屏幕是至少600dp,无论是否600dp 边是用户感知的高度或宽度 设备的固定屏幕尺寸特性; 设备的 当屏幕的方向改变时,smallestWidth 不会改变。

设备的最小宽度考虑到屏幕装饰 和系统用户界面。例如,如果设备有一些持久的用户界面 属性的轴占用空间的屏幕上的 SmallestWidth,系统声明 smallestWidth 更小 比实际的屏幕大小,因为那些是屏幕像素不 可用于你的用户界面。

这是广义屏幕大小限定符的一种替代方法 (小的,普通的,大的,xlarge) ,它允许您定义一个离散的 可用于 UI 的有效大小的数字 SmallestWidth 来确定一般屏幕大小是有用的,因为 宽度通常是设计布局的驱动因素 通常垂直滚动,但对 它水平方向需要的最小空间。可用的宽度也是 关键因素,以确定是否将单窗格布局用于 手机或平板电脑的多窗格布局。因此,你可能最关心 关于每个设备的最小可能宽度。 可用屏幕宽度

示例: w720dp w1024dp

指定资源所在的 dp 单位中的最小可用宽度 应该使用ーー由值定义。系统对应的 当屏幕的方向切换时,宽度的值发生变化 之间的景观和肖像,以反映当前的实际宽度 你的用户界面可以使用。

这通常有助于确定是否使用多窗格布局, 因为即使是在平板电脑上,你通常也不会想要同样的东西 多窗格布局的纵向方向,正如您所做的横向。 因此,您可以使用它来指定 布局,而不是同时使用屏幕大小和方向 可用的屏幕高度

例如: h720dp h1024dp 等。

指定资源所在的 dp 单位中的最小屏幕高度 应该使用ーー由值定义。系统对应的 当屏幕的方向切换时,高度变化的值 在风景和肖像之间,以反映当前的实际高度 你的用户界面可以使用。

使用此方法定义布局所需的高度在 与 wdp 相同的方法是定义所需的宽度,而不是 使用屏幕大小和方向限定符 考虑到 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/lay/main _ activity.xml # 用于手机 Res/lay- sw600dp/main _ activity.xml # 用于平板电脑

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

对于其他需要进一步将 UI 自定义为 区分大小,如7“和10”片,你可以定义 附加最小宽度布局:

Res/lay/main _ activity.xml # 用于手机(小于 600dp 可用宽度) res/lay- sw600dp/main _ activity.xml # For 7” 平板电脑(600dp 宽和更大) res/lay- sw720dp/main _ activity. xml

适用于10寸平板电脑(720dp 宽和更大)

注意,前两组示例资源使用 “最小宽度”限定符 swdp,它指定 屏幕的两边,不管设备的电流 因此,使用 swdp 是指定 通过忽略屏幕的整体大小可用于您的布局 定位。

但是,在某些情况下,什么对您的布局可能是重要的 当前可用的宽度或高度。例如, 如果您有一个包含两个并排片段的双窗格布局,则 当屏幕提供至少600dp 的 宽度,设备是横向还是纵向 在这种情况下,你的资源可能是这样的:

Res/lay/main _ activity.xml # 用于手机(小于 600dp 可用宽度) res/lay- w600dp/main _ activity.xml # 多面板(任何可用宽度为600dp 或更高的屏幕)

注意,第二个集合使用了“可用宽度”限定符, 这样,一个设备实际上可以同时使用两种布局,这取决于 在屏幕的方向(如果可用的宽度至少是 一个方向600dp,另一个方向小于600dp 定向)。

如果可用高度是您关心的问题,那么您也可以这样做 或者,甚至将 wdp 和 hdp 合并 如果您需要非常具体的限定符。

不要硬编码的大小。

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

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

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

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

正如3.2(API 级别13)中提到的@espinchi,不推荐使用大小组。 屏幕大小范围 是未来最受欢迎的方法。

我认为现在回复这个帖子已经太晚了。但我想分享我的想法或方法来解决文本大小问题的差异分辨率设备。许多 Android 开发者站点建议我们必须使用 (英语)单元来处理文本大小,这将处理不同分辨率设备的文本大小。但我总是得不到想要的结果。因此,我已经找到了一个解决方案,我使用从我的最后4-5项目及其工作良好。根据我的建议,您必须为每个分辨率设备放置文本大小,这是有点单调乏味的工作,但它将满足您的要求。每个开发人员都必须了解像 < em > 4:6:8:12(h: xh: xxh: xxh: xxxh) 这样的比例。现在,在您的项目 保留意见文件夹中,您必须创建4个带有 dimens 文件的文件夹,例如。

  1. Res/value-hdpi/
  2. Res/value-xhdpi/
  3. Res/value-xxhdpi/ xml
  4. Res/value-xxxhdpi/ xml

现在,您必须将文本大小放置到 iments.xml 文件中。我正在向您展示 值-hdpi的代码,类似地,您必须放置其他分辨率值/量纲.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. Xxhdpi: 36px

这是为所有分辨率实现所需文本大小的简单解决方案。我在这里不考虑 价值-mdpi分辨率设备。如果任何人想包括这个分辨率的文本大小,然后定额是像 3:4:6:8:12。有任何疑问请告诉我。希望能帮到你们。

统一所有屏幕以显示包括字体大小在内的相同元素大小: - 设计一个屏幕尺寸的用户界面,在设计过程中使用你认为合适的尺寸,例如,TextView 字体大小在默认屏幕尺寸下为14dp,4’6英寸。

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

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

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

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

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

一开始可能有点棘手,但是一旦你找到了公式,就完全达到了目标。使用这种方法,你不需要为了适应不同的屏幕尺寸而制作多种布局。

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

Https://github.com/intuit/sdp

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

为此,你必须使 android:layout_width = 0dp, 和 android:layout_width = (任何你想要的) ;

如果你有 API 26,那么你可以考虑使用 AutoSizeTextType:

<Button
app:autoSizeTextType="uniform" />

默认设置允许在水平和垂直轴上均匀地自动调整 TextView 比例。

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

我知道现在很晚了,但这可能会帮到某人。

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

仅此而已。