Android将TextView文本大小设置为在所有屏幕大小上都相同
我有一个方形LinearLayout,其中包含其他一些LinearLayouts
,其中包含ImageViews
和TextViews
.用户更改布局内容后,我将布局内容另存为png文件.所有图像和文本都使用常规的gravity和layout_gravity值进行排列.这是一个小样本:
I have a square LinearLayout containing a few other LinearLayouts
with ImageViews
and TextViews
inside. I am saving the layout content as png file after the user changes it. All the Images and Texts are being arranged using the general gravity and layout_gravity values. Here is a small sample:
这是我的问题:我希望SAMPLE TEXT在所有屏幕尺寸上看起来都完全相同,无论是480p的电话还是1200p的平板电脑.最初,我认为在SP
中设置文本大小就足够了,但事实并非如此,因为随着屏幕分辨率变大,文本变小.
Here is my problem: I want the SAMPLE TEXT to look exactly the same size on all screen sizes, being a phone of 480p or a tablet of 1200p. Initially I thought that setting the text size in SP
will be enought but it is not, because as screen resolution gets bigger, the text gets smaller.
所以我的问题是,如何以编程方式设置文本大小,使其看起来完全相同,而与屏幕宽度无关.如您所见,父布局将始终是正方形.
So my question is, how can I programatically set the text size so it will look exactly of the same size, independent of screen width. As you can see the parent layout will always be a square.
我尝试以编程方式设置SP或使用比例因子.
I tried programatically setting SP or using a scale factor.
float scale = 0;
if (screenWidth == 720) {
scale = 1;
} else {
scale = (720 - screenWidth) * 100.2f / screenWidth;
}
float defaultSizeFor720 = 35f;
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, defaultSizeFor720 * scale);
它不起作用.随着屏幕变大,文本变小,但不像仅使用SP时那样小,但仍然如此.我也尝试了其他问题的大多数答案,但仍然没有用. 有什么想法吗?
It does not work. as screen gets bigger, text gets smaller, not as small as when only using SP alone, but still. I also tried most of the answers from other questions but still did not work. Any ideas?
我发现的唯一可靠的方法是:
The only reliable method I found was:
- 具有默认屏幕尺寸的文本高度
- 根据当前屏幕尺寸缩放此文本高度
-
在文本大小中找到最佳匹配以适合所需的高度
- have a text height for a default screen size
- scale this text height based on current screen size
find the best match in text size to fit the needed height
float DEFAULT_SCREEN_WIDTH = 720f;
float TEXT_HEIGHT = 50f;
float sizeLine1 = (screenWidth * TEXT_HEIGHT) / DEFAULT_SCREEN_WIDTH;
Rect bounds = new Rect();
int textSize = 1;
while (bounds.height() < sizeLine1) {
textSize++;
txtLine1.getPaint().setTextSize(textSize);
txtLine1.getPaint().getTextBounds("test", 0, "test".length(), bounds);
}
可能不雅致或高效,但是可以接受并且确实有效.平板电脑1200p和480p手机之间存在细微的差异,但就我而言,这是可以的.
Might not be elegant or efficient, but it is acceptable, and does work. There are minor differences between tablet 1200p and 480p phones, but these are OK in my case.