想象一下具有百分比布局的活动,以便在屏幕中央绘制完美的正方形,填充屏幕。 (所以,如果你的Pixel XL手机配有它的1440x2560屏幕,这将是一个活动,在手机中央有一个完美的正方形,1440像素×1440像素)。请注意,无论显示屏(电话,平板电脑,手表和电视)如何,它都应始终位于手机中央的正方形。
使用PercentRelativeLayout(API 23)或使用layout_constraintGuide_percent的ConstraintLayout很容易实现。这种技术几乎可以应用于任何视图。这一切都很棒。
但是,我们应该如何对文本做同样的事情呢?例如,如果你想要" Applesauce"在任何显示器上以相同的百分比缩放框。有没有办法设置字体大小来模仿这种行为。要说字母高度应该总是说,它的容器的10%,或者屏幕像素的宽度/高度的10%?
我认为这个框中的不是自动填充或自动调整文本是合适的。 (即,不试图https://developer.android.com/preview/features/autosizing-textview.html)。我认为这不会起作用,因为这意味着要说出“#34;嗨"在框中会使它大于" Applesause"在同一个盒子里面。我希望文本大小始终保持相对于自身的大小,但要相对于它的容器进行缩放。
使用DP / DIP / SP设置文本大小不会起作用,因为它可以根据物理尺寸进行缩放,这对于大多数正常使用情况都很好,但与我们想要在此完成的操作完全相反。文本应该始终与布局相同,即使这违反了所有理智,即使不尊重用户字体设置。
现在,我可以做一些数学计算大致特定的文本大小的像素值。 (即,在720px宽屏幕上应该是30px的字体,在1440px屏幕上应该是60px)。但是我无法使用DPI值来解决这个问题。 Android正试图变得太聪明了,并且在TVDPI屏幕上绘制的30px字体与HDPI屏幕上的30PX字体不同,即使它们的像素宽度相同。
我不确定如何在Android上完成此操作。但是在Windows UWP XAML上,这是通过将字体硬编码到布局,然后使用<Viewbox Stretch="Uniform">
来实现的,这将以像素完美的精度调整子视口的大小。在使用CSS3的Web浏览器中,您可以使用Viewport大小的排版(1vmin,1vmax)执行此操作,这不是相同的行为,但对于大多数用途而言足够接近。
我的问题是,使用原生Android TextViews的合适方法是什么?
答案 0 :(得分:1)
很难像你说的那样做。
sp 单元https://material.io/guidelines/layout/units-measurements.html#units-measurements-scaleable-pixels-sp,它正在工作(作为 dp )。 如果您有更多 px ,则会获得更多相同大小的px。
您可以自己动手,获取视图/窗口的宽度,并按此宽度计算字体大小。
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,当屏幕变大时,它会变大或缩小时缩小。
希望这有帮助