想象一个具有百分比布局的 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/