根据设备大小调整字体大小

29

我计划在不同设备上使用不同的字体大小,以使文字清晰易读。我已决定不为不同设备使用不同的布局,并建立了一个通用布局以适应所有设备。现在唯一的问题是文本大小。

问题:

  1. 请提供您在基于设备尺寸(物理尺寸)调整字体大小方面的技术建议。

  2. 如何根据纵横比确定字体大小。

  3. 使用这种方法有哪些缺陷?

文本视图的 XML 代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ffffff"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tvValue4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="I planned to use different font size for the textview on different device size so as to make the letters legible. I have already decided not to use different layouts for different devices and built a common layout to fit in all the devices. Now the only problem is on the text size."
        android:textColor="#000000"
        android:textSize="15sp" />

</LinearLayout>

提前致谢

8个回答

28

是的,这种方法存在缺陷。Android设备有不同的尺寸,但它们的密度也可以非常不同。

图片描述

你应该只需遵循Android设计的最佳实践

图片描述

它们其实已经考虑得非常周到了。为什么要重新发明轮子呢?


请查看我使用了15dp的textview的屏幕截图。但是在不同的设备上,它显示为不同行数。我需要所有屏幕都有相同数量的行。如果屏幕尺寸小,则字体必须小,如果屏幕尺寸大,则字体必须变大。请提出您的建议。 - iappmaker
dp是密度无关像素,对应于在160dpi下一个物理像素的大小。sp也是基本单位,但根据用户首选的文本大小进行缩放(它是一个比例无关的像素),因此在定义文本大小时应使用此测量单位(但永远不要用于布局大小)。请参阅http://developer.android.com/training/multiscreen/screendensities.html。 - CrandellWS

23

尝试这个,在您的 xml 中添加此属性。它将根据屏幕大小调整文本大小,试一下吧。

 style="@android:style/TextAppearance.DeviceDefault.Medium"

10
可从 API 14 起使用。我正在使用最低 API 8。 - iappmaker
1
我应该把这个放在哪里?是在父布局中还是组件中? - Lasitha Lakmal

5

在字体大小方面,请使用缩放像素(sp)。Android会根据设备密度相应地调整字体大小。上述帖子有更好的解释和理由。


7
我改成了sp,但问题仍然存在。基本上,我需要使此TextView在所有设备中占据相同的屏幕百分比,并填充文本。 - iappmaker
你是通过编程方式还是从XML设置字体大小的? - bostan
1
尝试通过计算设备密度和要设置的适当字体大小来以程序化方式执行此操作。 int height =(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,<HEIGHT>,getResources()。getDisplayMetrics()); 您还可以检查Complex_unit_sp。 - bostan
1
int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, <HEIGHT>, getResources().getDisplayMetrics());你可以设置适合测试的任何<HEIGHT>。例如:textView.setTextSize(height); - bostan

2
    String s= "hello";
    TextView tv= (TextView) findViewById(R.id.tv);
    Spannable span = new SpannableString(s);
    span.setSpan(new RelativeSizeSpan(5f), 0, span.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    tv.setText(span);

根据屏幕大小将5f更改为您想要的任何值。

http://developer.android.com/guide/practices/screens_support.html。在最佳实践标题下检查主题。


这与tv.setTextSize(size)有何不同? - iappmaker
你可以在TextView中为特定的单词设置文本大小。如果你不需要整个文本使用相同字体大小,那么你可以使用这个功能。例如,如果你有两个单词"Hello World",你可以增加"Hello"的字体大小而保持"World"的大小不变。 - Raghunandan
1
相对大小跨度构造函数所接受的值(5f)如何转换为sp?它将是多少sp?或者我该如何计算它? - Goran Horia Mihail
@GoranHoriaMihail,您可以查看RelativeSpan的源代码。此外,这个答案并不高效,但是很久以前就已经回答了。http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.0_r1/android/text/style/RelativeSizeSpan.java - Raghunandan

1

0

Android内置了这些功能- dp和sp。dp是设备像素。基本上,1dp=1/160英寸。这允许您以实际尺寸指定字体的高度。Sp是缩放像素。此大小根据默认字体大小进行缩放,因此用户可以放大系统字体,而您的应用程序将与之匹配。对于需要大号文本的视力问题患者非常方便,同时不会占用其他人的屏幕空间。

您应该使用其中之一。


请查看我使用了15dp的textview的屏幕截图。但是在不同的设备上,它显示为不同行数。我需要所有屏幕都有相同数量的行。如果屏幕尺寸小,则字体必须小,如果屏幕尺寸大,则字体必须变大。请提出您的建议 - iappmaker - iappmaker
2
dp(或dip)是设备无关像素,而不是“设备像素”。请参见http://developer.android.com/guide/topics/resources/more-resources.html#Dimension 您关于每英寸160个点和其他所有内容的其余部分基本上是正确的。我只是有点迂腐。 - Stephan Branczyk

0

对于这个问题,我在很多项目中都使用了以下库,并且认为它非常棒。不需要担心屏幕。但是你需要为选项卡创建单独的布局。

https://github.com/intuit/sdp


这更适合作为注释。 - BlackBeard

0
根据屏幕尺寸调整字体大小
public static void applyFont(TextView tv, Float fontSize) {
    tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize * fontFactor);
}

public static float fetchFontFactor(Activity act) {

    DisplayMetrics displayMetrics = new DisplayMetrics();

    act.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);

    float returnFactor = ((float) displayMetrics.widthPixels ) / 1280.0f;

    return returnFactor;
}

在MainActivity.java中,我有以下内容:
fontFactor = fetchFontFactor(this);

现在的问题是,我的代码中的1280是什么意思。
答案是这只是设计师提供的设计的宽度。例如,如果设计师提供了一个尺寸为1080x1920的设计,你可以用1080替换1280。
所以,如果设计中有一个字体大小为55,我们可以按照以下方式使用55。
applyFont(titleTV, 55f);

这适用于任何方向...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接