如何在不同的屏幕尺寸和密度下保持 TextView 中的文本大小一致?

Posted

技术标签:

【中文标题】如何在不同的屏幕尺寸和密度下保持 TextView 中的文本大小一致?【英文标题】:How do I keep Text Size in TextView consistent over different screen sizes and densities? 【发布时间】:2020-07-07 22:24:20 【问题描述】:

我已经阅读了很多关于此的问答,但都没有奏效。它们很可能已经过时了。当然有一个简单的解决方案。我正在开发一个静态图片背景的 UI(尽管缺少密度桶,但它可以在所有设备上很好地缩放),TextViews 布局在背景上(参见图片)。

    看起来不错:

    看起来不太好:

我尝试过以多种不同方式布置文本,目前是从中心(有一个名为 centerdot 的不可见图像,因为我不确定如何布置距中心的像素距离)。我试过spdp 他们都有同样的反应。我只希望我的文本与图像一致。如果可以解决问题,我可以使用按钮代替,但我也不确定如何做到这一点。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:background="#000000"
    tools:context=".Main2Activity">

    <TextView
        android:id="@+id/mpView"
        android:layout_
        android:layout_
        android:layout_marginTop="208dp"
        android:layout_marginEnd="52dp"
        android:autoSizeTextType="none"
        android:onClick="mpRanges"
        android:text="@string/mp"
        android:textColor="#FFFFFF"
        android:textSize="30sp"
        android:textStyle="bold"
        app:layout_constraintEnd_toStartOf="@+id/centreDot"
        app:layout_constraintTop_toTopOf="@+id/centreDot" />

【问题讨论】:

文字大小对我来说似乎一致,问题在于背景中的图像 如果文字是图像的一部分,它会相应地缩放。 我希望所有十个不同的 与背景中的 一起缩放。显然第二张图片中的文字更大,我如何缩小它以使其适合背景 就像在第一张图片中一样? 【参考方案1】:

如果您的图像在 dp 中未按特定大小固定,则无法使用固定 dp 值设置 TextView 位置。

假设您的图片宽度为 100 像素,并缩放至设备宽度。

在一台设备上显示宽度为 200dp,因此 100 像素的图像缩放为 200dp。 在另一台设备上,显示宽度为 400dp,因此 100px 缩放为 400dp。 现在让我们计算 dp 中的图像中心:在第一种情况下是 100dp,在第二种情况下是 200dp!这就是为什么你不能让它在所有设备上看起来都很好。

要解决此问题,您需要创建自定义 ViewGroup(可能是 FrameLayout 的子级)。在运行时,您将能够获得真实的图像大小并计算所有 TextView 相对于您的图像的位置。似乎您甚至不需要实现onMeasure()和onDraw(),只需onLayout()。

创建自定义视图的官方文档:https://developer.android.com/guide/topics/ui/custom-components。但也许你会通过谷歌搜索“android create custom viewgroup”或类似的东西找到更好的解释文章。

-

我仍然更喜欢我的第一个答案,但会添加另一个答案:也许您将能够通过 ConstraintLayout 中的百分比定位来做您需要的事情。您可以使用 layout_constraintGuide_percent 为图像上的每个点(垂直和水平)创建指南并将 TextView 粘贴到它。 0.2 和 0.5 - 将此值替换为图像中点中心的百分比位置。

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_>

<androidx.constraintlayout.widget.Guideline
    android:id="@+id/gd1"
    android:layout_
    android:layout_
    android:orientation="horizontal"
    app:layout_constraintGuide_percent="0.2" />

<androidx.constraintlayout.widget.Guideline
    android:id="@+id/gd2"
    android:layout_
    android:layout_
    android:orientation="vertical"
    app:layout_constraintGuide_percent="0.5" />

<TextView
    android:layout_
    android:layout_
    app:layout_constraintBottom_toBottomOf="@id/gd1"
    app:layout_constraintEnd_toEndOf="@id/gd2"
    app:layout_constraintStart_toStartOf="@id/gd2"
    app:layout_constraintTop_toTopOf="@id/gd1" />

【讨论】:

这解决了这个问题。我没有考虑 FrameLayout,而且我在使用 ConstraintLayout 时遇到了麻烦,因为我不熟悉指导线小部件。在测试了这两种解决方案之后,我使用了 ConstraintLayout 并将 ImageView 用于圆形而不是 TextView 用于可点击文本。好多了。感谢您发布这些解决方案! @AcesUp 很高兴为您提供帮助!如果真的有帮助,请采纳答案【参考方案2】:

您可以使用this library,这将在不同的屏幕尺寸下保持相同的字体大小。

【讨论】:

以上是关于如何在不同的屏幕尺寸和密度下保持 TextView 中的文本大小一致?的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 上针对不同的屏幕尺寸和密度重用可绘制图像

Android 屏幕适配

第一行代码--笔记

Android官方开发文档Training系列课程中文版:多样屏幕之支持不同的屏幕密度

Android应用程序支持不同屏幕(尺寸密度)

如何让 Flutter 小部件适应不同的屏幕尺寸