Android:如何设置相对于 PercentLayout/ConstraintLayout 的文本字体大小

标签 android android-layout textview

想象一个具有百分比布局的 Activity,以便在屏幕中央绘制一个完美的正方形,填满屏幕。 (因此,如果您的 Pixel XL 手机具有 1440x2560 屏幕,这将是手机中心有一个完美正方形的 Activity ,1440px x 1440px)。请注意,无论显示方式如何(手机、平板电脑、 watch 和电视),它都应该始终是手机中央的一个正方形。

这很容易使用 PercentRelativeLayout (API 23) 或使用 layout_constraintGuide_percent 的 ConstraintLayout 来完成。而且这种技术几乎可以应用于任何 View 。太好了。

但是,我们应该如何对文本做同样的事情呢?例如,如果您希望“Applesauce”一词在该框的中心显示在任何显示器上都以相同的百分比显示。有没有办法设置字体大小来模仿这种行为。要说字母高度应该始终是它容器的 10%,还是屏幕像素宽度/高度的 10%?


我认为这不是该框内的自动填充或自动调整文本以适合。 (即,不尝试做 https://developer.android.com/preview/features/autosizing-textview.html )。我认为这行不通,因为这意味着将“Hi”这个词放在框中会使它比同一个框中的“Applesause”这个词更大。我希望文本大小相对于自身始终保持不变,但相对于它的容器进行缩放。

使用 DP/DIP/SP 设置文本大小是行不通的,因为它会根据物理尺寸进行缩放,这对于大多数正常用例来说非常有用,但与我们在这里想要完成的完全相反。文本相对于布局的大小应始终相同,即使这违背了所有理智的易读性,即使这不尊重用户的字体设置。


现在,我可以做一些数学运算来粗略地计算出接近文本大小的特定像素值。 (即,字体在 720px 宽屏幕上应为 30px,在 1440px 屏幕上应为 60px)。但是我无法让它与 DPI 值一起使用。 Android 试图变得“太聪明”,并且在 TVDPI 屏幕上绘制 30px 字体与在 HDPI 屏幕上绘制 30PX 字体不同,即使它们的像素宽度相同。


我不确定如何在 Android 上完成此操作。但在 Windows UWP XAML 上,这是通过将字体硬编码到布局,然后使用 <Viewbox Stretch="Uniform"> 来完成的。 ,这将以像素完美的精度调整子视口(viewport)的大小。在使用 CSS3 的 Web 浏览器中,您可以使用 Viewport Sized Typography (1vmin, 1vmax) 执行此操作,这不是相同的行为,但对于大多数用途来说已经足够接近了。

我的问题是,使用 native Android TextView 执行此操作的合适方法是什么?

最佳答案

很难做到像你说的那样。

sp 单元 https://material.io/guidelines/layout/units-measurements.html#units-measurements-scaleable-pixels-sp ,它是这样工作的(如 dp)。 如果你有更多的 px,你会得到更多相同大小的 px。

您可以自己获取,获取 View /窗口的宽度并根据该宽度计算您的字体大小。

val width = resources.displayMetrics.widthPixels
val defaultWidth = 100 //px
val defaultFontForDefaultWidth = 2 //px So for a window 100px you get a 2px font (it's an example)
val fontSize = (width * defaultFontForDefaultWidth) / defaultWidth

但我很确定,这就是机器人用 dp 做的事情。您设置 2dp,当屏幕变大时,它会变大或缩小时变大。

希望对你有帮助

关于Android:如何设置相对于 PercentLayout/ConstraintLayout 的文本字体大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45643537/

相关文章:

android - classes.jar 没有在 .aar 文件中生成

java.lang.NullPointerException 第 53 行

android - Instant App 无法下载完整的应用程序 | Google Play 认为应用已安装

android - 无法在 ListView 中显示项目图像

java - 在 TextView 中显示数组元素

Android:在 ListView 中无限滚动到顶部

android - 在背景边框的左上角带有提示的圆角矩形背景编辑文本

android - 如何在 ScrollView 中滑动垂直的 SeekBar

android - App Widget 上的 Marquee TextView

swiftui - 如何根据textview内容管理Scrollview Height Swiftui